Section '.reloc' fixups data readable discardable 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

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 с.)