Суть проблемы в том есь ф-ция Код (Text): BOOL SearchDll(PVOID Address OPTIONAL ,PWCHAR DllName OPTIONAL,OUT PLDR_MODULE *Module) { PLIST_ENTRY ModuleListHead; PLIST_ENTRY Entry; PLDR_MODULE ModulePtr; if (mNtCurrentPEB()->LoaderData == NULL) { return(false); } ModuleListHead = &mNtCurrentPEB()->LoaderData->InLoadOrderModuleList; Entry = ModuleListHead->Flink; if (Entry == ModuleListHead) { return(false); } while (Entry != ModuleListHead) { ModulePtr =/*(PLDR_MODULE)&((PLDR_MODULE)(Entry))->InLoadOrderModuleList;//*/CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList); DebugPrint("Getted ModulePtr 0x%x",ModulePtr); DebugPrint("Scanning %ws at 0x%x\n", ModulePtr->BaseDllName.Buffer, ModulePtr->BaseAddress); /// <-- [b]Exceptino HERE[/b] if(DllName != NULL) if(lstrincmpW(DllName,(PWCHAR)&ModulePtr->BaseDllName.Buffer[0],ModulePtr->BaseDllName.Length) == 0) { if(Module!=NULL) *Module = ModulePtr; return(true); } if ((Address >= ModulePtr->BaseAddress) && ((ULONG_PTR)Address <= ((ULONG_PTR)ModulePtr->BaseAddress + ModulePtr->SizeOfImage))) { if(Module!=NULL) *Module = ModulePtr; return(true); } Entry = Entry->Flink; } DebugPrint("Failed to find module entry.\n"); return(false); } которая ищет загруженные библиотеки если эту ф-цию вызвать в DllMain в Release то происходит исключения но под Debug все проходит корректно при этом если эту ф-цию вызвать с приложения в любом режиме она срабатывает корректно! кто может подсказать где я туплю?
Ну дык за основу брал сорцы с ReactOS ... еслибы в обходе был бок я думаю что и под отладкой не работало бы!
Код (Text): ModulePtr =/*(PLDR_MODULE)&((PLDR_MODULE)(Entry))->InLoadOrderModuleList;//*/CONTAINING_RECORD(Entry, LDR_MODULE, InLoadOrderModuleList); как в нормальном состоянии выглядит код в этой строке?
Код (Text): NTSTATUS NTAPI LdrFindEntryForAddress(PVOID Address, PLDR_DATA_TABLE_ENTRY *Module) { PLIST_ENTRY ModuleListHead; PLIST_ENTRY Entry; PLDR_DATA_TABLE_ENTRY ModulePtr; DPRINT("LdrFindEntryForAddress(Address %p)\n", Address); if (NtCurrentPeb()->Ldr == NULL) return(STATUS_NO_MORE_ENTRIES); RtlEnterCriticalSection(NtCurrentPeb()->LoaderLock); ModuleListHead = &NtCurrentPeb()->Ldr->InLoadOrderModuleList; Entry = ModuleListHead->Flink; if (Entry == ModuleListHead) { RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock); return(STATUS_NO_MORE_ENTRIES); } while (Entry != ModuleListHead) { ModulePtr = CONTAINING_RECORD(Entry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); DPRINT("Scanning %wZ at %p\n", &ModulePtr->BaseDllName, ModulePtr->DllBase); if ((Address >= ModulePtr->DllBase) && ((ULONG_PTR)Address <= ((ULONG_PTR)ModulePtr->DllBase + ModulePtr->SizeOfImage))) { *Module = ModulePtr; RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock); return(STATUS_SUCCESS); } Entry = Entry->Flink; } DPRINT("Failed to find module entry.\n"); RtlLeaveCriticalSection(NtCurrentPeb()->LoaderLock); return(STATUS_NO_MORE_ENTRIES); } собсно вот так она выглядит вот
УРАААААА НАШЕЕЕЕЛЛЛЛЛ!!!! Вдруг у кого случится этот глюк!!! В релизе я компилил с выравниваем в 0х01 а при дебаге выравнивание было = 0х04 вот тут и была зарыта собака) как в итоге оказалось) при постановке выравнивания в 0х04 код отлично заработал!!!!!!!
не просто я свои заголовки использую, и не предусмотрел в них выравнивание попросту) вот! \Ну и таким образом косяк со структурой вышел) ... по сути ... косяк в том что я это не предусмотрел))) ... зато ф-ция прикольная вышла))) для проверки принадлежности адреса к либе)))