#ifndef __CASCLIB_H__
#define __CASCLIB_H__
#ifdef _MSC_VER
#pragma warning(disable:4668)
#pragma warning(disable:4820)
#endif
#include "CascPort.h"
#ifdef __cplusplus
extern "C" {
#endif
#if defined(_MSC_VER) && !defined(__CASCLIB_SELF__) && !defined(CASCLIB_NO_AUTO_LINK_LIBRARY)
#ifndef WDK_BUILD
#ifdef _DEBUG
#ifndef _UNICODE
#ifdef _DLL
#pragma comment(lib, "CascLibDAD.lib")
#else
#pragma comment(lib, "CascLibDAS.lib")
#endif
#else
#ifdef _DLL
#pragma comment(lib, "CascLibDUD.lib")
#else
#pragma comment(lib, "CascLibDUS.lib")
#endif
#endif
#else
#ifndef _UNICODE
#ifdef _DLL
#pragma comment(lib, "CascLibRAD.lib")
#else
#pragma comment(lib, "CascLibRAS.lib")
#endif
#else
#ifdef _DLL
#pragma comment(lib, "CascLibRUD.lib")
#else
#pragma comment(lib, "CascLibRUS.lib")
#endif
#endif
#endif
#endif
#endif
#if defined(CASCLIB_DETECT_UNICODE_MISMATCHES)
#if defined(_UNICODE) != defined(CASCLIB_UNICODE)
#error CascLib was not built with the same UNICODE setting as your project
#endif
#endif
#define CASCLIB_VERSION 0x0300
#define CASCLIB_VERSION_STRING "3.0"
#define CASC_OPEN_BY_NAME 0x00000000
#define CASC_OPEN_BY_CKEY 0x00000001
#define CASC_OPEN_BY_EKEY 0x00000002
#define CASC_OPEN_BY_FILEID 0x00000003
#define CASC_OPEN_TYPE_MASK 0x0000000F
#define CASC_OPEN_FLAGS_MASK 0xFFFFFFF0
#define CASC_STRICT_DATA_CHECK 0x00000010
#define CASC_OVERCOME_ENCRYPTED 0x00000020
#define CASC_OPEN_CKEY_ONCE 0x00000040
#define CASC_LOCALE_ALL 0xFFFFFFFF
#define CASC_LOCALE_ALL_WOW 0x0001F3F6
#define CASC_LOCALE_NONE 0x00000000
#define CASC_LOCALE_UNKNOWN1 0x00000001
#define CASC_LOCALE_ENUS 0x00000002
#define CASC_LOCALE_KOKR 0x00000004
#define CASC_LOCALE_RESERVED 0x00000008
#define CASC_LOCALE_FRFR 0x00000010
#define CASC_LOCALE_DEDE 0x00000020
#define CASC_LOCALE_ZHCN 0x00000040
#define CASC_LOCALE_ESES 0x00000080
#define CASC_LOCALE_ZHTW 0x00000100
#define CASC_LOCALE_ENGB 0x00000200
#define CASC_LOCALE_ENCN 0x00000400
#define CASC_LOCALE_ENTW 0x00000800
#define CASC_LOCALE_ESMX 0x00001000
#define CASC_LOCALE_RURU 0x00002000
#define CASC_LOCALE_PTBR 0x00004000
#define CASC_LOCALE_ITIT 0x00008000
#define CASC_LOCALE_PTPT 0x00010000
#define CASC_CFLAG_INSTALL 0x04
#define CASC_CFLAG_LOAD_ON_WINDOWS 0x08
#define CASC_CFLAG_LOAD_ON_MAC 0x10
#define CASC_CFLAG_X86_32 0x20
#define CASC_CFLAG_X86_64 0x40
#define CASC_CFLAG_LOW_VIOLENCE 0x80
#define CASC_CFLAG_DONT_LOAD 0x100
#define CASC_CFLAG_UPDATE_PLUGIN 0x800
#define CASC_CFLAG_ARM64 0x8000
#define CASC_CFLAG_ENCRYPTED 0x8000000
#define CASC_CFLAG_NO_NAME_HASH 0x10000000
#define CASC_CFLAG_UNCMN_RESOLUTION 0x20000000
#define CASC_CFLAG_BUNDLE 0x40000000
#define CASC_CFLAG_NO_COMPRESSION 0x80000000
#ifndef MD5_HASH_SIZE
#define MD5_HASH_SIZE 0x10
#define MD5_STRING_SIZE 0x20
#endif
#ifndef SHA1_HASH_SIZE
#define SHA1_HASH_SIZE 0x14
#define SHA1_STRING_SIZE 0x28
#endif
#define CASC_INVALID_INDEX 0xFFFFFFFF
#define CASC_INVALID_SIZE 0xFFFFFFFF
#define CASC_INVALID_POS 0xFFFFFFFF
#define CASC_INVALID_ID 0xFFFFFFFF
#define CASC_INVALID_OFFS64 0xFFFFFFFFFFFFFFFF
#define CASC_INVALID_SIZE64 0xFFFFFFFFFFFFFFFF
#define CASC_INVALID_SIZE_T ((size_t)(-1))
#define CASC_FEATURE_FILE_NAMES 0x00000001
#define CASC_FEATURE_ROOT_CKEY 0x00000002
#define CASC_FEATURE_TAGS 0x00000004
#define CASC_FEATURE_FNAME_HASHES 0x00000008
#define CASC_FEATURE_FNAME_HASHES_OPTIONAL 0x00000010
#define CASC_FEATURE_FILE_DATA_IDS 0x00000020
#define CASC_FEATURE_LOCALE_FLAGS 0x00000040
#define CASC_FEATURE_CONTENT_FLAGS 0x00000080
#define CASC_FEATURE_DATA_ARCHIVES 0x00000100
#define CASC_FEATURE_DATA_FILES 0x00000200
#define CASC_FEATURE_ONLINE 0x00000400
#define CASC_FEATURE_FORCE_DOWNLOAD 0x00001000
#define CASC_FILE_DATA_ID(FileDataId) ((LPCSTR)(size_t)FileDataId)
#define CASC_FILE_DATA_ID_FROM_STRING(szFileName) ((DWORD)(size_t)szFileName)
#define CASC_KEY_LENGTH 0x10
#define CASC_FILEID_FORMAT "FILE%08X.dat"
#define CASC_PARAM_SEPARATOR '*'
typedef enum _CASC_STORAGE_INFO_CLASS
{
CascStorageLocalFileCount,
CascStorageTotalFileCount,
CascStorageFeatures, CascStorageInstalledLocales, CascStorageProduct, CascStorageTags, CascStoragePathProduct, CascStorageInfoClassMax
} CASC_STORAGE_INFO_CLASS, *PCASC_STORAGE_INFO_CLASS;
typedef enum _CASC_FILE_INFO_CLASS
{
CascFileContentKey,
CascFileEncodedKey,
CascFileFullInfo, CascFileSpanInfo, CascFileInfoClassMax
} CASC_FILE_INFO_CLASS, *PCASC_FILE_INFO_CLASS;
typedef enum _CASC_NAME_TYPE
{
CascNameFull, CascNameDataId, CascNameCKey, CascNameEKey } CASC_NAME_TYPE, *PCASC_NAME_TYPE;
typedef struct _CASC_FIND_DATA
{
char szFileName[MAX_PATH];
BYTE CKey[MD5_HASH_SIZE];
BYTE EKey[MD5_HASH_SIZE];
ULONGLONG TagBitMask;
ULONGLONG FileSize;
char * szPlainName;
DWORD dwFileDataId;
DWORD dwLocaleFlags;
DWORD dwContentFlags;
DWORD dwSpanCount;
DWORD bFileAvailable:1;
CASC_NAME_TYPE NameType;
} CASC_FIND_DATA, *PCASC_FIND_DATA;
typedef struct _CASC_STORAGE_TAG
{
LPCSTR szTagName; DWORD TagNameLength; DWORD TagValue; } CASC_STORAGE_TAG, *PCASC_STORAGE_TAG;
typedef struct _CASC_STORAGE_TAGS
{
size_t TagCount; size_t Reserved;
CASC_STORAGE_TAG Tags[1];
} CASC_STORAGE_TAGS, *PCASC_STORAGE_TAGS;
typedef struct _CASC_STORAGE_PRODUCT
{
char szCodeName[0x1C]; DWORD BuildNumber;
} CASC_STORAGE_PRODUCT, *PCASC_STORAGE_PRODUCT;
typedef struct _CASC_FILE_FULL_INFO
{
BYTE CKey[MD5_HASH_SIZE]; BYTE EKey[MD5_HASH_SIZE]; char DataFileName[0x10]; ULONGLONG StorageOffset; ULONGLONG SegmentOffset; ULONGLONG TagBitMask; ULONGLONG FileNameHash; ULONGLONG ContentSize; ULONGLONG EncodedSize; DWORD SegmentIndex; DWORD SpanCount; DWORD FileDataId; DWORD LocaleFlags; DWORD ContentFlags;
} CASC_FILE_FULL_INFO, *PCASC_FILE_FULL_INFO;
typedef struct _CASC_FILE_SPAN_INFO
{
BYTE CKey[MD5_HASH_SIZE]; BYTE EKey[MD5_HASH_SIZE]; ULONGLONG StartOffset; ULONGLONG EndOffset; DWORD ArchiveIndex; DWORD ArchiveOffs; DWORD HeaderSize; DWORD FrameCount;
} CASC_FILE_SPAN_INFO, *PCASC_FILE_SPAN_INFO;
typedef enum _CASC_PROGRESS_MSG
{
CascProgressLoadingFile, CascProgressLoadingManifest, CascProgressDownloadingFile, CascProgressLoadingIndexes, CascProgressDownloadingArchiveIndexes, } CASC_PROGRESS_MSG, *PCASC_PROGRESS_MSG;
typedef bool (WINAPI * PFNPROGRESSCALLBACK)( void * PtrUserParam, CASC_PROGRESS_MSG ProgressMsg, LPCSTR szObject, DWORD CurrentValue, DWORD TotalValue );
typedef bool (WINAPI * PFNPRODUCTCALLBACK)( void * PtrUserParam, LPCSTR * ProductList, size_t ProductCount, size_t * PtrSelectedProduct );
typedef struct _CASC_OPEN_STORAGE_ARGS
{
size_t Size;
LPCTSTR szLocalPath;
LPCTSTR szCodeName; LPCTSTR szRegion;
PFNPROGRESSCALLBACK PfnProgressCallback; void * PtrProgressParam; PFNPRODUCTCALLBACK PfnProductCallback; void * PtrProductParam;
DWORD dwLocaleMask; DWORD dwFlags;
LPCTSTR szBuildKey;
LPCTSTR szCdnHostUrl;
} CASC_OPEN_STORAGE_ARGS, *PCASC_OPEN_STORAGE_ARGS;
bool WINAPI CascOpenStorageEx(LPCTSTR szParams, PCASC_OPEN_STORAGE_ARGS pArgs, bool bOnlineStorage, HANDLE * phStorage);
bool WINAPI CascOpenStorage(LPCTSTR szParams, DWORD dwLocaleMask, HANDLE * phStorage);
bool WINAPI CascOpenOnlineStorage(LPCTSTR szParams, DWORD dwLocaleMask, HANDLE * phStorage);
bool WINAPI CascGetStorageInfo(HANDLE hStorage, CASC_STORAGE_INFO_CLASS InfoClass, void * pvStorageInfo, size_t cbStorageInfo, size_t * pcbLengthNeeded);
bool WINAPI CascCloseStorage(HANDLE hStorage);
bool WINAPI CascOpenFile(HANDLE hStorage, const void * pvFileName, DWORD dwLocaleFlags, DWORD dwOpenFlags, HANDLE * PtrFileHandle);
bool WINAPI CascOpenLocalFile(LPCTSTR szFileName, DWORD dwOpenFlags, HANDLE * PtrFileHandle);
bool WINAPI CascGetFileInfo(HANDLE hFile, CASC_FILE_INFO_CLASS InfoClass, void * pvFileInfo, size_t cbFileInfo, size_t * pcbLengthNeeded);
bool WINAPI CascSetFileFlags(HANDLE hFile, DWORD dwOpenFlags);
bool WINAPI CascGetFileSize64(HANDLE hFile, PULONGLONG PtrFileSize);
bool WINAPI CascSetFilePointer64(HANDLE hFile, LONGLONG DistanceToMove, PULONGLONG PtrNewPos, DWORD dwMoveMethod);
bool WINAPI CascReadFile(HANDLE hFile, void * lpBuffer, DWORD dwToRead, PDWORD pdwRead);
bool WINAPI CascCloseFile(HANDLE hFile);
DWORD WINAPI CascGetFileSize(HANDLE hFile, PDWORD pdwFileSizeHigh);
DWORD WINAPI CascSetFilePointer(HANDLE hFile, LONG lFilePos, LONG * PtrFilePosHigh, DWORD dwMoveMethod);
HANDLE WINAPI CascFindFirstFile(HANDLE hStorage, LPCSTR szMask, PCASC_FIND_DATA pFindData, LPCTSTR szListFile);
bool WINAPI CascFindNextFile(HANDLE hFind, PCASC_FIND_DATA pFindData);
bool WINAPI CascFindClose(HANDLE hFind);
bool WINAPI CascAddEncryptionKey(HANDLE hStorage, ULONGLONG KeyName, LPBYTE Key);
bool WINAPI CascAddStringEncryptionKey(HANDLE hStorage, ULONGLONG KeyName, LPCSTR szKey);
bool WINAPI CascImportKeysFromString(HANDLE hStorage, LPCSTR szKeyList);
bool WINAPI CascImportKeysFromFile(HANDLE hStorage, LPCTSTR szFileName);
LPBYTE WINAPI CascFindEncryptionKey(HANDLE hStorage, ULONGLONG KeyName);
bool WINAPI CascGetNotFoundEncryptionKey(HANDLE hStorage, ULONGLONG * KeyName);
LPCTSTR WINAPI CascCdnGetDefault();
LPBYTE WINAPI CascCdnDownload(LPCTSTR szCdnHostUrl, LPCTSTR szProduct, LPCTSTR szFileName, DWORD * PtrSize);
void WINAPI CascCdnFree(void * buffer);
void SetCascError(DWORD dwErrCode);
DWORD GetCascError();
#ifdef __cplusplus
} #endif
#endif