環境:win10 64位作業系統 VS2012編程
代碼如下:
頭檔案
#include "stdafx.h"
#include "GetprocessPath.h"
#include "GetprocessPathDlg.h"
#include "afxdialogex.h"
#include <Psapi.h>
#include "tlhelp32.h"
#pragma comment (lib,"Psapi.lib")
主要源代碼
void CGetprocessPathDlg::OnBnClickedOk()
{
// TODO: 在此添加控制元件通知處理程式代碼
CString processFullPath;
CString processname1=_T("CCProjectMgr.exe");
GetProcessidFromName(processname1,processFullPath);//由行程名獲取行程路徑
AfxMessageBox(processFullPath);//顯示行程路徑
CDialogEx::OnOK();
}
//-------------------------------獲取行程路徑函式-----------------------------------------------//
DWORD CGetprocessPathDlg::GetProcessidFromName(CString processName,CString &processPath)
{
PROCESSENTRY32 pe;
MODULEENTRY32 me;
//LPMODULEENTRY32 me;
DWORD id=0;
HANDLE mehandle;
HANDLE hSnapshot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
pe.dwSize=sizeof(PROCESSENTRY32);
BOOL ret=Process32First( hSnapshot,&pe);
if(!ret)
return 0;
while(1)
{
pe.dwSize=sizeof(PROCESSENTRY32);
if(Process32Next(hSnapshot,&pe)==FALSE)
break;
if(processName.CompareNoCase(pe.szExeFile)==0)
{
id=pe.th32ProcessID;
CString myfilename;
myfilename=pe.szExeFile;
AfxMessageBox(myfilename);
mehandle=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,id);
me.dwSize=sizeof(MODULEENTRY32);
Module32First(mehandle,&me);
processPath=me.szExePath;
AfxMessageBox(GetLastError());//測驗問題
break;
}
}
CloseHandle(hSnapshot);
return id;
}
問題:
編繹的后運行程式,獲取路徑慷訓未初始化。獲取最后錯誤顯示,但在除錯時顯示路徑正常。獲取最后錯誤顯示
Debug Assertion Failed!
Program:C:\WINDOWS\SYSTEM32\mfc110ud.dll
File:f\dd\vctools\vc7libs\ship\atlmfc\src\mfc\appui1.cpp
line:162
For information on how your program can causr an assertion failure,see the visual c++ documentation on asserts
小弟菜鳥一個,求高人指點!
uj5u.com熱心網友回復:
補充說明:在除錯狀態下運行正常,正常運行進無法獲取。
uj5u.com熱心網友回復:
是不是路徑中有空格中有空格?uj5u.com熱心網友回復:
運行的時候當前目錄是exe所在路徑。你是否處理正確uj5u.com熱心網友回復:
C:\Program Files (x86)\xxx\xxxx.exe 這種64位兼容32系統都有空格,測驗與空格無關。
uj5u.com熱心網友回復:
由于我是用行程名來獲取程式路徑,而不是獲取當前運行程式路徑(獲取當前程式路徑在對容易)。
uj5u.com熱心網友回復:
補充說明:由于在除錯模式運行程式時無任何問題,剛開始以為在權限上有問題,在專案屬性--聯結器--清單檔案UAC級別設定成requireAdministrator (/level='requireAdministrator'),運行時依然存在問題。看來與權限無關。也用過GetProcessImageFileName/EnumProcessModule等函式來獲取都不成功。有點奇怪的是有一兩交居然能正常運行。今天晚上用網上64位32位行程路徑獲取辦法(DosPathToNtPath(LPTSTR pszDosPath, LPTSTR pszNtPath)和GetProcessFullPath(DWORD dwPID, TCHAR pszFullPath[MAX_PATH])在DOS下查看全部路徑,居然沒有我要的行程。因此我更換另一個行程來獲取,次次都能正常獲取全路徑,獲取這個程式路徑時顯示如圖路徑(空)
,百思不得其解。如果它加密,應該也不能通過 任務欄行程串列,通過點擊右鍵看到路徑,而且偶爾能獲取正確的路徑。求高人指點。
uj5u.com熱心網友回復:
使用tlist命令列工具。uj5u.com熱心網友回復:
趙4老師:
tasklist這個命令能查看到行程名稱,我用程式也能獲取名稱,但就是無法獲取路徑,能告訴我是什么原因導致的嗎?
uj5u.com熱心網友回復:
tlist和tasklist不是一回事!uj5u.com熱心網友回復:
最近再做逆向匯編學習是,發現該行程為系統行程,用AdjustProcessToken()調整行程權限即可,在用VS除錯時由于獲取的是除錯權限,所以能正常顯示路徑。謝謝各位老師回復。轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/156066.html
標籤:進程/線程/DLL
