mirror of https://github.com/hfiref0x/UACME.git
119 lines
3.1 KiB
C
119 lines
3.1 KiB
C
/*******************************************************************************
|
|
*
|
|
* (C) COPYRIGHT AUTHORS, 2014 - 2018
|
|
*
|
|
* TITLE: COMPRESS.H
|
|
*
|
|
* VERSION: 3.00
|
|
*
|
|
* DATE: 25 Aug 2018
|
|
*
|
|
* Prototypes and definitions for compression.
|
|
*
|
|
* THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
|
|
* ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED
|
|
* TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
|
|
* PARTICULAR PURPOSE.
|
|
*
|
|
*******************************************************************************/
|
|
#pragma once
|
|
|
|
#include <msdelta.h>
|
|
#include <compressapi.h>
|
|
#include <bcrypt.h>
|
|
|
|
#define UACME_CONTAINER_PACKED_UNIT 'UPCU' //Naka handling
|
|
#define UACME_CONTAINER_PACKED_DATA 'DPCU' //Naka handling
|
|
#define UACME_CONTAINER_PACKED_CODE 'CPCU' //Kuma handling
|
|
#define UACME_CONTAINER_PACKED_KEYS 'KPCU' //Kuma handling
|
|
|
|
//Initialization vector max bytes
|
|
#define DCU_IV_MAX_BLOCK_LENGTH 16
|
|
|
|
typedef struct _DCU_HEADER {
|
|
DWORD Magic;
|
|
DWORD cbData;
|
|
DWORD cbDeltaSize;
|
|
DWORD HeaderCrc;
|
|
BYTE bIV[DCU_IV_MAX_BLOCK_LENGTH];
|
|
//PBYTE pbData[1]; /* not a member of the structure */
|
|
} DCU_HEADER, *PDCU_HEADER;
|
|
|
|
typedef BOOL(WINAPI *pfnCreateDecompressor)(
|
|
_In_ DWORD Algorithm,
|
|
_In_opt_ PCOMPRESS_ALLOCATION_ROUTINES AllocationRoutines,
|
|
_Out_ PDECOMPRESSOR_HANDLE DecompressorHandle);
|
|
|
|
typedef BOOL(WINAPI *pfnDecompress)(
|
|
_In_ DECOMPRESSOR_HANDLE DecompressorHandle,
|
|
_In_reads_bytes_opt_(CompressedDataSize) PVOID CompressedData,
|
|
_In_ SIZE_T CompressedDataSize,
|
|
_Out_writes_bytes_opt_(UncompressedBufferSize) PVOID UncompressedBuffer,
|
|
_In_ SIZE_T UncompressedBufferSize,
|
|
_Out_opt_ PSIZE_T UncompressedDataSize);
|
|
|
|
typedef BOOL(WINAPI *pfnCloseDecompressor)(
|
|
_In_ DECOMPRESSOR_HANDLE DecompressorHandle);
|
|
|
|
typedef enum _CFILE_TYPE {
|
|
ftDCN,
|
|
ftDCS,
|
|
ftMZ,
|
|
ftUnknown,
|
|
ftMax
|
|
} CFILE_TYPE;
|
|
|
|
typedef struct _DCN_HEADER {
|
|
DWORD Signature; //DCN v1
|
|
BYTE Data[1]; //Intra Package Delta
|
|
} DCN_HEADER, *PDCN_HEADER;
|
|
|
|
typedef struct _DCS_HEADER {
|
|
DWORD Signature; //DCS v1
|
|
DWORD NumberOfBlocks;
|
|
DWORD UncompressedFileSize;
|
|
BYTE FirstBlock[1];
|
|
} DCS_HEADER, *PDCS_HEADER;
|
|
|
|
typedef struct _DCS_BLOCK {
|
|
DWORD CompressedBlockSize;
|
|
DWORD DecompressedBlockSize;
|
|
BYTE CompressedData[1];
|
|
} DCS_BLOCK, *PDCS_BLOCK;
|
|
|
|
typedef PVOID(*pfnDecompressPayload)(
|
|
_In_ ULONG PayloadId,
|
|
_In_ PVOID pbBuffer,
|
|
_In_ ULONG cbBuffer,
|
|
_Out_ PULONG pcbDecompressed);
|
|
|
|
PVOID DecompressPayload(
|
|
_In_ ULONG PayloadId,
|
|
_In_ PVOID pbBuffer,
|
|
_In_ ULONG cbBuffer,
|
|
_Out_ PULONG pcbDecompressed);
|
|
|
|
CFILE_TYPE GetTargetFileType(
|
|
VOID *FileBuffer);
|
|
|
|
BOOL ProcessFileDCN(
|
|
PVOID SourceFile,
|
|
SIZE_T SourceFileSize,
|
|
PVOID *OutputFileBuffer,
|
|
PSIZE_T OutputFileBufferSize);
|
|
|
|
BOOL ProcessFileDCS(
|
|
PVOID SourceFile,
|
|
SIZE_T SourceFileSize,
|
|
PVOID *OutputFileBuffer,
|
|
PSIZE_T OutputFileBufferSize);
|
|
|
|
BOOL ProcessFileMZ(
|
|
PVOID SourceFile,
|
|
SIZE_T SourceFileSize,
|
|
PVOID *OutputFileBuffer,
|
|
PSIZE_T OutputFileBufferSize);
|
|
|
|
BOOL InitCabinetDecompressionAPI(
|
|
VOID);
|