Загружаю в winlogon свою dll и устанавливаю хуки на множестве функций из kernel32.dll. Хуки при необходимости загружают еще одну dll, вызывая LdrLoadDll / LdrGetProcedureAddress. Проблема в том, что в 50% случаев при вызове из хука LdrGetProcedureAddress поток зависает (управление из этой функции не возвращается). Подозреваю что мой хук был вызван при инициализации одной из множества загружаемых винлогоном dll, и получается я делаю загрузку dll из DllMain, что Microsoft делать не рекомендует. На какие системные объекты синхронизации воздействуют LdrLoadDll / LdrGetProcedureAddress? Может быть проверять их состояние перед вызовом LdrLoadDll / LdrGetProcedureAddress? PS: Могу конечно и сам реализовать LdrGetProcedureAddress, но имхо это временное решение: в будущем аналогичные проблемы могут возникнуть и с LdrLoadDll.
Поставить хук на LdrLoadDll: LdrLoadDllHook: InterlockedIncrement( &LdrLoadDllCalled ) (InterlockedIncrement <=> TlsSetValue) OrigLdrLoadDll(...) InterlockedDecrement( &LdrLoadDllCalled ) И проверять значение переменной LdrLoadDllCalled в других "небезопасных" хуках Или подгружать нужные dll заранее а не по срабатыванию определенного условия