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