2011-12-12 97 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()成功處理。 –

相關問題