获取进程全路径
2015-01-19 13:27
253 查看
BOOL GetProcPath( __in BOOL bCurrentProc, __in ULONG ulPid, __inout LPTSTR lpProcPath, __in ULONG ulProcPathBufLen ) { BOOL bRet = FALSE; HMODULE hModule = NULL; HANDLE hProc = NULL; DWORD dwProcPathLen = 0; TCHAR tchProcPathDev[MAX_PATH] = {0}; TCHAR tchVolNameDev[MAX_PATH] = {0}; TCHAR tchVolName[MAX_PATH] = {0}; __try { if (!lpProcPath || !ulProcPathBufLen || (!bCurrentProc && !ulPid)) { printf("[GetProcPath] : input parameter error \n"); __leave; } if (bCurrentProc) { if (!GetModuleFileName(NULL, lpProcPath, ulProcPathBufLen / sizeof(TCHAR))) { printf("[GetProcPath] : GetModuleFileName failed. (%d) \n", GetLastError()); __leave; } bRet = TRUE; __leave; } hProc = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE, ulPid); if (!hProc) { printf("[GetProcPath] : OpenProcess failed. (%d) \n", GetLastError()); __leave; } hModule = LoadLibrary(_T("Kernel32.dll")); if (!hModule) { printf("[GetProcPath] : LoadLibrary failed. (%d) \n", GetLastError()); __leave; } if (GetProcAddress(hModule, "QueryFullProcessImageNameA")) { dwProcPathLen = ulProcPathBufLen / sizeof(TCHAR); if (!QueryFullProcessImageName(hProc, 0, lpProcPath, &dwProcPathLen)) { printf("[GetProcPath] : QueryFullProcessImageName failed. (%d) \n", GetLastError()); __leave; } bRet = TRUE; __leave; } if (!GetProcessImageFileName(hProc, tchProcPathDev, MAX_PATH)) { printf("[GetProcPath] : GetProcessImageFileName failed. (%d) \n", GetLastError()); __leave; } _tcscat_s(tchVolName, MAX_PATH, _T("A:")); for (; *tchVolName <= _T('Z'); (*tchVolName)++) { memset(tchVolNameDev, 0, MAX_PATH * sizeof(TCHAR)); if (!QueryDosDevice(tchVolName, tchVolNameDev, MAX_PATH)) { if (GetLastError() == 2) continue; else { printf("[GetProcPath] : QueryDosDevice failed. (%d) \n", GetLastError()); __leave; } } if (_tcsncmp(tchProcPathDev, tchVolNameDev, _tcslen(tchVolNameDev)) == 0) { bRet = TRUE; break; } } if (bRet) { _tcscat_s(lpProcPath, ulProcPathBufLen / sizeof(TCHAR), tchVolName); _tcscat_s(lpProcPath, ulProcPathBufLen / sizeof(TCHAR), tchProcPathDev + _tcslen(tchVolNameDev)); } } __finally { if (hModule) FreeLibrary(hModule); if (hProc) CloseHandle(hProc); } return bRet; }
相关文章推荐
- 获取NT中系统进程的路径
- 防火墙普遍存在的设计缺陷--关于进程路径的获取
- 遍历进程并获取进程路径 - 回复 "编程少年" 的问题
- 内核中获取进程路径学习
- 根据进程名称或者服务名称用WMI获取执行路径和参数
- 根据进程号获取进程路径函数(原创):
- 驱动中获取进程完整路径名
- 在Ring0下获取进程路径
- 获取进程列表、名称、路径
- [转]驱动中获取进程完整路径名
- [转载]在2000下获取进程的全路径
- 如何在NT下获取进程的路径(增补)
- 获取所有进程的映像路径以及命令行参数
- 获取进程所在的exe路径
- 防火墙普遍存在的设计缺陷--关于进程路径的获取
- 提升权限获取其他系统进程的路径(转)
- 获取进程中的文件名.路径.大小.创建时间.修改时间.属性等
- 防火墙普遍存在的设计缺陷--关于进程路径的获取
- 获取进程当前的路径