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;
}
Exemple #2
0
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;
}