Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Section '.code' code readable executable
Proc DllEntryPoint hinstDLL, fdwReason, lpvReserved cmp [fdwReason], DLL_PROCESS_ATTACH je.start cmp [fdwReason], DLL_PROCESS_DETACH je.stop cmp [fdwReason], DLL_THREAD_ATTACH je.start cmp [fdwReason], DLl_THREAD_DETACH je.stop jmp.stp .start: invoke MessageBox, 0, DllStart, DllState, MB_OK jmp .stp .stop: invoke MessageBox, 0, DllStop, DllState, MB_OK jmp.stp .stp: mov eax, TRUE ret Endp
Proc ShowMessage hWnd local Buffer:DWORD lea eax,[Buffer] invoke MessageBox, [hWnd], [Buffer], NULL, MB_OK ret Endp
Section '.idata' import data readable writeable library user,'USER32.DLL' import user, MessageBox,'MessageBoxA'
Section '.edata' export data readable
export 'MSG.DLL',\ ShowMessage,'ShowMessage', Section '.reloc' fixups data readable discardable
Что касается кода функций (процедур), составляющих DLL -библиотеку, то для их написания используются стандартные правила разработки программ. Описание данных также ничем не отличается от обычной программы ассемблера. Ведь в конечном итоге код и данные процедур DLL -библиотеки оказываются в адресном пространстве процесса наравне с его кодом и данными. Вызов функций из DLL Существует два способа загрузки DLL: а) неявная; б) явная; Рассмотрим неявную загрузку DLL. Для построения приложения, рассчитанного на неявную загрузку DLL, необходимы ссылки на импортируемые идентификаторы. Компоновщик (линкер, редактор связей) формирует загрузочный EXE – модуль. В этом модуле компоновщик помещает также раздел импорта, где перечисляются имена всех необходимых DLL -модулей. Для каждой DLL в разделе импорта указывается, на какие имена функций и переменных встречаются ссылки в коде исполняемого файла. Эти сведения будет использовать загрузчик операционной системы. После запуска EXE -модуля загрузчик операционной системы выполняет следующие операции: 1. Создает виртуальное адресное пространство для нового процесса и проецирует на него исполняемый модуль; 2. Анализирует раздел импорта, определяя все необходимые DLL -модули и тоже проецирует их на адресное пространство процесса. DLL может импортировать функции и переменные из другой DLL. А значит, у нее может быть собственный раздел импорта, для которого необходимо повторить те же действия. В результате на инициализацию процесса может уйти довольно длительное время. После отображения EXE -модуля и всех DLL-модулей на адресное пространство процесса его первичный поток готов к выполнению, и приложение начинает работу.
Недостатками неявной загрузки являются обязательная загрузка библиотеки, даже если обращение к ее функциям не будет происходить, и, соответственно, обязательное требование к наличию библиотеки при компоновке. Явная загрузка DLL устраняет отмеченные выше недостатки за счет некоторого усложнения кода. Программисту приходится самому заботиться о загрузке DLL и подключении экспортируемых функций. Зато явная загрузка позволяет подгружать DLL по мере необходимости и дает возможность программе обрабатывать ситуации, возникающие при отсутствии DLL. В случае явной загрузки процесс работы с DLL происходит в три этапа: 1. Загрузка DLL с помощью функции LoadLibrary (или ее расширенного аналога LoadLibraryEx). В случае успешной загрузки функция возвращает дескриптор hLib типа HMODULE, что позволяет в дальнейшем обращаться к этой DLL. 2. Вызовы функции GetProcAddress для получения указателей на требуемые функции или другие объекты. В качестве первого параметра функция GetProcAddress получает дескриптор hLib, в качестве второго параметра –адрес строки с именем импортируемой функции. Далее полученный указатель используется клиентом. Например, если это указатель на функцию, то осуществляется вызов нужной функции. 3. Когда загруженная динамическая библиотека больше не нужна, рекомендуется ее освободить, вызвав функцию FreeLibrary. Освобождение библиотеки не означает, что операционная система немедленно удалит ее из памяти. Задержка выгрузки предусмотрена на тотслучай, когда эта же DLL через некоторое время вновь понадобится какому-то процессу. Но если возникнут проблемы с оперативной памятью, Windows в первую очередь удаляет из памяти освобожденные библиотеки. Пример текста DLL: Format PE GUI 6.0 DLL Entry DllEntryPoint include 'C:\Users\work\Desktop\fasmw17121\INCLUDE\win32a.inc'
|
|||||
Последнее изменение этой страницы: 2021-07-18; просмотров: 42; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.224.44.108 (0.006 с.) |