Устанавливаю глобальный перехват апи. Для этого надо попасть во все процессы. Алгоритм следующий: 1. При загрузке Windows csrss перебирает уже запущенные процессы и инжектит в них длл Процедура перечисления процессов Код (Text): BOOL EnumProcess(EP_CALLBACK EnumCallBack,LPVOID lParam) { __mytry PROCESSENTRY32 pe32; HANDLE hSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if(hSnap!=INVALID_HANDLE_VALUE) { pe32.dwSize=sizeof pe32; if(Process32First(hSnap,&pe32)) { do { if(!EnumCallBack(&pe32,lParam))break; } while(Process32Next(hSnap,&pe32)); } CloseHandle(hSnap); return true; } return false; __myexcept(EnumProcess) } Запускает процедуру в целевом процессе Код (Text): BOOL __stdcall InjectThread(HANDLE hProc,LPVOID lpProc,DWORD dwProcSize,LPVOID lpData,DWORD dwDataSize,DWORD* lpdwExitCode) { __mytry BOOL result=false; LPVOID pCode=VirtualAllocEx(hProc,0,dwProcSize+dwDataSize,MEM_COMMIT|MEM_RESERVE,PAGE_EXECUTE_READWRITE); if(pCode) { DWORD dwWrite; if(WriteProcessMemory(hProc,pCode,lpProc,dwProcSize,&dwWrite)) { LPVOID pData=(LPVOID)( DWORD(pCode) + dwProcSize ); if(WriteProcessMemory(hProc,pData,lpData,dwDataSize,&dwWrite)) { HANDLE hThread=CreateRemoteThread(hProc,0,0,(LPTHREAD_START_ROUTINE)pCode,pData,0,0); if(hThread) { dtxt(“WaitForSingleObject begin”) //подвисание происходит здесь DWORD dwWait=WaitForSingleObject(hThread,-1); if(!dwWait) { dtxt("wait end") if(lpdwExitCode)result=GetExitCodeThread(hThread,lpdwExitCode); else result=true; } CloseHandle(hThread); } } } VirtualFreeEx(hProc,pCode,0,MEM_RELEASE); } return result; __myexcept(InjectThread) } 2. Длл устанавливает перехват создания нового процесса. Проблема в том, что иногда (1 раз из 15) Windows виснит при загрузке, при выводе сообщения “Загрузка виндовс…” или “Приветствие”, мышка работает но система не реагирует ни на что. При изучении отладки я выяснил что подвисание происходит при инжектке в очередной процесс, как правило это svchost, но иногда бывают и другие, на DWORD dwWait=WaitForSingleObject(hThread,-1); Выполняемая процедура корректная, всегда возвращает управление. Ошибок, связанных с исключениями нет, все процедуры контролируются обработчиками исключений, мне кажется что проблема в самом алгоритме или есть какие-то тонкости, которых я не знаю. Еще заметил, что подвисание никогда не происходило при старте ехе в уже запущенной винде, толко на стадии загрузки windows. Может кто-то сталкивался с подобной проблемой? Пишите любую информацию. Спасибо.
Какой утилитой можно посмотреть состояние процессов, потоков в момент загрузки Windows (что-то вроде ProcessExplorer)?