1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
|
/************************************************************************
* *
* xcompress.h -- This module defines the Xbox Compression APIs *
* *
* Copyright (c) Microsoft Corp. All rights reserved. *
* *
************************************************************************/
#pragma once
#ifndef _XCOMPRESS_H_
#define _XCOMPRESS_H_
#include <sal.h>
#ifndef XBOXAPI
#define XBOXAPI
#endif
#ifdef __cplusplus
#define XCTDEXTERN extern "C"
#else
#define XCTDEXTERN extern
#endif
#ifdef __cplusplus
extern "C"
{
#endif
#pragma warning(push)
#pragma warning(disable: 4200) // zero-sized array
typedef enum _XMEMCODEC_TYPE
{
XMEMCODEC_DEFAULT = 0,
XMEMCODEC_LZX = 1
} XMEMCODEC_TYPE;
/*
* Data compression flags
*/
#define XMEMCOMPRESS_STREAM 0x00000001
/*
* Data compression functions
*/
typedef VOID* XMEMCOMPRESSION_CONTEXT;
XBOXAPI
HRESULT
WINAPI
XMemCreateCompressionContext(
__in XMEMCODEC_TYPE CodecType,
__in_opt CONST VOID* pCodecParams,
__in DWORD Flags,
__deref_out XMEMCOMPRESSION_CONTEXT* pContext
);
XBOXAPI
XMEMCOMPRESSION_CONTEXT
WINAPI
XMemInitializeCompressionContext(
__in XMEMCODEC_TYPE CodecType,
__in_opt CONST VOID* pCodecParams,
__in DWORD Flags,
__out_bcount(ContextSize) VOID* pContextData,
__in SIZE_T ContextSize
);
XBOXAPI
VOID
WINAPI
XMemDestroyCompressionContext(
__in XMEMCOMPRESSION_CONTEXT Context
);
XBOXAPI
SIZE_T
WINAPI
XMemGetCompressionContextSize(
__in XMEMCODEC_TYPE CodecType,
__in_opt CONST VOID* pCodecParams,
__in DWORD Flags
);
XBOXAPI
HRESULT
WINAPI
XMemResetCompressionContext(
__in XMEMCOMPRESSION_CONTEXT Context);
XBOXAPI
HRESULT
WINAPI
XMemCompress(
__in XMEMCOMPRESSION_CONTEXT Context,
__out_bcount_opt( *pDestSize ) VOID* pDestination,
__inout SIZE_T* pDestSize,
__in_bcount( SrcSize ) CONST VOID* pSource,
__in SIZE_T SrcSize
);
XBOXAPI
HRESULT
WINAPI
XMemCompressStream(
__in XMEMCOMPRESSION_CONTEXT Context,
__out_bcount_opt( *pDestSize ) VOID* pDestination,
__inout SIZE_T* pDestSize,
__in_bcount( *pSrcSize ) CONST VOID* pSource,
__inout SIZE_T* pSrcSize
);
/*
* Data decompression functions
*/
typedef VOID* XMEMDECOMPRESSION_CONTEXT;
XBOXAPI
HRESULT
WINAPI
XMemCreateDecompressionContext(
__in XMEMCODEC_TYPE CodecType,
__in_opt CONST VOID* pCodecParams,
__in DWORD Flags,
__deref_out XMEMDECOMPRESSION_CONTEXT* pContext
);
XBOXAPI
XMEMDECOMPRESSION_CONTEXT
WINAPI
XMemInitializeDecompressionContext(
__in XMEMCODEC_TYPE CodecType,
__in_opt CONST VOID* pCodecParams,
__in DWORD Flags,
__out_bcount( ContextSize ) VOID* pContextData,
__in SIZE_T ContextSize
);
XBOXAPI
VOID
WINAPI
XMemDestroyDecompressionContext(
__in XMEMDECOMPRESSION_CONTEXT Context
);
XBOXAPI
SIZE_T
WINAPI
XMemGetDecompressionContextSize(
__in XMEMCODEC_TYPE CodecType,
__in_opt CONST VOID* pCodecParams,
__in DWORD Flags
);
XBOXAPI
HRESULT
WINAPI
XMemResetDecompressionContext(
__in XMEMDECOMPRESSION_CONTEXT Context);
XBOXAPI
HRESULT
WINAPI
XMemDecompress(
__in XMEMDECOMPRESSION_CONTEXT Context,
__out_bcount( *pDestSize ) VOID* pDestination,
__inout SIZE_T* pDestSize,
__in_bcount( SrcSize) CONST VOID* pSource,
__in SIZE_T SrcSize
);
XBOXAPI
HRESULT
WINAPI
XMemDecompressStream(
__in XMEMDECOMPRESSION_CONTEXT Context,
__out_bcount( *pDestSize ) VOID* pDestination,
__inout SIZE_T* pDestSize,
__in_bcount( *pSrcSize ) CONST VOID* pSource,
__inout SIZE_T* pSrcSize
);
/*
* LZX codec for lossless compression
*/
typedef struct _XMEMCODEC_PARAMETERS_LZX
{
DWORD Flags;
DWORD WindowSize;
DWORD CompressionPartitionSize;
} XMEMCODEC_PARAMETERS_LZX;
#define XCOMPRESS_LZX_BLOCK_SIZE (32 * 1024)
#define XCOMPRESS_LZX_BLOCK_GROWTH_SIZE_MAX 6155
/*
* Error codes
*/
#define XMCDERR_MOREDATA _HRESULT_TYPEDEF_(0x81DE2001)
/*
* Compression file headers
*/
#define XCOMPRESS_FILE_IDENTIFIER_LZXTDECODE 0x0FF512ED
#define XCOMPRESS_FILE_IDENTIFIER_LZXNATIVE 0x0FF512EE
#define XCOMPRESS_SET_FILE_VERSION(Major, Minor) ((((Major) & 0xFF) << 8) | ((Minor) & 0xFF))
#define XCOMPRESS_GET_FILE_VERSION_MAJOR(Version) (((Version) >> 8) & 0xFF)
#define XCOMPRESS_GET_FILE_VERSION_MINOR(Version) ((Version) & 0xFF)
#define XCOMPRESS_LZXNATIVE_VERSION_MAJOR 1
#define XCOMPRESS_LZXNATIVE_VERSION_MINOR 3
typedef struct _XCOMPRESS_FILE_HEADER
{
DWORD Identifier;
WORD Version;
WORD Reserved;
} XCOMPRESS_FILE_HEADER;
typedef struct _XCOMPRESS_FILE_HEADER_LZXNATIVE
{
XCOMPRESS_FILE_HEADER Common;
DWORD ContextFlags;
XMEMCODEC_PARAMETERS_LZX CodecParams;
DWORD UncompressedSizeHigh;
DWORD UncompressedSizeLow;
DWORD CompressedSizeHigh;
DWORD CompressedSizeLow;
DWORD UncompressedBlockSize;
DWORD CompressedBlockSizeMax;
} XCOMPRESS_FILE_HEADER_LZXNATIVE;
typedef struct _XCOMPRESS_BLOCK_HEADER_LZXNATIVE
{
DWORD CompressedBlockSize;
BYTE pCompressedData[0];
} XCOMPRESS_BLOCK_HEADER_LZXNATIVE;
#pragma warning(pop)
#ifdef __cplusplus
}
#endif
#endif /* _XCOMPRESS_H_ */
|