2011-12-12 96 views
3

我目前正在尝试获取有我的pid的程序列表的名称。从进程ID获取进程可执行文件名称

该程序以管理员身份运行,但GetModuleFileNameEx失败,错误代码5

我打开该程序与OpenProcess(PROCESS_TERMINATE,PROCESS_QUERY_INFORMATION),我启用了SE_DEBUG_PRIVILEGE

+0

你怎么样打开过程?你能显示周围的代码吗? – Deanna

+0

哦,为什么不使用[GetProcessImageFileName](http://stackoverflow.com/search?q=GetProcessImageFileName)? – Deanna

+0

GetProcessImageFileName为每个进程返回“\”,但不包含任何错误代码。 :/ – jgpt

回答

10

传递到GetModuleFileNameEx()的流程句柄需要PROCESS_QUERY_INFORMATIONPROCESS_VM_READ访问权限。

这为我工作:

HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 
         FALSE, 
         6088); 
if (0 == h) 
{ 
    std::cerr << "OpenProcess() failed: " << GetLastError() << "\n"; 
} 
else 
{ 
    char exe_path[2048] = {}; 

    if (GetModuleFileNameEx(h, 0, exe_path, sizeof(exe_path) - 1)) 
    { 
     std::cout << exe_path << "\n"; 
    } 
    else 
    { 
     std::cerr << "GetModuleFileNameEx() failed: " << 
      GetLastError() << "\n"; 
    } 
    CloseHandle(h); 
} 

然而,正如其他人指出(并在文档还指出了GetModuleFileNameEx())有获取此信息更安全的方式:

+0

GetModuleFilename现在返回一些进程的Errorcode 299和其他进程的“C”,但不是完整进程名称 – jgpt

+0

@jgpt,如果调用GetModuleFileNameEx()的二进制文件是32位并且目标进程是64位。这是你在做什么?不知道你的意思是“C”:那是exe的名字?如果是这样,听起来像传递缓冲区的大小是2个字节,因为“C”通常是驱动器名称。 – hmjd

+0

+1,但请注意,GetProcessImageFileName()也是如此。虽然OpenProcess()已成功进行SYNCHRONIZE访问,但我得到错误5将该句柄传递给GetProcessImageFileName()。将OpenProcess()调用更改为请求PROCESS_QUERY_INFORMATION | PROCESS_VM_READ导致GetProcessImageFileName()成功处理。 –

相关问题