gusucode.com > 如何在NT下获取进程的路径(增补)C#源码程序 > 如何在NT下获取进程的路径(增补)/showprocesspath2/ShowProcessPath2.cpp
/* * ShowProcessPath 2.0 * 版权所有 (C) 2005 赵春生 * 2005.09.02 * http://timw.yeah.net * http://timw.126.com * 本程序适用于:WinNT * 代码在Win2000P+SP4 + VC6+SP6测试通过 */ #include <stdio.h> #include <windows.h> #include "PSAPI.H" #pragma comment( lib, "PSAPI.LIB" ) //自定义函数:赋予指定特权。这里用来提升程序权限。 BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName); int main(void) { DWORD processid[1024],needed,processcount,i; HANDLE hProcess; HMODULE hModule; char path[MAX_PATH] = "",temp[256]; HANDLE hToken; printf("ShowProcessPath 2.0 with [Process Status API]\n\n"); if ( OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken) ) { if (EnablePrivilege(hToken,SE_DEBUG_NAME)) { EnumProcesses(processid, sizeof(processid), &needed); processcount=needed/sizeof(DWORD); for (i=0;i<processcount;i++) { hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,processid[i]); if (hProcess) { EnumProcessModules(hProcess, &hModule, sizeof(hModule), &needed); GetModuleFileNameEx(hProcess, hModule, path, sizeof(path)); GetShortPathName(path,path,256); itoa(processid[i],temp,10); printf("%s --- %s\n",path,temp); } else printf("Failed!!!\n"); } } } CloseHandle(hProcess); CloseHandle(hModule); itoa(processcount,temp,10); printf("\nProcess Count:%s\n\n",temp); return 0; } ////////////////////////////////////////////////////////////////////// BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName) { TOKEN_PRIVILEGES tkp; LookupPrivilegeValue( NULL,szPrivName,&tkp.Privileges[0].Luid );//修改进程权限 tkp.PrivilegeCount=1; tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限 return( (GetLastError()==ERROR_SUCCESS) ); } //////////////////////////////////////////////////////////////////////