Initial
This commit is contained in:
104
psapint/psapi95.cpp
Normal file
104
psapint/psapi95.cpp
Normal file
@@ -0,0 +1,104 @@
|
||||
#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;
|
||||
}
|
||||
Reference in New Issue
Block a user