日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

获取进程全路径方法(支持xp、win7、win10系统)

發布時間:2024/3/26 windows 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 获取进程全路径方法(支持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()函數。

實例:

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系统)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。