ОС - Win7 x64 запускаю 32разрядную прогу 32разрядной прогой, и пытаюсь вызвать EnumProcessModules получаю ошибку ERROR_PARTIAL_COPY (12Bh, 299d) msdn говорит что но это вроде бы не тот случай, т.к. запускаемая прога 32разрядная при попытке заменить EnumProcessModules на EnumProcessModulesEx выдается та же ошибка Код (Text): include 'win32ax.inc' .code entry $ invoke GetStartupInfoA, startupInfo invoke CreateProcessA, target, NULL, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, startupInfo, processInfo invoke EnumProcessModules, [processInfo.hProcess], modules, 1024*4, cbNeeded int3 ; for debug ret .data target db "hello.exe", 0 processInfo PROCESS_INFORMATION startupInfo STARTUPINFO cbNeeded dd ? modules dd 1024 dup ? section '.idata' import data readable writeable library \ kernel32, 'KERNEL32.DLL',\ psapi, 'PSAPI.DLL' include 'api\kernel32.inc' import psapi, \ EnumProcessModulesEx, 'EnumProcessModulesEx'
мде... действительно, убрал CREATE_SUSPENDED - не помогло, добавил Sleep(1000) - все заработало =\ l_inc, спасибо!
Июп. EnumProcessModules получает информацию из Peb.Ldr. После возврата из CreateProcess(CREATE_SUSPENDED) первичный поток новосозданного процесса остановлен – и не исполнил ни одной инструкции в юзермоде. Соответственно, база данных лоадера не заполнена (для wow64 не заполена ни 32х-битная, ни 64х-битная её часть).
Чекайте переменную LdrpLdrDatabaseIsSetup. Когда установится в 1, то лодер полностью инициализировался. Линк на неё наёдёте из LdtpInitializeProcess().