这些天为了调试一个程序不得不查看一些系统进程信息,所以为了方便调试也就写了一个进程察看的小程序,原理其实比较简单,首先获得系统进程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 ); 
  
  
  
  
  
intint
{ 
  
     GetProcessList(); 
  
     printf("/n系统进程全部列举完毕!/n"); 
  
     system("pause"); 
  
     return
} 
  
  
  
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
     } 
  
  
  
     pe32.dwSize = sizeof(PROCESSENTRY32); 
  
  
  
     if(!Process32First(hProcessSnapshot,&pe32)) 
  
     { 
  
          printError("Process32First" ); 
  
          CloseHandle(hProcessSnapshot); //注意!不使用时一定不要忘记释放句柄!!! 
  
         return
     } 
  
  
  
     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
} 
  
  
  
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
     } 
  
  
  
     if(!Module32First(hModuleSnapshot,&me32)) 
  
     { 
  
          printError(" Module32First错误!"); 
  
          CloseHandle(hModuleSnapshot); //注意!不使用时一定不要忘记释放句柄!!! 
  
         return
     } 
  
  
  
     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
} 
  
  
  
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
  
  
} 
  
  
  
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 ); 
  
}