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

通过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 (.)

#include <iostream>
#include <windows.h>
#include "Psapi.h"
#pragma comment (lib,"Psapi.lib")
using namespace std;


BOOL EnablePrivilege(HANDLE hToken,LPCSTR szPrivName);

void main()
{
	char	path[_MAX_PATH+1]="";
	char	drive[_MAX_DRIVE];
	char	dir[_MAX_DIR];
	char	fname[_MAX_FNAME];
	char	ext[_MAX_EXT];
	DWORD	ProcessID;
	HANDLE	hToken;

	
	//提升程序权限
	OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken);
	EnablePrivilege(hToken,SE_DEBUG_NAME);
	

	while(1)
	{
		cin>>ProcessID;

		//处理系统函数
		if (ProcessID==4)
		{
			cout<<"system"<<endl<<""<<endl;
			continue;
		}



		HANDLE h_Process=OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ,FALSE,ProcessID);

		if (!h_Process)
		{
			cout<<"error_process"<<endl;
			return;
		}

		GetModuleFileNameEx(h_Process,NULL,path,MAX_PATH+1);

		cout<<path<<endl;

		_splitpath(path, drive, dir, fname, ext );

		wsprintf(fname,"%s%s",fname,ext);
		cout<<fname<<endl;
	}

}


//提升权限函数
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) );
	
}



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

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

#include "stdafx.h"
#include <windows.h>
#include <tlhelp32.h> // 声明快照函数的头文件

int main(int argc, char* argv[])
{
	PROCESSENTRY32 pe32;
	// 在使用这个结构之前,先设置它的大小
	pe32.dwSize = sizeof(pe32); 
	
	// 给系统内的所有进程拍一个快照
	HANDLE hProcessSnap = ::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if(hProcessSnap == INVALID_HANDLE_VALUE)
	{
		printf(" CreateToolhelp32Snapshot调用失败! \n");
		return -1;
	}
	
	// 遍历进程快照,轮流显示每个进程的信息
	BOOL bMore = ::Process32First(hProcessSnap, &pe32);
	while(bMore)
	{
		printf(" 进程名称:%s \n", pe32.szExeFile);
		printf(" 进程ID号:%u \n\n", pe32.th32ProcessID);

		bMore = ::Process32Next(hProcessSnap, &pe32);
	}

	// 不要忘记清除掉snapshot对象
	::CloseHandle(hProcessSnap);
	return 0;
}




  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在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()`函数获取进程
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值