通过PID获取进程路径和进程名的两种方法
2014-05-26 10:06
483 查看
通过PID获取进程路径和进程名的两种方法
分类: 编程技术2012-04-2510: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;
}
相关文章推荐
- 通过PID获取进程路径和进程名的两种方法
- 通过PID获取进程路径和进程名的两种方法
- 通过PID获取进程路径的几种方法
- VC下通过进程ID获取进程镜像文件路径的方法及其存在的缺陷
- 通过获取系统进程快照获取进程pid以及杀进程(win下获取进程名和linux下获取进程路径)
- Atitit,通过pid获取进程文件路径 java php c#.net版本大总结
- linux获取一个进程pid的父进程的两种方法
- 获取JAVA当前进程PID的两种方法
- 通过PID获取进程路径
- Atitit,通过pid获取进程文件路径 java php c#.net版本大总结
- Visual Basic 通过PID获取进程文件路径
- Atitit,通过pid获取进程文件路径 java php c#.net版本大总结
- CMD魔法堂:获取进程路径和PID值的方法集
- [linux]centos下通过pid查看进程的绝对路径的方法
- 使用python 获取进程pid号的方法
- c#通过进程名字获取进程路径
- 在内核态通过PID获取进程名!!
- android系统通过图片绝对路径获取URI的三种方法
- 获取沙盒文件路径的两种方法的区别
- 通过PID获取进程相关信息,如cmdline