C/C++获取windows进程路径的方法
2015-06-12 12:03
776 查看
这几天在学习windows的远程协助,学到关于获取系统进程完整路径时,遇到了无法获取高权限系统进程的路径的问题,网上找了下,最后在csdn中找到了一个解决方法,个人感觉很好,于是借鉴来分享下(感谢tpnndhqc提供的方法)。
//c/c++ code #include <stdio.h> #include <windows.h> #include <tlhelp32.h> #include <string> #include <tchar.h> #include <Psapi.h> #include <conio.h> #pragma comment (lib,"Psapi.lib") BOOL DosPathToNtPath(LPTSTR pszDosPath, LPTSTR pszNtPath) { TCHAR szDriveStr[500]; TCHAR szDrive[3]; TCHAR szDevName[100]; INT cchDevName; INT i; //检查参数 if(!pszDosPath || !pszNtPath ) return FALSE; //获取本地磁盘字符串 if(GetLogicalDriveStrings(sizeof(szDriveStr), szDriveStr)) { for(i = 0; szDriveStr[i]; i += 4) { if(!lstrcmpi(&(szDriveStr[i]), _T("A:\\")) || !lstrcmpi(&(szDriveStr[i]), _T("B:\\"))) continue; szDrive[0] = szDriveStr[i]; szDrive[1] = szDriveStr[i + 1]; szDrive[2] = '\0'; if(!QueryDosDevice(szDrive, szDevName, 100))//查询 Dos 设备名 return FALSE; cchDevName = lstrlen(szDevName); if(_tcsnicmp(pszDosPath, szDevName, cchDevName) == 0)//命中 { lstrcpy(pszNtPath, szDrive);//复制驱动器 lstrcat(pszNtPath, pszDosPath + cchDevName);//复制路径 return TRUE; } } } lstrcpy(pszNtPath, pszDosPath); return FALSE; } //获取进程完整路径 BOOL GetProcessFullPath(DWORD dwPID, TCHAR pszFullPath[MAX_PATH]) { TCHAR szImagePath[MAX_PATH]; HANDLE hProcess; if(!pszFullPath) return FALSE; pszFullPath[0] = '\0'; hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, dwPID); if(!hProcess) return FALSE; if(!GetProcessImageFileName(hProcess, szImagePath, MAX_PATH)) { CloseHandle(hProcess); return FALSE; } if(!DosPathToNtPath(szImagePath, pszFullPath)) { CloseHandle(hProcess); return FALSE; } CloseHandle(hProcess); _tprintf(_T("%d,%s \r\n"),dwPID,pszFullPath); return TRUE; } int main(int argc, char* argv[]) { HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (INVALID_HANDLE_VALUE == hSnapshot) { return NULL; } PROCESSENTRY32 pe ={0}; pe.dwSize = sizeof(PROCESSENTRY32); BOOL fOk; for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe)) { TCHAR szProcessName[MAX_PATH] = {0}; GetProcessFullPath(pe.th32ProcessID, szProcessName); } getch(); return 0; }效果图:
原文出自:http://bbs.csdn.net/topics/390937481
转载请注明原出处及原作者。
相关文章推荐
- Lua教程(五):C/C++操作Lua数组和字符串示例
- C/C++实现快速排序的方法
- C/C++常用函数易错点分析
- Mac下使用Eclipse编译C/C++文件出现 launch failed, binary not found 解决方案
- 把Lua函数传递到C/C++中实例
- C/C++中退出线程的四种解决方法
- 浅析C/C++中sort函数的用法
- Notepad++配置C/C++IDE(详细)
- C 堆栈,运行时类型挷定
- 初识libjpeg
- 【推荐】The Function Pointer Tutorials
- 分享自己写的一个贪吃蛇的游戏(Linux)
- 分享一个蛋疼的俄罗斯方块小游戏
- Linux下的字符界面扫雷游戏
- linux下的图形界面扫雷游戏(Gtk+2.0)
- for_each宏
- 让android支持RTSP及live555分析
- C++ Template中防止使用不完整类型
- Windows平台下如何检测C/C++内存泄露?
- C++中指定小数位数输出