您的位置:首页 > 其它

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

2014-05-26 10:06 483 查看


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

分类: 编程技术2012-04-25
10:54 3220人阅读 评论(3) 收藏 举报

extensionpathnulltokenextwindows

通过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
plaincopy

#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程序设计(第二版)

[cpp] view
plaincopy

#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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: