看流星社区

 找回密码
 注册账号
查看: 2335|回复: 0

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

[复制链接]

该用户从未签到

发表于 2015-5-13 09:29:05 | 显示全部楼层 |阅读模式
#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;
}
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-24 03:51

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表