1
0
mirror of https://github.com/rbmm/SC synced 2026-06-08 17:03:41 +00:00
Files
rbmm 1e0924e2aa ++
2025-02-07 00:13:38 +02:00

55 lines
1.3 KiB
C++

#include "stdafx.h"
#include "zip.h"
ULONG BOOL_TO_ERROR(BOOL f)
{
return f ? NOERROR : GetLastError();
}
HRESULT Unzip(_In_ LPCVOID CompressedData,
_In_ ULONG CompressedDataSize,
_Out_ PVOID* pUncompressedBuffer,
_Out_ ULONG* pUncompressedDataSize)
{
ULONG dwError;
COMPRESSOR_HANDLE DecompressorHandle;
if (NOERROR == (dwError = BOOL_TO_ERROR(CreateDecompressor(COMPRESS_ALGORITHM_MSZIP, 0, &DecompressorHandle))))
{
SIZE_T UncompressedBufferSize = 0;
PVOID UncompressedBuffer = 0;
while (ERROR_INSUFFICIENT_BUFFER == (dwError = BOOL_TO_ERROR(Decompress(
DecompressorHandle, CompressedData, CompressedDataSize,
UncompressedBuffer, UncompressedBufferSize, &UncompressedBufferSize))) && !UncompressedBuffer)
{
if (!(UncompressedBuffer = LocalAlloc(LMEM_FIXED, UncompressedBufferSize)))
{
dwError = ERROR_OUTOFMEMORY;
break;
}
}
if (NOERROR == dwError)
{
if (UncompressedBuffer)
{
*pUncompressedDataSize = (ULONG)UncompressedBufferSize;
*pUncompressedBuffer = UncompressedBuffer, UncompressedBuffer = 0;
}
else
{
dwError = ERROR_INTERNAL_ERROR;
}
}
if (UncompressedBuffer)
{
LocalFree(UncompressedBuffer);
}
CloseDecompressor(DecompressorHandle);
}
return HRESULT_FROM_WIN32(dwError);
}