Files
Work/remoteps/RemoteProcessImpl.cpp
2024-08-07 09:16:27 -04:00

187 lines
5.7 KiB
C++

#include <remoteps/remoteprocessimpl.hpp>
#include <psapint/psapi.hpp>
#include <psapint/psapi95.hpp>
#include <com/result.hpp>
#include <com/safearray.hpp>
#include <common/widestr.hpp>
#include <common/version.hpp>
#include <common/process.hpp>
#include <common/systime.hpp>
#include <common/purebmp.hpp>
#include <common/gdata.hpp>
#include <common/bitmap.hpp>
#include <common/pathfnd.hpp>
#include <common/version.hpp>
#include <common/openfile.hpp>
#include <jpeg-6b/bmpjpg.hpp>
RemoteProcessImpl::RemoteProcessImpl(void)
: mCurrProcessIndex(0), mCurrModuleIndex(0)
{
}
RemoteProcessImpl::~RemoteProcessImpl()
{
}
ComResult RemoteProcessImpl::snapshot(VARIANT *pVariant)
{
WinVersionInfo versionInfo;
if(versionInfo.isWinNT())mProcessAPI.enumProcesses(mProcessInfoList);
else mProcessAPI95.enumProcesses(mProcessInfoList);
::VariantInit(pVariant);
pVariant->vt=VT_I4;
pVariant->lVal=mProcessInfoList.size();
return ComResult::Success;
}
ComResult RemoteProcessImpl::getProcessFirst(VARIANT *pVariant)
{
mCurrProcessIndex=0;
::VariantInit(pVariant);
pVariant->vt=VT_I4;
if(mProcessInfoList.size()<=mCurrProcessIndex)pVariant->lVal=-1;
else pVariant->lVal=mProcessInfoList[mCurrProcessIndex].processID().processID();
return ComResult::Success;
}
ComResult RemoteProcessImpl::getProcessNext(VARIANT *pVariant)
{
::VariantInit(pVariant);
pVariant->vt=VT_I4;
if((mCurrProcessIndex+1)>=mProcessInfoList.size())pVariant->lVal=-1;
else pVariant->lVal=mProcessInfoList[++mCurrProcessIndex].processID().processID();
return ComResult::Success;
}
ComResult RemoteProcessImpl::getModuleFirst(VARIANT *pVariant)
{
mCurrModuleIndex=0;
::VariantInit(pVariant);
if(mCurrProcessIndex>=mProcessInfoList.size()||mCurrModuleIndex>=mProcessInfoList[mCurrProcessIndex].size())
{
pVariant->vt=VT_I4;
pVariant->lVal=-1;
}
else
{
WideString wideString((mProcessInfoList[mCurrProcessIndex])[mCurrModuleIndex].moduleFileName());
pVariant->vt=VT_BSTR;
pVariant->bstrVal=::SysAllocString(&wideString[0]);
}
return ComResult::Success;
}
ComResult RemoteProcessImpl::getModuleNext(VARIANT *pVariant)
{
::VariantInit(pVariant);
if(mCurrProcessIndex>=mProcessInfoList.size()||(mCurrModuleIndex+1)>=mProcessInfoList[mCurrProcessIndex].size())
{
pVariant->vt=VT_I4;
pVariant->lVal=-1;
}
else
{
WideString wideString((mProcessInfoList[mCurrProcessIndex])[++mCurrModuleIndex].moduleFileName());
pVariant->vt=VT_BSTR;
pVariant->bstrVal=::SysAllocString(&wideString[0]);
}
return ComResult::Success;
}
ComResult RemoteProcessImpl::getProcessTimes(VARIANT *pVariant,DATE *pCreationTime,DATE *pExitTime,DATE *pKernelTime,DATE *pUserTime)
{
SystemTime sysCreationTime;
SystemTime sysExitTime;
SystemTime sysKernelTime;
SystemTime sysUserTime;
FILETIME creationTime;
FILETIME exitTime;
FILETIME kernelTime;
FILETIME userTime;
DWORD processID;
Process process;
if(!pVariant||pVariant->vt!=VT_I4)return ComResult::Error;
processID=pVariant->lVal;
if(!process.openProcess(processID))return ComResult::Error;
if(!::GetProcessTimes(process.getProcess(),&creationTime,&exitTime,&kernelTime,&userTime))return ComResult::Error;
::FileTimeToSystemTime(&creationTime,&sysCreationTime.getSYSTEMTIME());
::FileTimeToSystemTime(&exitTime,&sysExitTime.getSYSTEMTIME());
::FileTimeToSystemTime(&kernelTime,&sysKernelTime.getSYSTEMTIME());
::FileTimeToSystemTime(&userTime,&sysUserTime.getSYSTEMTIME());
::SystemTimeToVariantTime(&sysCreationTime.getSYSTEMTIME(),pCreationTime);
::SystemTimeToVariantTime(&sysExitTime.getSYSTEMTIME(),pExitTime);
::SystemTimeToVariantTime(&sysKernelTime.getSYSTEMTIME(),pKernelTime);
::SystemTimeToVariantTime(&sysUserTime.getSYSTEMTIME(),pUserTime);
return ComResult::Success;
}
ComResult RemoteProcessImpl::getDesktopWindow(VARIANT *pVariant)
{
FileHandle inFile;
PureBitmap pureBitmap;
SafeArray safeArray;
ArrayBound arrayBound;
GlobalData<BYTE> bitmapBytes;
BYTE *pData;
HWND hDesktopWindow;
String strPathFileName;
hDesktopWindow=::GetDesktopWindow();
if(!hDesktopWindow)return ComResult::Fail;
pureBitmap.windowBitmap(hDesktopWindow);
if(!pureBitmap.isOkay())return ComResult::Fail;
saveBitmap(pureBitmap,strPathFileName);
inFile.open(strPathFileName,FileHandle::Read);
if(!inFile.isOkay())return ComResult::Fail;
bitmapBytes.size(inFile.size()+sizeof(DWORD));
arrayBound.elements(bitmapBytes.size());
safeArray.create(VTUChar,arrayBound);
safeArray.accessData((void**)&pData);
*((DWORD*)pData)=bitmapBytes.size();
inFile.read(pData+sizeof(DWORD),inFile.size());
inFile.close();
::unlink(strPathFileName);
safeArray.unaccessData();
safeArray.disposition(SafeArray::Assume);
::VariantInit(pVariant);
pVariant->vt=VT_ARRAY;
pVariant->parray=safeArray.getSAFEARRAY();
return ComResult::Success;
}
ComResult RemoteProcessImpl::kill(VARIANT *pVariant)
{
return ComResult::Success;
}
void RemoteProcessImpl::saveBitmap(PureBitmap &pureBitmap,String &strPathFileName)
{
String strBitmapName("image000.bmp");
String strPathBitmapName;
BitmapInfo bmInfo;
PathFind pathFind;
PurePalette purePalette;
GlobalData<BYTE> bmBits;
WinVersionInfo versionInfo;
pathFind.getWindowsTempDirectory(strPathBitmapName);
strPathBitmapName+=strBitmapName;
strPathFileName=strPathBitmapName.betweenString(0,'.')+String(".tmp");
bmInfo.width(pureBitmap.width());
bmInfo.height(pureBitmap.height());
bmInfo.planes(1);
bmInfo.compression(BI_RGB);
bmInfo.bitCount(BitmapInfo::Bit24);
bmInfo.colorUsed(0);
bmInfo.colorImportant(0);
pureBitmap.getBitmapBits(bmBits,BitmapInfo::Bit24,true);
Bitmap bitmap(strPathBitmapName,bmInfo,bmBits);
bitmap.setPalette(purePalette.getPalette(),false);
bitmap.saveBitmap();
ImageConverter::convert(strPathBitmapName,strPathFileName,80);
}