从32位应用程序中查找64位进程的模块名称

时间:2012-04-05 19:33:51

标签: c winapi

我正在使用Win Api函数GetModuleBaseName从当前窗口检索进程名称(我的应用程序在Win7 64位上运行32位):

HWND Handle = GetForegroundWindow();
DWORD lpdwProcessId;
HANDLE PID; 

WCHAR ProcessName[1024];
GetWindowThreadProcessId(Handle,&lpdwProcessId);
PID=OpenProcess(PROCESS_ALL_ACCESS,false,lpdwProcessId);
if (PID)
{
    if(GetModuleBaseName(PID,NULL,ProcessName,sizeof ProcessName) == 0) {
        wcscpy(ProcessName,  L"??");
        DWORD er = GetLastError();
        printf("error code: %i\n", GetLastError());
    }
}
else
{
    wcscpy(ProcessName,  L"??");
} 

此代码在所有32位程序中运行良好但不适用于64位程序,例如MSPaint,其中返回的最后一个错误是

error 299 : ERROR_PARTIAL_COPY : "Only part of a ReadProcessMemory or
WriteProcessMemory request was completed."

MSDN没有记录可能发生此特定错误的原因。我在某处看到,由于32位和64位程序之间的问题,EnumProcessModulesEx可能会发生此错误,但GetModuleBaseName没有提到这种情况。 有没有办法知道它来自何处以及如何解决它?

感谢

1 个答案:

答案 0 :(得分:3)

Documentation for GetModuleBaseName建议调用GetProcessImageFileName或QueryFullProcessImageName比使用NULL模块句柄调用GetModuleBaseName更可靠。