Files
Work/psapint/psapi95.cpp
2024-08-07 09:16:27 -04:00

105 lines
3.9 KiB
C++

#include <psapint/psapi95.hpp>
#include <psapint/procentry.hpp>
#include <psapint/modentry.hpp>
#include <common/block.hpp>
ProcessAPI95::ProcessAPI95(void)
: mpfnProcess32First(0), mpfnProcess32Next(0), mpfnModule32First(0), mpfnModule32Next(0),
mpfnCreateToolhelp32Snapshot(0), mLibrary("KERNEL32.DLL")
{
if(!mLibrary.isOkay())return;
mpfnProcess32First=(PFNPROCESS32FIRST)mLibrary.procAddress("Process32First");
mpfnProcess32Next=(PFNPROCESS32NEXT)mLibrary.procAddress("Process32Next");
mpfnModule32First=(PFNMODULE32FIRST)mLibrary.procAddress("Module32First");
mpfnModule32Next=(PFNMODULE32NEXT)mLibrary.procAddress("Module32Next");
mpfnCreateToolhelp32Snapshot=(PFNCREATETOOLHELP32SNAPSHOT)mLibrary.procAddress("CreateToolhelp32Snapshot");
}
ProcessAPI95::ProcessAPI95(const ProcessAPI95 &/*someProcessAPI*/)
{ // private implementation
}
ProcessAPI95::~ProcessAPI95()
{
}
ProcessAPI95 &ProcessAPI95::operator=(const ProcessAPI95 &/*someProcessAPI*/)
{ // private implementation
return *this;
}
bool ProcessAPI95::enumProcesses(ProcessInfoList &processInfoList)
{
ProcessEntry processEntry;
Block<ProcessInfo> processInfoBlock;
HANDLE hSnapshot;
processInfoList.size(0);
if(!isOkay())return false;
hSnapshot=mpfnCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS|TH32CS_SNAPMODULE,0);
if(-1==(int)hSnapshot)return false;
if(mpfnProcess32First(hSnapshot,&processEntry.getPROCESSENTRY()))
{
processInfoBlock.insert(&ProcessInfo());
ProcessInfo &processInfo=processInfoBlock[processInfoBlock.size()-1];
processInfo.processID(processEntry.processID());
enumProcessModules(processInfo.processID(),processEntry,processInfo);
while(mpfnProcess32Next(hSnapshot,&processEntry.getPROCESSENTRY()))
{
processInfoBlock.insert(&ProcessInfo());
ProcessInfo &processInfo=processInfoBlock[processInfoBlock.size()-1];
processInfo.processID(processEntry.processID());
enumProcessModules(processInfo.processID(),processEntry,processInfo);
}
}
::CloseHandle(hSnapshot);
processInfoList.size(processInfoBlock.size());
for(int index=0;index<processInfoBlock.size();index++)processInfoList[index]=processInfoBlock[index];
return processInfoList.size()?true:false;
}
bool ProcessAPI95::enumProcessModules(const ProcessID &processID,ProcessEntry &processEntry,ModuleInfoList &moduleInfoList)
{
ModuleEntry moduleEntry;
Block<ModuleInfo> moduleInfoBlock;
HANDLE hSnapshot;
moduleInfoList.size(0);
if(!isOkay())return false;
hSnapshot=mpfnCreateToolhelp32Snapshot(TH32CS_SNAPMODULE,processID.processID());
moduleEntry.processID(processID.processID());
moduleInfoBlock.insert(&ModuleInfo());
ModuleInfo &moduleInfo=moduleInfoBlock[moduleInfoBlock.size()-1];
moduleInfo.module((HINSTANCE)processID.processID());
moduleInfo.moduleBaseName(processEntry.strExeFile());
moduleInfo.moduleFileName(processEntry.strExeFile());
if(mpfnModule32First(hSnapshot,&moduleEntry.getMODULEENTRY()))
{
if(!(moduleEntry.strExePath()==processEntry.strExeFile()))
{
moduleInfoBlock.insert(&ModuleInfo());
ModuleInfo &moduleInfo=moduleInfoBlock[moduleInfoBlock.size()-1];
moduleInfo.module(moduleEntry.module());
moduleInfo.moduleBaseName(moduleEntry.strModule());
moduleInfo.moduleFileName(moduleEntry.strExePath());
}
moduleEntry.processID(processID.processID());
while(mpfnModule32Next(hSnapshot,&moduleEntry.getMODULEENTRY()))
{
if(!(moduleEntry.strExePath()==processEntry.strExeFile()))
{
moduleInfoBlock.insert(&ModuleInfo());
ModuleInfo &moduleInfo=moduleInfoBlock[moduleInfoBlock.size()-1];
moduleInfo.module(moduleEntry.module());
moduleInfo.moduleBaseName(moduleEntry.strModule());
moduleInfo.moduleFileName(moduleEntry.strExePath());
}
moduleEntry.processID(processID.processID());
}
}
::CloseHandle(hSnapshot);
moduleInfoList.size(moduleInfoBlock.size());
for(int index=0;index<moduleInfoBlock.size();index++)moduleInfoList[index]=moduleInfoBlock[index];
return moduleInfoList.size()?true:false;
}