作者:陆麟
转载请征得作者同意.
2000.6.7
多谢观赏.:)
/*+++
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;
}
}
}