历遍进程(9X版)

作者:陆麟
转载请征得作者同意.
2000.6.7



一直有人写MAIL.如何历遍进程.很显然,NT和9X是不同的.
OS支持的接口为:9X:TOOLHELP32,NT:PSAPI,2000:BOTH TOOLHELP AND PSAPI.
这几天就写个DEMO上来.大家看看关键的部分吧.等写完了.编译好的版本放在UTILITYS栏里.这里不贴完整的代码.但是可以看到核心部分.而且看本例程可以看到VC的TRY,FINALLY的用法.

多谢观赏.:)
/*+++
9xProcessInfo.cpp
Written by Lu Lin 2000.6.2
Abstract:
 main programme for enumerateing informations in WIN9X
---*/

//
//Headers
//
#include <windows.h>
#include "procex.h"

//
//External vars
//
extern char ostype[];

//
//Func prototype
//
typedef HANDLE (WINAPI *_CreateToolhelp32Snapshot)
     (DWORD dwFlags,DWORD th32ProcessID);
typedef BOOL (WINAPI *_Process32First)
     (HANDLE hSnapshot,LPPROCESSENTRY32 lppe);
typedef BOOL (WINAPI *_Process32Next)
     (HANDLE hSnapshot,LPPROCESSENTRY32 lppe);
typedef BOOL (WINAPI *_Module32First)
     (HANDLE hSnapshot,LPMODULEENTRY32 lpme);
typedef BOOL (WINAPI *_Module32Next)
     (HANDLE hSnapshot,LPMODULEENTRY32 lpme);
typedef BOOL (WINAPI *_Thread32First)
     (HANDLE hSnapshot,LPTHREADENTRY32 lpte);
typedef BOOL (WINAPI *_Thread32Next)
     (HANDLE hSnapshot,LPTHREADENTRY32 lpte);
 

//Global vars
_CreateToolhelp32Snapshot pCreateToolhelp32Snapshot;
_Process32First pProcess32First;
_Process32Next pProcess32Next;
_Module32First pModule32First;
_Module32Next pModule32Next;
_Thread32First pThread32First;
_Thread32Next pThread32Next;

HANDLE h; //handle to snapshoot
PROCS procs; //Header of PROCESSENTRY32 struct

//
//Init function: get all proc address
//
BOOL Init(){
 BOOL ret=0;
 __try{
  //
  //Get the TOOLHELP32 func addresses
  //
  pCreateToolhelp32Snapshot=(_CreateToolhelp32Snapshot)
   GetProcAddress(GetModuleHandle("KERNEL32"),
   "CreateToolhelp32Snapshot");
  pProcess32First=(_Process32First)
   GetProcAddress(GetModuleHandle("KERNEL32"),
   "Process32First");
  pProcess32Next=(_Process32Next)
   GetProcAddress(GetModuleHandle("KERNEL32"),
   "Process32Next");
  pModule32First=(_Module32First)
   GetProcAddress(GetModuleHandle("KERNEL32"),
   "Module32First");
  pModule32Next=(_Module32Next)
   GetProcAddress(GetModuleHandle("KERNEL32"),
   "Module32Next");
  pThread32First=(_Thread32First)
   GetProcAddress(GetModuleHandle("KERNEL32"),
   "Thread32First");
  pThread32Next=(_Thread32Next)
   GetProcAddress(GetModuleHandle("KERNEL32"),
   "Thread32Next");

  if ((!(UINT)pCreateToolhelp32Snapshot)||
   (!(UINT)pProcess32First)||
   (!(UINT)pProcess32Next)||
   (!(UINT)pModule32First)||
   (!(UINT)pModule32Next)||
   (!(UINT)pThread32First)||
   (!(UINT)pThread32Next)){
   MessageBox(0,
    "Can't locate ToolHelp32 functions!",
    "Error",
    MB_OK);
   __leave;
  }

  ZeroMemory(&procs,sizeof(procs));
  ret=1;
 }
 __finally{
  return ret;
 }
}
 

//
//GetModuleInfo gets module information
//
BOOL GetModuleInfo(PPROCS p){
 HANDLE hm;
 MODULEENTRY32 me;
 PMODULES pm;
 BOOL ret=0;
 __try{
  hm=pCreateToolhelp32Snapshot(TH32CS_SNAPMODULE,
   p->ProcessEntry32.th32ProcessID);
  if (hm==(HANDLE)-1){
   __leave;
  }
  ZeroMemory(&me,sizeof(me));
  me.dwSize=sizeof(me);
  if (!pModule32First(hm,&me)){
   __leave;
  }
  pm=&p->Modules;
  pm->ModuleEntry32=me;
  while (pModule32Next(hm,&me)){
   pm->pNextModule=new MODULES;
   pm=pm->pNextModule;
   if (!pm){
    __leave;
   }
   ZeroMemory(pm,sizeof(MODULES));
   pm->ModuleEntry32=me;
  }
  ret=1;
 }
 __finally{
  if (hm!=(HANDLE)-1){
   CloseHandle(hm);
  }
  return ret;
 }
}
 

//
//Win9xProcessInfo enumerates Process
//
void Win9xProcessInfo(){
 PPROCS p,q;
 //VAR for storing temp ProcessEntry32
 PROCESSENTRY32 ProcessEntry32;
 __try{
  if (!Init()){
   __leave;
  }

  //
  //Get primary snapshot of system
  //
  h=pCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  if (h==(HANDLE)-1){
   MessageBox(0,
    "CreateToolHelp32Snapshot return 0!",
    "Error",
    MB_OK);
   __leave;
  }

  ZeroMemory(&ProcessEntry32,sizeof(ProcessEntry32));
  ProcessEntry32.dwSize=sizeof(ProcessEntry32);
  if (!pProcess32First(h,&ProcessEntry32)){
   __leave;
  }

  p=&procs;
  p->ProcessEntry32=ProcessEntry32;
  GetModuleInfo(p);
  while(pProcess32Next(h,&ProcessEntry32)){
   p->pNextProc=new PROCS;
   p=p->pNextProc;
   if (!p){
    __leave;
   }
   ZeroMemory(p,sizeof(PROCS));
   p->ProcessEntry32=ProcessEntry32;
   GetModuleInfo(p);
   };
  MessageBox(0,"Done",ostype,MB_OK);
 }
 __finally{
  PMODULES pma,pmb;
  if (h!=(HANDLE)-1) CloseHandle(h);
  p=procs.pNextProc;
  while (p){
   pma=p->Modules.pNextModule;
   while(pma){
    pmb=pma->pNextModule;
    delete pma;
    pma=pmb;
   }
   q=p->pNextProc;
   delete p;
   p=q;

  }
 }
}