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

19 篇文章 4 订阅

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

分类: 编程技术   3220人阅读  评论(3)  收藏  举报

通过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. }  

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Linux环境下,我们可以通过进程ID(PID)来获取指定进程进程名。 要实现这个功能,可以使用系统调用函数`prctl()`,该函数是进程控制相关的函数之一。`prctl()`的原型如下: ```c int prctl(int option, unsigned long arg2, unsigned long arg3, unsigned long arg4, unsigned long arg5); ``` 其中,`option`参数指定了要进行的控制操作。对于获取进程名,我们可以使用`PR_GET_NAME`选项。 具体实现步骤如下: 1. 包含头文件`<sys/prctl.h>`。 2. 调用`prctl()`函数,传入参数`PR_GET_NAME`,并将进程名存储在一个字符数组中。 3. 如果`prctl()`函数返回0,则表示获取进程名成功,可以通过输出字符数组来打印出进程名。 示例代码如下: ```c #include <sys/prctl.h> #include <stdio.h> int main() { char process_name[16]; // 定义一个字符数组来存储进程名 if(prctl(PR_GET_NAME, process_name) == 0) { printf("Process name: %s\n", process_name); } else { printf("Failed to get process name.\n"); } return 0; } ``` 上述代码中,我们定义了一个大小为16的字符数组`process_name`,用于存储获取到的进程名。然后通过调用`prctl()`函数并传入`PR_GET_NAME`选项,将进程名存储在`process_name`中。最后,通过输出字符数组来打印出进程名。 需要注意的是,上述代码是获取当前进程进程名。如果要获取指定进程ID的进程名,需要先根据进程ID使用函数`kill(pid, 0)`来判断该进程是否存在,若存在再使用`prctl()`函数获取进程名。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值