[RTL/NTDLL]
[reactos.git] / reactos / lib / rtl / compress.c
1 /* COPYRIGHT: See COPYING in the top level directory
2 * PROJECT: ReactOS system libraries
3 * PURPOSE: Compression and decompression functions
4 * FILE: lib/rtl/compress.c
5 * PROGRAMER: Eric Kohl
6 */
7
8 /* INCLUDES *****************************************************************/
9
10 #include <rtl.h>
11
12 #define NDEBUG
13 #include <debug.h>
14
15 /* MACROS *******************************************************************/
16
17 #define COMPRESSION_FORMAT_MASK 0x00FF
18 #define COMPRESSION_ENGINE_MASK 0xFF00
19
20
21
22
23 /* FUNCTIONS ****************************************************************/
24
25
26 static NTSTATUS
27 RtlpCompressBufferLZNT1(USHORT Engine,
28 PUCHAR UncompressedBuffer,
29 ULONG UncompressedBufferSize,
30 PUCHAR CompressedBuffer,
31 ULONG CompressedBufferSize,
32 ULONG UncompressedChunkSize,
33 PULONG FinalCompressedSize,
34 PVOID WorkSpace)
35 {
36 return(STATUS_NOT_IMPLEMENTED);
37 }
38
39
40 static NTSTATUS
41 RtlpWorkSpaceSizeLZNT1(USHORT Engine,
42 PULONG BufferAndWorkSpaceSize,
43 PULONG FragmentWorkSpaceSize)
44 {
45 if (Engine == COMPRESSION_ENGINE_STANDARD)
46 {
47 *BufferAndWorkSpaceSize = 0x8010;
48 *FragmentWorkSpaceSize = 0x1000;
49 return(STATUS_SUCCESS);
50 }
51 else if (Engine == COMPRESSION_ENGINE_MAXIMUM)
52 {
53 *BufferAndWorkSpaceSize = 0x10;
54 *FragmentWorkSpaceSize = 0x1000;
55 return(STATUS_SUCCESS);
56 }
57
58 return(STATUS_NOT_SUPPORTED);
59 }
60
61
62 /*
63 * @implemented
64 */
65 NTSTATUS NTAPI
66 RtlCompressBuffer(IN USHORT CompressionFormatAndEngine,
67 IN PUCHAR UncompressedBuffer,
68 IN ULONG UncompressedBufferSize,
69 OUT PUCHAR CompressedBuffer,
70 IN ULONG CompressedBufferSize,
71 IN ULONG UncompressedChunkSize,
72 OUT PULONG FinalCompressedSize,
73 IN PVOID WorkSpace)
74 {
75 USHORT Format = CompressionFormatAndEngine & COMPRESSION_FORMAT_MASK;
76 USHORT Engine = CompressionFormatAndEngine & COMPRESSION_ENGINE_MASK;
77
78 if ((Format == COMPRESSION_FORMAT_NONE) ||
79 (Format == COMPRESSION_FORMAT_DEFAULT))
80 return(STATUS_INVALID_PARAMETER);
81
82 if (Format == COMPRESSION_FORMAT_LZNT1)
83 return(RtlpCompressBufferLZNT1(Engine,
84 UncompressedBuffer,
85 UncompressedBufferSize,
86 CompressedBuffer,
87 CompressedBufferSize,
88 UncompressedChunkSize,
89 FinalCompressedSize,
90 WorkSpace));
91
92 return(STATUS_UNSUPPORTED_COMPRESSION);
93 }
94
95
96 /*
97 * @unimplemented
98 */
99 NTSTATUS NTAPI
100 RtlCompressChunks(IN PUCHAR UncompressedBuffer,
101 IN ULONG UncompressedBufferSize,
102 OUT PUCHAR CompressedBuffer,
103 IN ULONG CompressedBufferSize,
104 IN OUT PCOMPRESSED_DATA_INFO CompressedDataInfo,
105 IN ULONG CompressedDataInfoLength,
106 IN PVOID WorkSpace)
107 {
108 return(STATUS_NOT_IMPLEMENTED);
109 }
110
111
112 /*
113 * @unimplemented
114 */
115 NTSTATUS NTAPI
116 RtlDecompressBuffer(IN USHORT CompressionFormat,
117 OUT PUCHAR UncompressedBuffer,
118 IN ULONG UncompressedBufferSize,
119 IN PUCHAR CompressedBuffer,
120 IN ULONG CompressedBufferSize,
121 OUT PULONG FinalUncompressedSize)
122 {
123 return(STATUS_NOT_IMPLEMENTED);
124 }
125
126
127 /*
128 * @unimplemented
129 */
130 NTSTATUS NTAPI
131 RtlDecompressChunks(OUT PUCHAR UncompressedBuffer,
132 IN ULONG UncompressedBufferSize,
133 IN PUCHAR CompressedBuffer,
134 IN ULONG CompressedBufferSize,
135 IN PUCHAR CompressedTail,
136 IN ULONG CompressedTailSize,
137 IN PCOMPRESSED_DATA_INFO CompressedDataInfo)
138 {
139 return(STATUS_NOT_IMPLEMENTED);
140 }
141
142
143 /*
144 * @unimplemented
145 */
146 NTSTATUS NTAPI
147 RtlDecompressFragment(IN USHORT CompressionFormat,
148 OUT PUCHAR UncompressedFragment,
149 IN ULONG UncompressedFragmentSize,
150 IN PUCHAR CompressedBuffer,
151 IN ULONG CompressedBufferSize,
152 IN ULONG FragmentOffset,
153 OUT PULONG FinalUncompressedSize,
154 IN PVOID WorkSpace)
155 {
156 return(STATUS_NOT_IMPLEMENTED);
157 }
158
159
160 /*
161 * @unimplemented
162 */
163 NTSTATUS NTAPI
164 RtlDescribeChunk(IN USHORT CompressionFormat,
165 IN OUT PUCHAR *CompressedBuffer,
166 IN PUCHAR EndOfCompressedBufferPlus1,
167 OUT PUCHAR *ChunkBuffer,
168 OUT PULONG ChunkSize)
169 {
170 return(STATUS_NOT_IMPLEMENTED);
171 }
172
173
174 /*
175 * @unimplemented
176 */
177 NTSTATUS NTAPI
178 RtlGetCompressionWorkSpaceSize(IN USHORT CompressionFormatAndEngine,
179 OUT PULONG CompressBufferAndWorkSpaceSize,
180 OUT PULONG CompressFragmentWorkSpaceSize)
181 {
182 USHORT Format = CompressionFormatAndEngine & COMPRESSION_FORMAT_MASK;
183 USHORT Engine = CompressionFormatAndEngine & COMPRESSION_ENGINE_MASK;
184
185 if ((Format == COMPRESSION_FORMAT_NONE) ||
186 (Format == COMPRESSION_FORMAT_DEFAULT))
187 return(STATUS_INVALID_PARAMETER);
188
189 if (Format == COMPRESSION_FORMAT_LZNT1)
190 return(RtlpWorkSpaceSizeLZNT1(Engine,
191 CompressBufferAndWorkSpaceSize,
192 CompressFragmentWorkSpaceSize));
193
194 return(STATUS_UNSUPPORTED_COMPRESSION);
195 }
196
197
198
199 /*
200 * @unimplemented
201 */
202 NTSTATUS NTAPI
203 RtlReserveChunk(IN USHORT CompressionFormat,
204 IN OUT PUCHAR *CompressedBuffer,
205 IN PUCHAR EndOfCompressedBufferPlus1,
206 OUT PUCHAR *ChunkBuffer,
207 IN ULONG ChunkSize)
208 {
209 return(STATUS_NOT_IMPLEMENTED);
210 }
211
212 /* EOF */