45fan.com - 路饭网

搜索: 您的位置主页 > 电脑频道 > 电脑教程 > 阅读资讯:获得系统进程信息的方法

获得系统进程信息的方法

2016-08-30 16:59:28 来源:www.45fan.com 【

获得系统进程信息的方法

这些天为了调试一个程序不得不查看一些系统进程信息,所以为了方便调试也就写了一个进程察看的小程序,原理其实比较简单,首先获得系统进程ID,然后再列举该ID的几个ModleThread信息。在这里我现的要介绍一下系统内核函数Toolhelp,使用这个函数前必须在头文件里包含tlhelp32.h头文件。然后再调用CreateToolhelp32Snapshot()函数获得一个系统进程的句柄。然后通过这个句柄来列出该进程的ModuleThread信息。下面我分别介绍一下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
Tags: 系统 获得 进程
编辑:路饭网
关于我们 | 联系我们 | 友情链接 | 网站地图 | Sitemap | App | 返回顶部