获得系统进程信息的方法
这些天为了调试一个程序不得不查看一些系统进程信息,所以为了方便调试也就写了一个进程察看的小程序,原理其实比较简单,首先获得系统进程ID,然后再列举该ID的几个Modle和Thread信息。在这里我现的要介绍一下系统内核函数Toolhelp,使用这个函数前必须在头文件里包含tlhelp32.h头文件。然后再调用CreateToolhelp32Snapshot()函数获得一个系统进程的句柄。然后通过这个句柄来列出该进程的Module和Thread信息。下面我分别介绍一下Toolhelp里的几个重要函数。
HANDLE CreateToolhelp32Snapshot()函数
参数:DWORD dwFlags 标志返回句柄时该句柄所包含的信息。
这里我用到了一下三个标志信息:
TH32CS_SNAPPROCESS:返回句柄包含系统所有进程信息
TH32CS_SNAPMODULE:返回句柄柄包含所有指定进程的Module信息
TH32CS_SNAPTHREAD:返回句柄包含指定进程的所有Thread信息
参数:DWORD th32ProcessID 指定的进程ID号,如果为空指定为当前进程
作用:产生一个Snapshot
BOOL Process32First()函数
参数:HANDLE hSnapshot 传入的Snapshot句柄
参数:LPPROCESSENTRY32 lppe 指向PROCESSENTRY32结构的指针
作用:从Snapshot得到第一个进程记录信息
BOOL Process32Next()函数
参数:HANDLE hSnapshot 传入的Snapshot句柄
参数:LPPROCESSENTRY32 lppe 指向PROCESSENTRY32结构的指针
作用:从Snapshot得到下一个进程记录信息
BOOL Module32First()函数
参数:HANDLE hSnapshot传入的Snapshot句柄
参数:LPMODULEENTRY3 lpme 指向一个 MODULEENTRY32结构的指针
作用:从Snapshot得到第一个Module记录信息
BOOL Module32Next()函数
参数:HANDLE hSnapshot传入的Snapshot句柄
参数:LPMODULEENTRY3 lpme 指向一个 MODULEENTRY32结构的指针
作用:从Snapshot得到下一个Module记录信息
BOOL Thread32First()函数
参数:HANDLE hSnapshot传入的Snapshot句柄
参数:LPTHREADENTRY32 lpte指向一个 THREADENTRY32结构的指针
作用:从Snapshot得到第一个Thread记录信息
BOOL Thread32Next()函数
参数:HANDLE hSnapshot传入的Snapshot句柄
参数:LPTHREADENTRY32 lpte指向一个 THREADENTRY32结构的指针
作用:从Snapshot得到下一个Thread记录信息
HANDLE OpenProcess()函数
参数:DWORD dwDesiredAccess 权限描叙信息
这里我用到了PROCESS_ALL_ACCESS功能是具有所有权限
参数:BOOL bInheritHandle 确定该句柄是否可以被程继承
参数:dwPrcessID 进程ID号
作用:打开一个存在的进程对象
以下是测试代码:
测试环境:VC++7.0
操作系统:Windows2000 Professional sp4
程序功能:列举当前系统所有进程以及该进程的Module和Thread信息
///////////////////////////////////////////////////////////////////////////////
// //
// 模块: ProcessTest.cpp //
// 开发日期: 2004年11月11日 //
// 最后修改日期: 2004年11月11日 //
// 说明: Copyright (c) 2004 姜江 //
// //
///////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include <windows.h>
#include <tlhelp32.h>
#include <stdio.h>
BOOL GetProcessList( );
BOOL ListProcessModules( DWORD dwPID );
BOOL ListProcessThreads( DWORD dwOwnerPID );
void printError( TCHAR* msg );
int _tmain(int argc, _TCHAR* argv[])
{
GetProcessList();
printf("/n系统进程全部列举完毕!/n");
system("pause");
return 0;
}
BOOL GetProcessList()
{
system("cls");
HANDLE hProcessSnapshot = INVALID_HANDLE_VALUE;
HANDLE hProcess = NULL;
PROCESSENTRY32 pe32;
DWORD dwPriorityClass;
hProcessSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if(hProcessSnapshot == INVALID_HANDLE_VALUE)
{
printError( "CreateToolhelp32Snapshot (of processes)" );
return (FALSE);
}
pe32.dwSize = sizeof(PROCESSENTRY32);
if(!Process32First(hProcessSnapshot,&pe32))
{
printError("Process32First" );
CloseHandle(hProcessSnapshot); //注意!不使用时一定不要忘记释放句柄!!!
return (FALSE);
}
do
{
printf( "/n/n=====================================================" );
printf( "/n进程名: %s",pe32.szExeFile);
printf( "/n-----------------------------------------------------" );
dwPriorityClass = 0;
hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe32.th32ProcessID);
if(hProcess == NULL)
{
printError( "打开进程错误!" );
}
else
{
dwPriorityClass = GetPriorityClass(hProcess);
if(!dwPriorityClass)
printError( "获得优先权等级错误!" );
CloseHandle(hProcess); //注意!不使用时一定不要忘记释放句柄!!!
}
printf( "/n 进程ID: 0x%08x",pe32.th32ProcessID);
printf( "/n 线程计数: %d",pe32.cntThreads);
printf( "/n 父进程ID: 0x%08x",pe32.th32ParentProcessID);
printf( "/n 基本优先级:%d",pe32.pcPriClassBase);
if(dwPriorityClass)
{
printf( "/n 进程优先级:%d",dwPriorityClass);
}
ListProcessModules( pe32.th32ProcessID );
ListProcessThreads( pe32.th32ProcessID );
printf("/n");
system("pause");
}
while(Process32Next(hProcessSnapshot,&pe32));
CloseHandle(hProcessSnapshot); //注意!不使用时一定不要忘记释放句柄!!!
return (TRUE);
}
BOOL ListProcessModules( DWORD dwPID )
{
HANDLE hModuleSnapshot = INVALID_HANDLE_VALUE;
MODULEENTRY32 me32;
me32.dwSize = sizeof(MODULEENTRY32);
hModuleSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,dwPID);
if(hModuleSnapshot == INVALID_HANDLE_VALUE)
{
printError("CreateToolhelp32Snapshot (of modules)" );
return (FALSE);
}
if(!Module32First(hModuleSnapshot,&me32))
{
printError(" Module32First错误!");
CloseHandle(hModuleSnapshot); //注意!不使用时一定不要忘记释放句柄!!!
return (FALSE);
}
do
{
printf( "/n/n 模块名: %s",me32.szModule );
printf( "/n 运行路径: %s",me32.szExePath );
printf( "/n 进程ID: 0x%08X", me32.th32ProcessID );
printf( "/n 全局计数值:0x%04X",me32.GlblcntUsage );
printf( "/n 进程计数值:0x%04X",me32.ProccntUsage );
printf( "/n 基地址: 0x%08X",(DWORD) me32.modBaseAddr );
printf( "/n 基地址大小:%d",me32.modBaseSize );
}
while(Module32Next(hModuleSnapshot,&me32));
CloseHandle(hModuleSnapshot); //注意!不使用时一定不要忘记释放句柄!!!
return (TRUE);
}
BOOL ListProcessThreads( DWORD dwOwnerPID )
{
本文地址:http://www.45fan.com/dnjc/69895.html