獲取程式全路徑方法(支援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")
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()
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,程式ID
char szFileName[MAX_PATH] = {0};//檔名
char szPathName[MAX_PATH] = {0};//路徑名
HANDLE hProcess = NULL;
HMODULE hModule = NULL;
hProcess=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,//訪問許可權,win7以上系統需要提升許可權EnablePrivilege
false,//是否允許得到的程式控制程式碼被後建立的子程式繼承
dwPID);//程式ID
DWORD 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);
}
相關文章
- C# WinForm獲取程式所在路徑方法C#ORM
- C#獲取程式當前路徑的方法C#
- win10怎麼獲取當前目錄_win10系統如何快速獲取檔案路徑Win10
- C# 獲取專案程式路徑的方法C#
- xp系統怎麼直接升級到win10系統版本 xp重灌為win10系統方法介紹Win10
- 系統損壞進不去怎麼重灌系統(xp、win7、win10通用)Win7Win10
- 電腦系統無u盤重灌方法介紹(可重灌xp、win7、win8、win10系統)Win7Win10
- golang獲取程式執行路徑Golang
- 微軟延長 XP 系統安全支援微軟
- 取系統路徑
- Xamarin Essentials教程獲取路徑檔案系統FileSystem
- win7系統即將停止支援 Win10系統煥發新生Win7Win10
- win10系統如何更改系統快取檔案路徑Win10快取
- PHP 常用獲取路徑程式碼PHP
- c# 獲取程式當前路徑C#
- win10系統遇到問題時獲取幫助的方法Win10
- 獲取系統字型,獲取系統預設字型
- XP和WIN7雙系統作業系統安裝教程Win7作業系統
- win7系統升級到win10方法_WIN7怎麼升級WIN10系統Win7Win10
- 獲取系統語言/當前 App支援語言APP
- win10系統下獲取trustedinstaller許可權的方法Win10Rust
- java獲取當前路徑的幾種方法Java
- C#獲取當前路徑的方法集合C#
- 獲取微信小程式頁面路徑微信小程式
- 中國作業系統市場win10份額全面超xp,僅次於win7系統作業系統Win10Win7
- win10刷win7的方法_win10如何刷回win7系統Win10Win7
- win10怎麼獲取顏色值_win10系統獲取螢幕顏色HSL值RGB值方法Win10
- python獲取程式執行檔案路徑的方法其一Python
- C# 獲取程式路徑的幾種方法及其區別【WPF】C#
- Win10系統修改word模板路徑的方法Win10
- 獲取系統版本
- VC 獲取系統特殊資料夾的路徑如:系統目錄,桌面等
- Win7系統共享xp的印表機圖文教程Win7
- 將APP加入系統分享+根據Uri獲取絕對路徑APP
- Windows系統安全獲取重要資訊的方法(一)Windows
- Qt 程式獲取程式所在路徑、使用者目錄路徑、臨時資料夾等特殊路徑的方法QT
- vc6.0(完整綠色版)(支援XP、Win7、Win8、Win10)Win7Win10
- win10系統裝win7系統Win10Win7