324 lines
8.3 KiB
C
Raw Normal View History

2025-04-23 00:09:35 -04:00
/************************************************************************
* *
* 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 <Windows.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
);
XBOXAPI
HRESULT
WINAPI
XMemDecompressSegmentTD(
__in XMEMDECOMPRESSION_CONTEXT Context,
__out_bcount( *pDestSize ) VOID* pDestination,
__inout SIZE_T* pDestSize,
__in_bcount( *pSrcSize ) CONST VOID* pSource,
__inout SIZE_T SrcSize,
__inout SIZE_T DestSize,
__inout SIZE_T Offset
);
2025-04-23 00:09:35 -04:00
/*
* 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)
/*
* Transparent decoding
*/
#if defined(_M_PPCBE)
typedef struct _XTDECODER_PARAMETERS
{
XMEMCODEC_TYPE CodecType;
CONST VOID* pCodecParams;
DWORD Flags;
DWORD HardwareThread;
INT ThreadPriority;
DWORD SegmentSizeLimit;
DWORD PendingReadLimit;
DWORD OpenFileLimit;
DWORD TranslationCacheSize;
} XTDECODER_PARAMETERS;
/*
* Transparent decoding flags
*/
#define XTDECODER_NO_READ_ALIGNMENT_ENFORCEMENT 0x00000001
/*
* Transparent decoding global which, when set to TRUE before transparent
* decompression has been enabled, will force an explicit examination (read)
* of all files when created to determine their compression state (ignoring
* the presence or absence of the GDF compressed attribute bit). Use of this
* global should be done for debugging purposes only.
*/
XCTDEXTERN BOOL XCTD__ProbeFileCompressionState;
/*
* Transparent decoding functions
*/
XBOXAPI
HRESULT
WINAPI
XFileEnableTransparentDecompression(
__in_opt CONST XTDECODER_PARAMETERS* pDecoderParams
);
XBOXAPI
VOID
WINAPI
XFileDisableTransparentDecompression();
#endif
/*
* 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_LZXTDECODE_VERSION_MAJOR 1
#define XCOMPRESS_LZXTDECODE_VERSION_MINOR 0
#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_ */