Делаю загрузку DLL из памяти. Перед вызовом DllMain делаю RtlAddFunctionTable (передаю туда указатель на FunctionTable самой DLL, размер таблицы, базу DLL в памяти) в результате обработка исключений в DLL не работает. Кто знает куда копать?
Код (Text): BOOLEAN WINAPI RtlAddFunctionTable( __in PRUNTIME_FUNCTION FunctionTable, __in DWORD EntryCount, __in DWORD64 BaseAddress ); Всё ето учитывается?
Да - я сую оригинальную FunctionTable из самой DLL (BaseAddress+ExсeptionDirectory.RVA ). EntryCount = ExсeptionDirectory.Size/12. BaseAddress - база ДЛЛ. Результат RtlAddFunctionTable = TRUE. Такое впечатление что до раскрутки стека дело даже не доходит.
dermatolog Выглядит странно. Единственное, что пока можем предположить при условии корректности кода – раскруточные процедуры в ntdll занимаются какой-нибудь ерундой вроде проверки на [не]принадлежность целевого кода имаджу И одновременно [не]принадлежность базы целевой dll списку образов из базы лоадера или из каких-нибудь таблиц модулей с недавними исключениями (да, звучит натянуто и вообще). Одним из простейших путей узнавания о факте раскрутки могло бы быть 'bu KiUserExceptionDispatcher "ba r1 *ExceptionContext.Rip"' – поскольку для раскрутки необходимо узнавать, на какой инструкции произошло исключение ("не в эпилоге ли мы?"). Или же "ba" на начальном RVA в середине добавленной таблицы (там должен быть бинарный поиск же?). Если это нечто глубокое, то можешь приаттачить минимальную dll с лоадером для неё, символами и ожидаемым результатом – мы посмотрим в деталях на w7.
Sol_Ksacap Есть подозрение, что MS-вый рантайм в DLL выносит нафиг все что делалось ДО вызова DllMain. Буду экспериментировать с RtlInstallFunctionTableCallback, но сам факт неработоспособности RtlAddFunctionTable уже наводит на мысли о существовании очередного г@внокода от MS, который неизвестно как придется обходить. До раскрутки дело вообще не доходит.
dermatolog А дай-ка такие спеки на случай, если соберёмся разбирать поведение (может быть они не релевантны раскрутке, но вдруг): 1) Тип региона памяти, где находится "dll" – MEM_PRIVATE? (MEM_IMAGE? MEM_SECTION?) 2) "dll" добавлена в базу данных лоадера? 3) FileHeader.Characteristics, OptionalHeader.DllCharacteristics – в численном виде (для "dll" и для главного исполняемого модуля). 4) ? >Есть подозрение, что MS-вый рантайм в DLL выносит нафиг все что делалось ДО вызова DllMain. Маловероятно. Смотрели в своё время рантайм vc9 и подобных хитрых ходов не заметили.
MEM_PRIVATE Нет. На это я первым делом посмотрел ) IMAGE_DLLCHARACTERISTICS_NO_SEH нет ни там ни там.