如何获得系统进程信息

 这些天为了调试一个程序不得不查看一些系统进程信息,所以为了方便调试也就写了一个进程察看的小程序,原理其实比较简单,首先获得系统进程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 )

{

     HANDLE hProcessThread = INVALID_HANDLE_VALUE;

     THREADENTRY32 te32;

     te32.dwSize = sizeof( THREADENTRY32 );

 

     hProcessThread = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD,dwOwnerPID);

     if(hProcessThread == INVALID_HANDLE_VALUE)

     {

          return( FALSE );

     }

 

     if(!Thread32First(hProcessThread,&te32))

     {

          printError( "Thread32First" );

          CloseHandle( hProcessThread ); 

          return( FALSE );

     }

 

     do

     {

          if(te32.th32OwnerProcessID == dwOwnerPID)

         {

              printf( "/n/n 线程ID: 0x%08X", te32.th32ThreadID );

             printf( "/n 基优先级: %d", te32.tpBasePri );

         }

     }

     while(Thread32Next(hProcessThread,&te32));

 

     CloseHandle(hProcessThread);

     return (TRUE);

 

}

 

void printError( TCHAR* msg )

{

  DWORD eNum;

  TCHAR sysMsg[256];

  TCHAR* p;

 

  eNum = GetLastError( );

  FormatMessage( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,

         NULL, eNum,

         MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),

         sysMsg, 256, NULL );

  p = sysMsg;

  while( ( *p > 31 ) || ( *p == 9 ) )

    ++p;

  do { *p-- = 0; } while( ( p >= sysMsg ) &&

                          ( ( *p == '.' ) || ( *p < 33 ) ) );

  printf( "/n  WARNING: %s failed with error %d (%s)", msg, eNum, sysMsg );

}

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值