Пишу упаковщик дров. Интересная ситуация: 1. загружаю оригинальный драйвер, имею следующую запись в списке модулей: 2. Загружаю упакованный образ, и там ключевая проблема в InMemoryOrderLinks : _LIST_ENTRY [ 0xffffffff - 0xffffffff ] изза этой хрени, RtlIsValidHandler возвращает 0, но при этом, внутренний вызов RtlLookupFunctionTable отрабатывает нормально. (Хандлер SEH 100% внутри образа). В чем может быть соль? - Вернее, из каких соображений в первом случае InMemoryOrderLinks : _LIST_ENTRY [ 0xf9cd6110 - 0x2 ] ?
как я понял, реально эти поля указывают на RUNTIME_FUNCTION, откуда они берутся? Образ 32-х разрядный вроде... просвятите плиз
Код (Text): typedef struct _KLDR_DATA_TABLE_ENTRY { LIST_ENTRY InLoadOrderLinks; PVOID ExceptionTable; ULONG ExceptionTableSize; PVOID GpValue; PNON_PAGED_DEBUG_INFO NonPagedDebugInfo; PVOID DllBase; PVOID EntryPoint; ULONG SizeOfImage; UNICODE_STRING FullDllName; UNICODE_STRING BaseDllName; ULONG Flags; USHORT LoadCount; USHORT __Unused5; PVOID SectionPointer; ULONG CheckSum; } KLDR_DATA_TABLE_ENTRY, *PKLDR_DATA_TABLE_ENTRY;
Да, я уже понял, а не подскажешь, с какого перепуга 32-х разр. образ без каталога эксепшенов получает себе в модулях корректные значения?
Самое лучшее, что ты можешь сделать в данной ситуации, это собрать ядро WRK и запустить его на отладку в виртуалке в Windows Server 2003 SP1. Таким образом ты вживую увидишь, что и как происходит во время загрузки модулей ядра. Если будут попадаться вырезанные моменты (хотя вряд ли), их можно будет подсмотреть в исходниках Windows 2000, она по крайне мере без цензуры. Так ты получишь ответ на этот и, возможно, многие другие сопутствующие вопросы. Удачи.
hlt Выравнивать нужно на 4 линки. Иначе RtlDispatchException() возвратит ошибку, что приведёт к багчеку.