Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Section '.reloc' fixups data readable discardable
Хорошо видно, что текст для DLL -библиотеки является действительно обычным файлом ассемблера. Есть все, даже имя точки входа, указываемое в последней директиве END. Но здесь и начинаются странности. На самом деле это не обычная точка входа, которую мы привыкли указывать в любой программе на ассемблере, а адрес команды в DLL -библиотеке, получающей управление в строго определенных случаях. Эта команда является первой в цепочке команд, составляющих так называемый код инициализации DLL -библиотеки. Назначение этого кода — выполнить необходимые действия по инициализации DLL-библиотеки при наступлении определенных событий. Его наличие необязательно, и при его отсутствии нет необходимости указывать соответствующую метку в заключительной директиве END. Если все же код инициализации присутствует в DLL-библиотеке, то он должен быть разработан с учетом определенных требований. Во-первых, этот код должен быть рассчитан на то, что он получает управление в одном из четырех случаев. О наступлении каждого из этих случаев операционная система извещает DLL -библиотеку путем передачи ей одного из четырех предопределенных значений — флагов. Рассмотрим данные флаги и возможные действия при их поступлении в DLL-библиотеку. DLL _ PROCESS _ ATTACH = 1 — передается операционной системой DLL-библиотеке при проецировании последней в адресное пространство процесса. Передача этого флага производится всего один раз, обычно при загрузке приложения, использующего данную DLL-библиотеку. Если позже другой процесс попытается загрузить ту же библиотеку, то система попросту увеличит ее счетчик использования без посылки флага DLL _ PROCESS _ ATTACH. Получив данный флаг, DLL -библиотека должна выполнить действия по созданию необходимой среды функционирования для своих процедур. Например, обеспечить их кучей. DLL _ THREAD _ ATTACH = 2 — передается операционной системой DLL -библиотеке при создании нового потока в процессе. Этим библиотеке предоставляется возможность нужным образом обработать факт создания нового потока. Следует иметь в виду, что описываемое действие не является обратимым, то есть если DLL-библиотека загружается в процесс, когда в нем уже функционируют потоки, то ни одному из них не посылается флаг DLL _ THREAD _ ATTACH.
DLl _ THREAD _ DETACH - 3 — передается операционной системой DLL -библиотеке при выгрузке потоком DLL -библиотеки. DLL _ PROCESS _ DETACH - 0 — передается операционной системой DLL -библиотеке при выгрузке DLL -библиотеки из адресного пространства процесса. Логично, что при этом требуется провести завершающие действия по освобождению всех ресурсов, которыми владеет DLL -библиотека. Обычно эти действия являются обратными по отношению к предпринятым при инициализации. Во-вторых, имя точки входа DLL -библиотеки может быть любым, но уникальным в пределах одной DLL. В-третьих, оформление кода инициализации в виде отдельной процедуры необязательно. Главное, выполнить два основных действия кода инициализации DLL-библиотеки (при его наличии): вернуть единицу в регистре ЕАХ; удалить из стека три параметра, которые передаются DLL -библиотеке при передаче описанных выше флагов: hlnstDLL — дескриптор DLL -библиотеки, назначенный ей системой при загрузке библиотеки в адресное пространство процесса; fdwReason — значение флага, передаваемого в DLL -библиотеку; lpvReserved — параметр не равен 0, если библиотека загружена неявно, и равен 0 в противном случае. Структура полного варианта кода инициализации выглядит так:
Format PE GUI 6.0 DLL Entry DllEntryPoint include 'win32a.inc' Section '.data' data readable writeable DllState db 'Состояние библиотеки DLL ',0 DllStart db 'Загружена',0 DllStop db 'Выгружена',0
|
|||||
Последнее изменение этой страницы: 2021-07-18; просмотров: 65; Нарушение авторского права страницы; Мы поможем в написании вашей работы! infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.218.70.93 (0.006 с.) |