187 lines
5.7 KiB
C++
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);
|
|
}
|
|
|