#include #include #include "itsutils.h" typedef LPVOID (*FNCompressAlloc)(DWORD AllocSize); typedef VOID (*FNCompressFree)(LPVOID Address); typedef DWORD (*FNCompressOpen)( DWORD dwParam1, DWORD MaxOrigSize, FNCompressAlloc AllocFn, FNCompressFree FreeFn, DWORD dwUnknown); typedef DWORD (*FNCompressConvert)( DWORD ConvertStream, LPVOID CompAdr, DWORD CompSize, LPCVOID OrigAdr, DWORD OrigSize); typedef VOID (*FNCompressClose)( DWORD ConvertStream); LPVOID Compress_AllocFunc(DWORD AllocSize) { return LocalAlloc(LPTR, AllocSize); } VOID Compress_FreeFunc(LPVOID Address) { LocalFree(Address); } ITSUTILS_API HRESULT STDAPICALLTYPE ITS_XPRLZX_Compress( DWORD cbInput, CompressParams *pbInput, DWORD *pcbOutput, CompressResult **ppbOutput, IRAPIStream *pStream) { DWORD dwRes= 0; CompressResult *pOut= *ppbOutput= NULL; *pcbOutput= 0; HMODULE hDll= LoadLibrary(L"cecompr.dll"); if (hDll==NULL || hDll==INVALID_HANDLE_VALUE) { dwRes= 1; error("LoadLibrary"); return dwRes; } //debug("loaded cecompr.dll = %08lx\n", hDll); FNCompressOpen CompressOpen= NULL; FNCompressConvert CompressConvert= NULL; FNCompressClose CompressClose= NULL; switch(pbInput->dwType) { case ITSCOMP_XPR_DECODE: CompressOpen= (FNCompressOpen)GetProcAddress(hDll, L"XPR_DecompressOpen"); CompressConvert= (FNCompressConvert)GetProcAddress(hDll, L"XPR_DecompressDecode"); CompressClose= (FNCompressClose)GetProcAddress(hDll, L"XPR_DecompressClose"); break; case ITSCOMP_XPR_ENCODE: CompressOpen= (FNCompressOpen)GetProcAddress(hDll, L"XPR_CompressOpen"); CompressConvert= (FNCompressConvert)GetProcAddress(hDll, L"XPR_CompressEncode"); CompressClose= (FNCompressClose)GetProcAddress(hDll, L"XPR_CompressClose"); break; case ITSCOMP_LZX_DECODE: CompressOpen= (FNCompressOpen)GetProcAddress(hDll, L"LZX_DecompressOpen"); CompressConvert= (FNCompressConvert)GetProcAddress(hDll, L"LZX_DecompressDecode"); CompressClose= (FNCompressClose)GetProcAddress(hDll, L"LZX_DecompressClose"); break; case ITSCOMP_LZX_ENCODE: CompressOpen= (FNCompressOpen)GetProcAddress(hDll, L"LZX_CompressOpen"); CompressConvert= (FNCompressConvert)GetProcAddress(hDll, L"LZX_CompressEncode"); CompressClose= (FNCompressClose)GetProcAddress(hDll, L"LZX_CompressClose"); break; } if (CompressOpen==NULL || CompressConvert==NULL || CompressClose==NULL) { dwRes= 2; debug("error loading funcs %d %08lx %08lx %08lx\n", pbInput->dwType, CompressOpen, CompressConvert, CompressClose); FreeLibrary(hDll); return dwRes; } //debug("loaded funcs %08lx %08lx %08lx\n", CompressOpen, CompressConvert, CompressClose); DWORD stream= CompressOpen(0x10000, pbInput->dwMaxBlockSize, Compress_AllocFunc, Compress_FreeFunc, 0); if (stream==NULL || stream==0xFFFFFFFF) { error("CompressOpen(%d)", pbInput->dwMaxBlockSize); dwRes= 3; FreeLibrary(hDll); return dwRes; } //debug("stream: %08lx\n", stream); BYTE *buf= (BYTE*)LocalAlloc(LPTR, pbInput->dwMaxBlockSize); if (buf==NULL) { error("LocalAlloc(%d)", pbInput->dwMaxBlockSize); dwRes= 4; CompressClose(stream); FreeLibrary(hDll); return dwRes; } //debug("allocated %08lx bytes : %08lx\n", pbInput->dwMaxBlockSize, buf); DWORD res= CompressConvert(stream, buf, pbInput->outlength, pbInput->data, pbInput->insize); if (res==0 || res==0xffffffff) { dwRes= 5; error("CompressConvert(max=%d out=%d in=%d)", pbInput->dwMaxBlockSize, pbInput->outlength, pbInput->insize); LocalFree(buf); CompressClose(stream); FreeLibrary(hDll); return dwRes; } //debug("converted to %08lx\n", res); *pcbOutput= sizeof(CompressResult)+res; pOut= *ppbOutput= (CompressResult*)LocalAlloc(LPTR, *pcbOutput); memcpy(pOut->data, buf, res); pOut->outlength= res; LocalFree(buf); CompressClose(stream); FreeLibrary(hDll); return dwRes; }