20#define COMPRESSION_FORMAT_MASK 0x00FF
21#define COMPRESSION_ENGINE_MASK 0xFF00
34 ULONG displacement_bits, length_bits;
35 ULONG code_displacement, code_length;
39 src_end =
src + src_size;
44 while (src_cur < src_end && dst_cur <
dst_end)
47 flags = 0x8000 | *src_cur++;
50 while ((
flags & 0xFF00) && src_cur < src_end)
55 if (src_cur +
sizeof(
WORD) > src_end)
58 src_cur +=
sizeof(
WORD);
61 for (displacement_bits = 12; displacement_bits > 4; displacement_bits--)
62 if ((1 << (displacement_bits - 1)) < dst_cur -
dst)
break;
63 length_bits = 16 - displacement_bits;
64 code_length = (
code & ((1 << length_bits) - 1)) + 3;
65 code_displacement = (
code >> length_bits) + 1;
68 if (dst_cur <
dst + code_displacement)
75 if (dst_cur >=
dst_end)
return dst_cur;
76 *dst_cur = *(dst_cur - code_displacement);
83 if (dst_cur >=
dst_end)
return dst_cur;
84 *dst_cur++ = *src_cur++;
104 if (src_cur +
sizeof(
WORD) > src_end)
108 while (
offset >= 0x1000 && src_cur +
sizeof(
WORD) <= src_end)
111 chunk_header = *(
WORD *)src_cur;
112 src_cur +=
sizeof(
WORD);
113 if (!chunk_header)
goto out;
114 chunk_size = (chunk_header & 0xFFF) + 1;
117 if (src_cur + chunk_size > src_end)
120 src_cur += chunk_size;
125 if (
offset && src_cur +
sizeof(
WORD) <= src_end)
128 chunk_header = *(
WORD *)src_cur;
129 src_cur +=
sizeof(
WORD);
130 if (!chunk_header)
goto out;
131 chunk_size = (chunk_header & 0xFFF) + 1;
134 if (src_cur + chunk_size > src_end)
140 if (chunk_header & 0x8000)
164 src_cur += chunk_size;
168 while (src_cur +
sizeof(
WORD) <= src_end)
171 chunk_header = *(
WORD *)src_cur;
172 src_cur +=
sizeof(
WORD);
173 if (!chunk_header)
goto out;
174 chunk_size = (chunk_header & 0xFFF) + 1;
176 if (src_cur + chunk_size > src_end)
193 if (chunk_header & 0x8000)
207 src_cur += chunk_size;
212 *final_size = dst_cur -
dst;
227 while (src_cur < src_end)
236 dst_cur +=
sizeof(
WORD);
245 *final_size = dst_cur -
dst;
253 PULONG BufferAndWorkSpaceSize,
254 PULONG FragmentWorkSpaceSize)
258 *BufferAndWorkSpaceSize = 0x8010;
259 *FragmentWorkSpaceSize = 0x1000;
264 *BufferAndWorkSpaceSize = 0x10;
265 *FragmentWorkSpaceSize = 0x1000;
282 IN ULONG UncompressedChunkSize,
298 UncompressedChunkSize,
351 DPRINT(
"0x%04x, %p, %u, %p, %u, %u, %p, %p :stub\n",
format,
uncompressed,
352 uncompressed_size, compressed, compressed_size,
offset, final_size, workspace);
358 compressed_size,
offset, final_size, workspace);
405 OUT PULONG CompressBufferAndWorkSpaceSize,
406 OUT PULONG CompressFragmentWorkSpaceSize)
417 CompressBufferAndWorkSpaceSize,
418 CompressFragmentWorkSpaceSize));
#define STATUS_NOT_SUPPORTED
#define STATUS_NOT_IMPLEMENTED
static DWORD block_size(DWORD block)
#define memcpy(s1, s2, n)
static const BYTE uncompressed[]
_In_ ULONG _In_ ULONG CompressedBufferSize
_In_ ULONG _In_ ULONG _Out_ PULONG FinalUncompressedSize
_In_ ULONG UncompressedBufferSize
#define COMPRESSION_FORMAT_DEFAULT
#define COMPRESSION_ENGINE_STANDARD
#define COMPRESSION_FORMAT_NONE
#define COMPRESSION_ENGINE_MAXIMUM
#define COMPRESSION_FORMAT_LZNT1
#define STATUS_UNSUPPORTED_COMPRESSION
#define STATUS_BAD_COMPRESSION_BUFFER
#define STATUS_ACCESS_VIOLATION
#define COMPRESSION_FORMAT_MASK
NTSTATUS NTAPI RtlGetCompressionWorkSpaceSize(IN USHORT CompressionFormatAndEngine, OUT PULONG CompressBufferAndWorkSpaceSize, OUT PULONG CompressFragmentWorkSpaceSize)
static NTSTATUS RtlpCompressBufferLZNT1(UCHAR *src, ULONG src_size, UCHAR *dst, ULONG dst_size, ULONG chunk_size, ULONG *final_size, UCHAR *workspace)
NTSTATUS NTAPI RtlDecompressBuffer(IN USHORT CompressionFormat, OUT PUCHAR UncompressedBuffer, IN ULONG UncompressedBufferSize, IN PUCHAR CompressedBuffer, IN ULONG CompressedBufferSize, OUT PULONG FinalUncompressedSize)
NTSTATUS NTAPI RtlDecompressChunks(OUT PUCHAR UncompressedBuffer, IN ULONG UncompressedBufferSize, IN PUCHAR CompressedBuffer, IN ULONG CompressedBufferSize, IN PUCHAR CompressedTail, IN ULONG CompressedTailSize, IN PCOMPRESSED_DATA_INFO CompressedDataInfo)
static PUCHAR lznt1_decompress_chunk(UCHAR *dst, ULONG dst_size, UCHAR *src, ULONG src_size)
NTSTATUS NTAPI RtlCompressBuffer(IN USHORT CompressionFormatAndEngine, IN PUCHAR UncompressedBuffer, IN ULONG UncompressedBufferSize, OUT PUCHAR CompressedBuffer, IN ULONG CompressedBufferSize, IN ULONG UncompressedChunkSize, OUT PULONG FinalCompressedSize, IN PVOID WorkSpace)
NTSTATUS NTAPI RtlDescribeChunk(IN USHORT CompressionFormat, IN OUT PUCHAR *CompressedBuffer, IN PUCHAR EndOfCompressedBufferPlus1, OUT PUCHAR *ChunkBuffer, OUT PULONG ChunkSize)
NTSTATUS NTAPI RtlReserveChunk(IN USHORT CompressionFormat, IN OUT PUCHAR *CompressedBuffer, IN PUCHAR EndOfCompressedBufferPlus1, OUT PUCHAR *ChunkBuffer, IN ULONG ChunkSize)
#define COMPRESSION_ENGINE_MASK
static NTSTATUS lznt1_decompress(UCHAR *dst, ULONG dst_size, UCHAR *src, ULONG src_size, ULONG offset, ULONG *final_size, UCHAR *workspace)
static NTSTATUS RtlpWorkSpaceSizeLZNT1(USHORT Engine, PULONG BufferAndWorkSpaceSize, PULONG FragmentWorkSpaceSize)
NTSTATUS NTAPI RtlDecompressFragment(IN USHORT format, OUT PUCHAR uncompressed, IN ULONG uncompressed_size, IN PUCHAR compressed, IN ULONG compressed_size, IN ULONG offset, OUT PULONG final_size, IN PVOID workspace)
NTSTATUS NTAPI RtlCompressChunks(IN PUCHAR UncompressedBuffer, IN ULONG UncompressedBufferSize, OUT PUCHAR CompressedBuffer, IN ULONG CompressedBufferSize, IN OUT PCOMPRESSED_DATA_INFO CompressedDataInfo, IN ULONG CompressedDataInfoLength, IN PVOID WorkSpace)
#define STATUS_BUFFER_TOO_SMALL
#define STATUS_INVALID_PARAMETER
wchar_t tm const _CrtWcstime_Writes_and_advances_ptr_ count wchar_t ** out
_In_ PLARGE_INTEGER _In_ ULONG _In_ ULONG _Out_ PVOID _Out_ PMDL _Out_ PIO_STATUS_BLOCK _Out_ struct _COMPRESSED_DATA_INFO * CompressedDataInfo
_In_ PLARGE_INTEGER _In_ ULONG _In_ ULONG _Out_ PVOID _Out_ PMDL _Out_ PIO_STATUS_BLOCK _Out_ struct _COMPRESSED_DATA_INFO _In_ ULONG CompressedDataInfoLength
_In_ ULONG _In_ ULONG _In_ ULONG CompressedTailSize
_Inout_ PUCHAR * CompressedBuffer
_Inout_ PUCHAR _In_ PUCHAR _Out_ PUCHAR _Out_ PULONG ChunkSize
_In_ ULONG _In_ ULONG _Out_ PULONG _In_ PVOID WorkSpace
_Inout_ PUCHAR _In_ PUCHAR EndOfCompressedBufferPlus1
_Inout_ PUCHAR _In_ PUCHAR _Out_ PUCHAR * ChunkBuffer