BOOL kull_m_memory_quick_compress(IN PVOID data, IN DWORD size, IN OUT PVOID *compressedData, IN OUT PDWORD compressedSize) { BOOL status = FALSE; DWORD CompressBufferWorkSpaceSize, CompressFragmentWorkSpaceSize; PVOID WorkSpace; if(NT_SUCCESS(RtlGetCompressionWorkSpaceSize(COMPRESSION_FORMAT_LZNT1 | COMPRESSION_ENGINE_MAXIMUM, &CompressBufferWorkSpaceSize, &CompressFragmentWorkSpaceSize))) { if(WorkSpace = LocalAlloc(LPTR, CompressBufferWorkSpaceSize)) { if((*compressedData) = LocalAlloc(LPTR, size)) { status = NT_SUCCESS(RtlCompressBuffer(COMPRESSION_FORMAT_LZNT1 | COMPRESSION_ENGINE_MAXIMUM, (PUCHAR) data, size, (PUCHAR) (*compressedData), size, 4096, compressedSize, WorkSpace)); if(!status) LocalFree(*compressedData); } LocalFree(WorkSpace); } } return status; }
BOOL CompressBuffer(PVOID pvInputBuffer,DWORD dwInputBufferSize,PVOID *ppvOutputBuffer,PDWORD pdwOutputBufferSize) { BOOL bRet = FALSE; DWORD dwCompressBufferWorkSpaceSize; DWORD dwCompressFragmentWorkSpaceSize; NTSTATUS St; St = RtlGetCompressionWorkSpaceSize(COMPRESSION_FORMAT_LZNT1|COMPRESSION_ENGINE_STANDARD,&dwCompressBufferWorkSpaceSize,&dwCompressFragmentWorkSpaceSize); if (NT_SUCCESS(St)) { PVOID pvWorkSpace = malloc(dwCompressBufferWorkSpaceSize); if (pvWorkSpace) { PVOID pvCompressedBuffer = malloc(ALIGN_UP(dwInputBufferSize,0x1000)); if (pvCompressedBuffer) { St = RtlCompressBuffer(COMPRESSION_FORMAT_LZNT1|COMPRESSION_ENGINE_STANDARD,pvInputBuffer,dwInputBufferSize,pvCompressedBuffer,ALIGN_UP(dwInputBufferSize,0x1000),0x1000,pdwOutputBufferSize,pvWorkSpace); if (bRet = NT_SUCCESS(St)) { *ppvOutputBuffer = pvCompressedBuffer; } else { DbgPrint(__FUNCTION__"(): RtlCompressBuffer failed with status %lx\n",St); free(pvCompressedBuffer); } } free(pvWorkSpace); } } else { DbgPrint(__FUNCTION__"(): RtlGetCompressionWorkSpaceSize failed with status %lx\n",St); } return bRet; }