获取进程全路径方法(支持xp、win7、win10系统)
生活随笔
收集整理的這篇文章主要介紹了
获取进程全路径方法(支持xp、win7、win10系统)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
獲取進程全路徑方法(支持xp、win7、win10系統)
獲取進程的全路徑的函數包括GetModuleFileNameEx、GetProcessImageFileName、QueryFullProcessImageName。
這三個函數的原型: DWORD GetModuleFileNameEx(HANDLE hProcess,HMODULE hModule,LPTSTR lpFilename,DWORD nSize)
????? hProcess是目標進程的句柄、hModule是目標模塊的句柄(當此參數為NULL時函數返回的是進程可執行文件的路徑)、lpFilename是存放路徑的字符串緩沖區、nSize表示緩沖區的大小。函數調用失敗將返回0。注:進程的句柄須有PROCESS_QUERY_INFORMATION和PROCESS_VM_READ權限。
?
DWORD GetProcessImageFileName(HANDLE hProcess,LPTSTR lpImageFileName,DWORD nSize)
????? hProcess是目標進程的句柄、lpImageFileName是存放路徑的字符串緩沖區、nSize表示緩沖區的大小。函數失敗將返回0。注:進程句柄需要有PROCESS_QUERY_INFORMATION的權限。
?
BOOL QueryFullProcessImageName(HANDLE hProcess,DWORD dwFlags,LPTSTR lpExeName,PDWORD lpdwSize)
????? hProcess是目標進程的句柄、dwFlags一般設為0(表示返回的路徑是Win32的路徑格式,如"C:/...",如將其設為PROCESS_NAME_NATIVE將返回"/Device/HarddiskVolume1/..."這樣的格式路徑)、lpExeName是存放路徑的字符串緩沖區、lpdwSize表示緩沖區的大小。函數失敗將返回FALSE。注:調用此函數的句柄須有PROCESS_QUERY_INFORMATION或這是PROCESS_QUERY_LIMITED_INFORMATION的權限,并且只能在Vista或更高版本的系統中使用。
?
????? 調用GetModuleFileNameEx和GetProcessImageFileName需要包含Psapi.h頭文件,并鏈接到Psapi.lib
#include <Psapi.h>
#pragma comment (lib,"Psapi.lib")
在win10 64位系統上調用GetModuleFileNameEx()遍歷獲取64位進程的全路徑失敗,得到的路徑都為空。
根據官方的說法:
For the best results use the following table to convert paths. Windows 2000 = GetModuleFileNameEx()
Windows XP/Server2003 = GetProcessImageFileName()
Windows Vista/7/8/10/Server2008/Server2012 = QueryFullProcessImageName() 如果在win10系統中調用GetModuleFileNameEx 返回錯誤299 GetLastError();需要調用QueryFullProcessImageName()函數。
獲取進程的全路徑的函數包括GetModuleFileNameEx、GetProcessImageFileName、QueryFullProcessImageName。
這三個函數的原型: DWORD GetModuleFileNameEx(HANDLE hProcess,HMODULE hModule,LPTSTR lpFilename,DWORD nSize)
????? hProcess是目標進程的句柄、hModule是目標模塊的句柄(當此參數為NULL時函數返回的是進程可執行文件的路徑)、lpFilename是存放路徑的字符串緩沖區、nSize表示緩沖區的大小。函數調用失敗將返回0。注:進程的句柄須有PROCESS_QUERY_INFORMATION和PROCESS_VM_READ權限。
?
DWORD GetProcessImageFileName(HANDLE hProcess,LPTSTR lpImageFileName,DWORD nSize)
????? hProcess是目標進程的句柄、lpImageFileName是存放路徑的字符串緩沖區、nSize表示緩沖區的大小。函數失敗將返回0。注:進程句柄需要有PROCESS_QUERY_INFORMATION的權限。
?
BOOL QueryFullProcessImageName(HANDLE hProcess,DWORD dwFlags,LPTSTR lpExeName,PDWORD lpdwSize)
????? hProcess是目標進程的句柄、dwFlags一般設為0(表示返回的路徑是Win32的路徑格式,如"C:/...",如將其設為PROCESS_NAME_NATIVE將返回"/Device/HarddiskVolume1/..."這樣的格式路徑)、lpExeName是存放路徑的字符串緩沖區、lpdwSize表示緩沖區的大小。函數失敗將返回FALSE。注:調用此函數的句柄須有PROCESS_QUERY_INFORMATION或這是PROCESS_QUERY_LIMITED_INFORMATION的權限,并且只能在Vista或更高版本的系統中使用。
?
????? 調用GetModuleFileNameEx和GetProcessImageFileName需要包含Psapi.h頭文件,并鏈接到Psapi.lib
#include <Psapi.h>
#pragma comment (lib,"Psapi.lib")
在win10 64位系統上調用GetModuleFileNameEx()遍歷獲取64位進程的全路徑失敗,得到的路徑都為空。
根據官方的說法:
For the best results use the following table to convert paths. Windows 2000 = GetModuleFileNameEx()
Windows XP/Server2003 = GetProcessImageFileName()
Windows Vista/7/8/10/Server2008/Server2012 = QueryFullProcessImageName() 如果在win10系統中調用GetModuleFileNameEx 返回錯誤299 GetLastError();需要調用QueryFullProcessImageName()函數。
實例:
DWORD dwMajorVersion = 0;DWORD dwMinorVersion = 0;OSVERSIONINFOEX osver = { 0 };osver.dwOSVersionInfoSize = sizeof(osver);::GetVersionEx((OSVERSIONINFO*)&osver);dwMajorVersion = osver.dwMajorVersion;dwMinorVersion = osver.dwMinorVersion;//打開進程//dwPID,進程IDchar szFileName[MAX_PATH] = {0};//文件名char szPathName[MAX_PATH] = {0};//路徑名HANDLE hProcess = NULL;HMODULE hModule = NULL;hProcess=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,//訪問權限,win7以上系統需要提升權限EnablePrivilegefalse,//是否允許得到的進程句柄被后創建的子進程繼承dwPID);//進程IDDWORD dwError = 0;//BOOL bSuccessProcess = pEnumProcessModules(hProcess,&hModule,sizeof(hModule),&cbReturn);BOOL bSuccessProcess = EnumProcessModules(hProcess, &hModule, sizeof(hModule), &cbReturn);if (!bSuccessProcess){dwError = GetLastError();}memset(szFileName, 0, sizeof(szFileName));memset(szPathName, 0, sizeof(szPathName));if (hModule != NULL){//獲得進程模塊文件名(包含路徑)if (dwMajorVersion < 5) //2000{//保存文件名DWORD dwGetModuleBaseName = GetModuleFileNameEx(hProcess, hModule, szPathName, sizeof(szPathName));GetFileNameWithoutExtendName(szPathName, pAll[i].szFileName);}if (dwMajorVersion == 5) //x或Windows Server2003{GetProcessImageFileName(hProcess, szPathName, sizeof(szPathName));GetFileNameWithoutExtendName(szPathName, pAll[i].szFileName);}else if (osver.dwMajorVersion >= 6) //win7或win7以上{DWORD dwPathNameSize = sizeof(szPathName);bSuccessProcess = QueryFullProcessImageName(hProcess, 0, szPathName, &dwPathNameSize);GetFileNameWithoutExtendName(szPathName, pAll[i].szFileName);}if (!bSuccessProcess){dwError = GetLastError();}strcpy(pAll[i].szPathName, szPathName);}if(hProcess)CloseHandle(hProcess);//得到文件名(不含擴展名) void GetFileNameWithoutExtendName(const char* pFile,char *pFileDest) {if (NULL == pFile || 0 == strlen(pFile) || NULL == pFileDest)return;char *pPos = (char *)strrchr(pFile, '\\');if (NULL == pPos){pPos = (char *)strrchr(pFile, '/');}if (NULL == pPos){pPos = (char *)pFile;}if (pPos != NULL){char *pSplitFlag = strrchr(pPos, '.');if (pSplitFlag != NULL){int nLenTemp = pSplitFlag - pPos - 1;strncpy(pFileDest, pPos + 1, nLenTemp);pFileDest[nLenTemp] = '\0';}else{strcpy(pFileDest, pPos + 1);}}else{strcpy(pFileDest, pFile);} }//提權函數 BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName) {TOKEN_PRIVILEGES tkp;//訪問令牌權限結構變量LUID luid;//本地唯一標識符結構變量//查詢SE_DEBUG_NAME權限所對應的luid值if(!LookupPrivilegeValue(NULL,szPrivName,&luid)){// TRACE("Lookup Privilege Value Failed...\nErrorCode:%d\n",GetLastError());return 0;}//填充Token_Privileges結構tkp.PrivilegeCount=1;tkp.Privileges[0].Luid=luid;tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;//提升權限if(!AdjustTokenPrivileges(hToken,FALSE,&tkp,sizeof(tkp),NULL,NULL)){ // TRACE("Adjust Token Privileges Failed...\nErrorCode:%d\n",GetLastError());return 0;}return(GetLastError()==ERROR_SUCCESS); }總結
以上是生活随笔為你收集整理的获取进程全路径方法(支持xp、win7、win10系统)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 好的学习视频教程,可以在线观看
- 下一篇: 显示器点距 测试软件,液晶显示器的点距是