#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include 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 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 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); }