www.pudn.com > HookAPI > ProcessModule.cpp
#include#include #ifdef WINNT #include "psapi.h" #endif #include "ProcessModule.h" #include "util.h" CProcessModule::CProcessModule() { m_dwProcessCount =0; m_nModCount =0; /*#ifdef WINNT m_hProcess =NULL; m_hLib =NULL; m_pEnumProcesses =NULL; // api EnumProcesses() m_pEnumProcessModules =NULL; // api EnumProcessModules() m_pGetModuleBaseName =NULL; // api GetModuleBaseName() #else*/ memset(&m_mod_name, 0, sizeof(m_mod_name)); //#endif /*#ifdef WINNT m_hLib = LoadLibrary("psapi.dll"); if (m_hLib == NULL) return; m_pEnumProcesses = (ENUMPROCESSES_PROC)GetProcAddress(m_hLib, "EnumProcesses"); if (m_pEnumProcesses == NULL) { FreeLibrary(m_hLib); m_hLib =NULL; } m_pEnumProcessModules = (ENUMPROCESSMODULES_PROC)GetProcAddress(m_hLib, "EnumProcessModules"); if (m_pEnumProcessModules == NULL) { FreeLibrary(m_hLib); m_hLib =NULL; } m_pGetModuleBaseName = (GETMODULEBASENAME_PROC)GetProcAddress(m_hLib, "GetModuleBaseNameA"); if (m_pGetModuleBaseName == NULL) { FreeLibrary(m_hLib); m_hLib =NULL; } #else*/ HMODULE hModule = GetModuleHandle("kernel32.dll"); if (hModule == NULL) return; pCreateToolhelp32Snapshot = (CREATETOOLHELP32SNAPSHOT_PROC)GetProcAddress(hModule, "CreateToolhelp32Snapshot"); if (pCreateToolhelp32Snapshot == NULL) return; pProcess32First = (PROCESS32FIRST_PROC)GetProcAddress(hModule, "Process32First"); if (pProcess32First == NULL) return; pProcess32Next = (PROCESS32NEXT_PROC)GetProcAddress(hModule, "Process32Next"); if (pProcess32Next == NULL) return; pModule32First = (MODULE32FIRST_PROC)GetProcAddress(hModule, "Module32First"); if (pModule32First == NULL) return; pModule32Next = (MODULE32NEXT_PROC)GetProcAddress(hModule, "Module32Next"); if (pModule32Next == NULL) return; //#endif } CProcessModule::~CProcessModule() { /*#ifdef WINNT if(m_hLib) { FreeLibrary(m_hLib); m_hLib =NULL; } #endif*/ } int CProcessModule::EnumProcess() { m_dwProcessCount =0; /*#ifdef WINNT DWORD dwBytesNeeded; if(!m_pEnumProcesses(&m_dwProcessIDs[0], sizeof(m_dwProcessIDs), &dwBytesNeeded)) return -1; m_dwProcessCount = dwBytesNeeded / sizeof(DWORD); #else*/ HANDLE hSnapShot; PROCESSENTRY32 ProcessEntry32; //MODULEENTRY32 ModuleEntry32; BOOL Result; //char *pszExtension; hSnapShot = pCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapShot == (HANDLE)-1) return false; ProcessEntry32.dwSize = sizeof(PROCESSENTRY32); Result = pProcess32First(hSnapShot, &ProcessEntry32); if (Result != TRUE) { CloseHandle(hSnapShot); return false; } do { //HMODULE hMod =GetModuleHandle(ProcessEntry32.szExeFile); //WriteLog("process:%s, id:%x, module id:%x", // ProcessEntry32.szExeFile, ProcessEntry32.th32ProcessID, // ProcessEntry32.th32ModuleID); m_dwProcessIDs[m_dwProcessCount] = ProcessEntry32.th32ProcessID; m_dwProcessCount ++; } while (pProcess32Next(hSnapShot, &ProcessEntry32) && m_dwProcessCount < MAX_PROCESS_COUNT); CloseHandle(hSnapShot); //#endif return m_dwProcessCount; } int CProcessModule::EnumProcessModules(DWORD process_id) { m_nModCount =0; /*#ifdef WINNT DWORD cbNeeded; if(m_hProcess) CloseHandle(m_hProcess); m_hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, process_id); if (m_hProcess == NULL) return -1; if(!m_pEnumProcessModules(m_hProcess, m_hMods, sizeof(m_hMods), &cbNeeded)) { char err_msg[256]; DWORD err=GetLastError(); GetErrString(err_msg, sizeof(err_msg), err); WriteLog("failed to EnumProcessModules, err=%d-%s", err, err_msg); CloseHandle(m_hProcess); return 0; } m_nModCount =cbNeeded / sizeof(HMODULE); #else*/ HANDLE hSnapShot; MODULEENTRY32 ModuleEntry32; BOOL Result; hSnapShot = pCreateToolhelp32Snapshot(TH32CS_SNAPMODULE, process_id); if (hSnapShot == (HANDLE)-1) return -1; ModuleEntry32.dwSize = sizeof(MODULEENTRY32); Result = pModule32First(hSnapShot, &ModuleEntry32); if (Result != TRUE) { CloseHandle(hSnapShot); return -1; } do { strcpy(m_mod_name[m_nModCount], ModuleEntry32.szModule); m_hMods[m_nModCount] =ModuleEntry32.hModule; m_nModCount++; } while (pModule32Next(hSnapShot, &ModuleEntry32) && m_nModCount