· Указатель на базу данных модуля, расположенного в куче kernel32.dll в области выше 2 Гб. Благодаря указателю kernel32 может получать информацию о любом модуле не переключаясь в контекст памяти.
· Указатель на полное имя файла из которого был создан модуль. Память под полное имя модуля выделяется.
· Указатель на строку с именем модуля. Этот указатель указывает внутрь предыдущей структуры.
· Число символов в полном имени файла.
· Число символов только в имени файла.
Зачем нужны эти два предыдущих поля? Например, функция GetModuleHandle с помощью указателя просматривает структуры IMTE и для ускорения поиска сравнивает длины запрашиваемого модуля и модуля в очередной структуре IMTE, если длины не совпадают, то сравнивать имена смысла не имеет.
· Число разделов в модуле.
Например, раздел, содержащий данные, программный код и т.д.
· Базовый адрес, по которому был запущен модуль.
· Счётчик ссылок к модулю.
· Счётчик числа ссылок в модуле, например, если какая-то программа была запущена на выполнение три раза, то для этой программы создаётся три объекта ядра процесса и одна база данных модуля.
С помощью структуры MODREF создаётся список модулей для каждого процесса, что позволяет процессам не знать о модулях, загруженных другими процессами.
Структура MODREF создаётся для exe файла и для каждой dll, используемой файлом. Память для каждой MODREF выделяется из кучи kernel32.
Рассмотрим список MODREF для файла my.exe, который использует kernel32.dll и bar.dll.
PDB
my.exe
pModuleTableArray Таблица модулей
MODREF
индекс в IMTE
таблице
my.exe
модулей
Структура MODREF содержит недокументированные поля:
1. Указатель на структуру PDB для обеспечения обратной связи.
2. Индекс в таблице модулей, то есть индекс в глобальной таблице модулей.
3. Указатель на следующую структуру MODREF.
Конец списка обозначается 00000000.
Все модуль-зависимые функции просматривают только структуры MODREF для конкретного процесса. Модуль-зависимые функции:
GetProcAddress(…) – получив идентификатор модуля и идентификатор функции (это её имя или порядковый номер экспорта) возвращает адрес точки входа этой функции.
GetModuleFileName(…) – по идентификатору модуля возвращает полный путь к exe или dll файлам.
GetModuleHandle(…) – по имени файла возвращает идентификатор этого модуля.