Суть ошибки: при загрузке dll через rundll32 перестает работать функция LdrLoadDll, при тех же действиях в любой другой программе - всё норм. Причем перестает работать не в текущем процессе, а в дочернем процессе. В общем идея проста - загрузка DLL в запускаемый процесс, но так чтобы DLL загрузилась раньше кода запускаемой программы. т.е. CreateProcess(CREATE_SUSPENDED) + WriteProcessMemory(шелкод) + QueueUserApc(шелкод) + ResumeThread. Шелкод вызывает LdrLoadDll. И такс, кому хочется покопаться, накидал тестилку. Смысл тестилки таков: 1) Тестовая DLL загружается или через тестовую прогу или через rundll32 и выполняется TestProc 2) В TestProc запускается через CreateProcessA процесс child.exe с флагом CREATE_SUSPENDED 3) Далее в АП запущенного процесса закидывается шелкод 4) Ставится APC на шелкод 5) Запускается главный поток программы. В аттаче все тестовые проги/dll и их исходники. И так, запускаю первый тест (тестовая программа делает LoadLibrary("test.dll") + GetProcAddress("TestProc") и выполняет TestProc). DebugView показывает [PID][FROMID] Message Далее загружаем DLL через rundll32.exe test.dll,TestProc И ловим падение дочернего процесса еще до загрузки DLL. на разный ОС стек вызовов чуть отличается. Win Vista X32 SP2 (видно что образ DLL не погружен) Win 7 X32 (видно что образ DLL не погружен) Win 7 X64 SP1 (видно что образ DLL уже погружен) В общем-то, для x64 систем, ошибка там же происходит, только этого не видно из-за WOW64. На XP SP3 бага нет. Причем если под отладчиком в rundll32 убрать вызов ActivateActCtx, то всё работает нормально. т.е. реально какой-то баг в винде который не дает нормально функционировать LdrLoadDll. Как бороться с этим - хз, может у кого-то есть предположения? Была идея делать DeactivateActCtx, но не прокатит по причине того что нельзя узнать Cookie.