R0 CREW

Флаг в TEB

есть ли такой флажек? и где его найти. собственно интересует - как определить что в данный момент выполнять вызовы лоад либа нежелательно.

Ну флажек вроде как бы и есть - WaitingOnLoaderLock, но он не используется. А так могу только предложить сравнивать ИД потока владельца критической секции ntdll!LdrpLoaderLock с ИД целевого потока.

а есть ли технологии поиска данной секции?..естествено без таскания с собой отладочной инфы.

Поправочка: WaitingOnLoaderLock таки используется, но он выставляется если происходит реальное ожидание критической секции - RtlpWaitOnCriticalSection. Искать можно через какой-нибудь более-менее ОС-независимый паттерн функции, например, LdrpAcquireLoaderLock.

…сталобыть дизасм и все такое прочее =( …думал может по каким то косвенным признакам можно. эх надеялся что кто то такую работу уже проводил и есть статья.

В структуре PEB — struct _RTL_CRITICAL_SECTION* LoaderLock, в структуре LDR_DATA_TABLE_ENTRY — ULONG Flags (LDRP_LOAD_IN_PROGRESS, LDRP_UNLOAD_IN_PROGRESS). И ещё есть процедуры в ntdll.dll — LdrLockLoaderLock, LdrUnlockLoaderLock как раз для синхронизации загрузки в многопоточном процессе.

Угу, кто-то проводил и “статья” есть — сорцы (Windows 2000 Leaked Sources, Windows Research Kernel 2.1, ReactOS). :wink:

N.B. LoadLibraryA вызывает LoadLibraryExA, LoadLibraryExA вызывает LoadLibraryExW, LoadLibraryW вызывает LoadLibraryExW, LoadLibraryExW вызывает LdrLoadDll, LdrLoadDll лочится на критической секции NtCurrentPeb()->LoaderLock, если другая нить выполняет код в DllMain (_DllMainCRTStartup, DLL entry point).