![](/img/trans.png)
[英]using C -programming, how to get process name from process id on windows
[英]Get Parent Process Name (Windows)
我試圖在Windows控制台應用程序(C / C ++)中獲取父進程的名稱(完整路徑)。 看起來應該可以,但是失敗了,我看不到我在做什么錯。 它已成功獲取父PID,但未獲取名稱。 任何更正將不勝感激。
#include <Windows.h>
#include <stdio.h>
#include <tlhelp32.h>
#include <Psapi.h>
DWORD getParentPID(DWORD pid)
{
HANDLE h = NULL;
PROCESSENTRY32 pe = { 0 };
DWORD ppid = 0;
pe.dwSize = sizeof(PROCESSENTRY32);
h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if( Process32First(h, &pe))
{
do
{
if (pe.th32ProcessID == pid)
{
ppid = pe.th32ParentProcessID;
break;
}
} while( Process32Next(h, &pe));
}
CloseHandle(h);
return (ppid);
}
int getProcessName(DWORD pid, PUCHAR fname, DWORD sz)
{
HANDLE h = NULL;
int e = 0;
h = OpenProcess
(
PROCESS_QUERY_INFORMATION,
FALSE,
pid
);
if (h)
{
if (GetModuleFileNameEx(h, NULL, fname, sz) == 0)
e = GetLastError();
CloseHandle(h);
}
else
{
e = GetLastError();
}
return (e);
}
int main(int argc, char *argv[])
{
DWORD pid, ppid;
int e;
char fname[MAX_PATH] = {0};
pid = GetCurrentProcessId();
ppid = getParentPID(pid);
e = getProcessName(ppid, fname, MAX_PATH);
printf("PPID=%d Err=%d EXE={%s}\n", ppid, e, fname);
}
附加信息:OpenProcess返回5(ERROR_ACCESS_DENIED)。 如果按照建議添加PROCESS_VM_READ,它將返回299(ERROR_PARTIAL_COPY)。 我可以打開當前進程,但不能打開父進程。
在Windows Vista +上,可以使用QueryFullProcessImageName
代替GetModuleFileNameEx
。 然后,僅需要使用權限較小的PROCESS_QUERY_LIMITED_INFORMATION
標志來調用OpenProcess
。
使用附加的PROCESS_VM_READ
標志調用OpenProcess
,它應該可以工作:
h = OpenProcess
(
PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,
FALSE,
pid
);
另外看看Mekap提到的可能重復項
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.