通过PID获取进程路径和进程名的两种方法

通过PID获取进程路径和进程名的两种方法

分类: 编程技术   3220人阅读  评论(3)  收藏  举报
extension path null token ext windows

通过PID获取进程路径和进程名,使用了psapi.h类,获取进程路径,通过_splitpath()函数,获取路径中的文件名。

_splitpath()使用方法:
void _splitpath( const char *path, char *drive, char *dir, char *fname, char *ext );

Return Value
None


Parameters
path
    Full path
drive
    Optional drive letter, followed by a colon (:)
dir
    Optional directory path, including trailing slash. Forward slashes ( / ), backslashes ( \ ), or both may be used.
fname
    Base filename (no extension)
ext
    Optional filename extension, including leading period (.)

[cpp]  view plain copy
  1. #include <iostream>  
  2. #include <windows.h>  
  3. #include "Psapi.h"  
  4. #pragma comment (lib,"Psapi.lib")  
  5. using namespace std;  
  6.   
  7.   
  8. BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName);  
  9.   
  10. void main()  
  11. {  
  12.     char    path[_MAX_PATH+1]="";  
  13.     char    drive[_MAX_DRIVE];  
  14.     char    dir[_MAX_DIR];  
  15.     char    fname[_MAX_FNAME];  
  16.     char    ext[_MAX_EXT];  
  17.     DWORD   ProcessID;  
  18.     HANDLE  hToken;  
  19.   
  20.       
  21.     //提升程序权限  
  22.     OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken);  
  23.     EnablePrivilege(hToken,SE_DEBUG_NAME);  
  24.       
  25.   
  26.     while(1)  
  27.     {  
  28.         cin>>ProcessID;  
  29.   
  30.         //处理系统函数  
  31.         if (ProcessID==4)  
  32.         {  
  33.             cout<<"system"<<endl<<""<<endl;  
  34.             continue;  
  35.         }  
  36.   
  37.   
  38.   
  39.         HANDLE h_Process=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,ProcessID);  
  40.   
  41.         if (!h_Process)  
  42.         {  
  43.             cout<<"error_process"<<endl;  
  44.             return;  
  45.         }  
  46.   
  47.         GetModuleFileNameEx(h_Process,NULL,path,MAX_PATH+1);  
  48.   
  49.         cout<<path<<endl;  
  50.   
  51.         _splitpath(path, drive, dir, fname, ext );  
  52.   
  53.         wsprintf(fname,"%s%s",fname,ext);  
  54.         cout<<fname<<endl;  
  55.     }  
  56.   
  57. }  
  58.   
  59.   
  60. //提升权限函数  
  61. BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName)  
  62. {  
  63.       
  64.     TOKEN_PRIVILEGES tkp;  
  65.       
  66.     LookupPrivilegeValue( NULL,szPrivName,&tkp.Privileges[0].Luid );//修改进程权限  
  67.     tkp.PrivilegeCount=1;  
  68.     tkp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;  
  69.     AdjustTokenPrivileges( hToken,FALSE,&tkp,sizeof tkp,NULL,NULL );//通知系统修改进程权限  
  70.       
  71.     return( (GetLastError()==ERROR_SUCCESS) );  
  72.       
  73. }  



另一种方法是通过tlhelper32.h来获取系统所有进程的快照,从而获取进程名及进程ID(没找到如何通过这种方法获取进程路径)

注:此代码转自  王艳平:Windows程序设计(第二版)

[cpp]  view plain copy
  1. #include "stdafx.h"  
  2. #include <windows.h>  
  3. #include <tlhelp32.h> // 声明快照函数的头文件  
  4.   
  5. int main(int argc, char* argv[])  
  6. {  
  7.     PROCESSENTRY32 pe32;  
  8.     // 在使用这个结构之前,先设置它的大小  
  9.     pe32.dwSize = sizeof(pe32);   
  10.       
  11.     // 给系统内的所有进程拍一个快照  
  12.     HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);  
  13.     if(hProcessSnap == INVALID_HANDLE_VALUE)  
  14.     {  
  15.         printf(" CreateToolhelp32Snapshot调用失败! \n");  
  16.         return -1;  
  17.     }  
  18.       
  19.     // 遍历进程快照,轮流显示每个进程的信息  
  20.     BOOL bMore = ::Process32First(hProcessSnap, &pe32);  
  21.     while(bMore)  
  22.     {  
  23.         printf(" 进程名称:%s \n", pe32.szExeFile);  
  24.         printf(" 进程ID号:%u \n\n", pe32.th32ProcessID);  
  25.   
  26.         bMore = ::Process32Next(hProcessSnap, &pe32);  
  27.     }  
  28.   
  29.     // 不要忘记清除掉snapshot对象  
  30.     ::CloseHandle(hProcessSnap);  
  31.     return 0;  
  32. }  

你可能感兴趣的:(编程技术)