您的位置:首页 > 其它

枚举进程的两种方式

2015-07-22 15:34 190 查看
#include "stdafx.h"

#include <windows.h>

#include <TlHelp32.h>

#include <Psapi.h>

#include <process.h>

#pragma comment(lib, "Psapi.lib")

int main(int argc, char* argv[])

{

//系统快照获取系统信息

// 创建一个当前系统的快照

HANDLE hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

if (INVALID_HANDLE_VALUE == hProcessSnap)

{

return 1;

}

/*

typedef struct tagPROCESSENTRY32 {

DWORD dwSize; // 结构大小;

DWORD cntUsage; // 此进程的引用计数;

DWORD th32ProcessID; // 进程ID;

DWORD th32DefaultHeapID; // 进程默认堆ID;

DWORD th32ModuleID; // 进程模块ID;

DWORD cntThreads; // 此进程开启的线程计数;

DWORD th32ParentProcessID;// 父进程ID;

LONG pcPriClassBase; // 线程优先权;

DWORD dwFlags; // 保留;

char szExeFile[MAX_PATH]; // 进程全名;

} PROCESSENTRY32;

*/

PROCESSENTRY32W pe32 = { 0 };

pe32.dwSize = sizeof(PROCESSENTRY32W);

//是否获取到了第一条消息

// 获取到了bNext = true

// 没有获取到bNext = false

bool bNext = Process32FirstW(hProcessSnap, &pe32);

if(!bNext)

{

printf(" Process32First失败,错误ID:%d", GetLastError());

}

// 是否还有下一条

// 遍历下一条的信息

while(bNext)

{

printf("进程名:%30ws\t进程ID:%5d\r\n", pe32.szExeFile, pe32.th32ProcessID);

bNext = Process32NextW(hProcessSnap, &pe32);

}

printf("*******************************************************\r\n");

//枚举 只能获取进程的ID 和 进程模块的路径

DWORD dwProcessIDs[MAXBYTE] = { 0 };

DWORD cdNeededProcess = 0;

//32位程序的信息 XP Win7下面

/* OpenProcess dwDesiredAccess: 指定打开后,该进程的访问权限

PROCESS_ALL_ACCESS 给予进程所有可能允许的权限.

PROCESS_DUP_HANDLE允许使用DuplicateHandle函数进行进程句柄的复制操作.

PROCESS_QUERY_INFORMATION允许函数GetExitCodeProcess 或函数GetPriorityClass functions 查询进程的信息时使用该句柄.

PROCESS_SET_INFORMATION允许函数SetPriorityClass使用此句柄进行优先级设置.

PROCESS_TERMINATE允许函数TerminateProcess 使用此句柄关闭进程.

PROCESS_VM_OPERATION 允许函数VirtualProtectEx使用此句柄修改进程的虚拟内存.

PROCESS_VM_READ or PROCESS_VM_WRITE 允许函数访问和写入权限

SYNCHRONIZE Windows NT 专用: 允许同步函数使用此句柄.

*/

//枚举

if (!EnumProcesses(dwProcessIDs, MAXBYTE, &cdNeededProcess))

return 1;

for(int index = 0; index < cdNeededProcess / sizeof(DWORD); ++index)

{

HANDLE hPrcoess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessIDs[index]);

if(NULL == hPrcoess)

{

}

else

{

//获得指定进程中所有模块的句柄

HMODULE hMods[MAXBYTE] = { 0 };

DWORD cdNeededModule = 0;

EnumProcessModules(hPrcoess, hMods, MAXBYTE, &cdNeededModule);

//获取指定进程模块的路径

char szModuleName[MAXBYTE] = { 0 };

GetModuleFileNameExA(hPrcoess, hMods[0], szModuleName, MAXBYTE);

printf("进程名:%s\t进程ID:%5d\r\n", szModuleName, dwProcessIDs[index]);

}

CloseHandle(hPrcoess);

}

system("pause");

return 0;

}

#include <Psapi.h>

#include <process.h>

#pragma comment(lib, "Psapi.lib")

这个需要到Microsoft Platform SDK里面去获取
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: