You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
217 lines
9.9 KiB
217 lines
9.9 KiB
/*****************************************************************************/ |
|
/* FileStream.h Copyright (c) Ladislav Zezula 2012 */ |
|
/*---------------------------------------------------------------------------*/ |
|
/* Description: Definitions for FileStream object */ |
|
/*---------------------------------------------------------------------------*/ |
|
/* Date Ver Who Comment */ |
|
/* -------- ---- --- ------- */ |
|
/* 14.04.12 1.00 Lad The first version of FileStream.h */ |
|
/*****************************************************************************/ |
|
|
|
#ifndef __FILESTREAM_H__ |
|
#define __FILESTREAM_H__ |
|
|
|
//----------------------------------------------------------------------------- |
|
// Function prototypes |
|
|
|
typedef void (*STREAM_INIT)( |
|
struct TFileStream * pStream // Pointer to an unopened stream |
|
); |
|
|
|
typedef bool (*STREAM_CREATE)( |
|
struct TFileStream * pStream // Pointer to an unopened stream |
|
); |
|
|
|
typedef bool (*STREAM_OPEN)( |
|
struct TFileStream * pStream, // Pointer to an unopened stream |
|
const TCHAR * szFileName, // Pointer to file name to be open |
|
DWORD dwStreamFlags // Stream flags |
|
); |
|
|
|
typedef bool (*STREAM_READ)( |
|
struct TFileStream * pStream, // Pointer to an open stream |
|
ULONGLONG * pByteOffset, // Pointer to file byte offset. If NULL, it reads from the current position |
|
void * pvBuffer, // Pointer to data to be read |
|
DWORD dwBytesToRead // Number of bytes to read from the file |
|
); |
|
|
|
typedef bool (*STREAM_WRITE)( |
|
struct TFileStream * pStream, // Pointer to an open stream |
|
ULONGLONG * pByteOffset, // Pointer to file byte offset. If NULL, it writes to the current position |
|
const void * pvBuffer, // Pointer to data to be written |
|
DWORD dwBytesToWrite // Number of bytes to read from the file |
|
); |
|
|
|
typedef bool (*STREAM_RESIZE)( |
|
struct TFileStream * pStream, // Pointer to an open stream |
|
ULONGLONG FileSize // New size for the file, in bytes |
|
); |
|
|
|
typedef bool (*STREAM_GETSIZE)( |
|
struct TFileStream * pStream, // Pointer to an open stream |
|
ULONGLONG * pFileSize // Receives the file size, in bytes |
|
); |
|
|
|
typedef bool (*STREAM_GETPOS)( |
|
struct TFileStream * pStream, // Pointer to an open stream |
|
ULONGLONG * pByteOffset // Pointer to store current file position |
|
); |
|
|
|
typedef void (*STREAM_CLOSE)( |
|
struct TFileStream * pStream // Pointer to an open stream |
|
); |
|
|
|
typedef bool (*BLOCK_READ)( |
|
struct TFileStream * pStream, // Pointer to a block-oriented stream |
|
ULONGLONG StartOffset, // Byte offset of start of the block array |
|
ULONGLONG EndOffset, // End offset (either end of the block or end of the file) |
|
LPBYTE BlockBuffer, // Pointer to block-aligned buffer |
|
DWORD BytesNeeded, // Number of bytes that are really needed |
|
bool bAvailable // true if the block is available |
|
); |
|
|
|
typedef bool (*BLOCK_CHECK)( |
|
struct TFileStream * pStream, // Pointer to a block-oriented stream |
|
ULONGLONG BlockOffset // Offset of the file to check |
|
); |
|
|
|
typedef void (*BLOCK_SAVEMAP)( |
|
struct TFileStream * pStream // Pointer to a block-oriented stream |
|
); |
|
|
|
//----------------------------------------------------------------------------- |
|
// Local structures - partial file structure and bitmap footer |
|
|
|
#define ID_FILE_BITMAP_FOOTER 0x33767470 // Signature of the file bitmap footer ('ptv3') |
|
#define DEFAULT_BLOCK_SIZE 0x00004000 // Default size of the stream block |
|
#define DEFAULT_BUILD_NUMBER 10958 // Build number for newly created partial MPQs |
|
|
|
typedef struct _PART_FILE_HEADER |
|
{ |
|
DWORD PartialVersion; // Always set to 2 |
|
char GameBuildNumber[0x20]; // Minimum build number of the game that can use this MPQ |
|
DWORD Flags; // Flags (details unknown) |
|
DWORD FileSizeLo; // Low 32 bits of the contained file size |
|
DWORD FileSizeHi; // High 32 bits of the contained file size |
|
DWORD BlockSize; // Size of one file block, in bytes |
|
|
|
} PART_FILE_HEADER, *PPART_FILE_HEADER; |
|
|
|
// Structure describing the block-to-file map entry |
|
typedef struct _PART_FILE_MAP_ENTRY |
|
{ |
|
DWORD Flags; // 3 = the block is present in the file |
|
DWORD BlockOffsLo; // Low 32 bits of the block position in the file |
|
DWORD BlockOffsHi; // High 32 bits of the block position in the file |
|
DWORD LargeValueLo; // 64-bit value, meaning is unknown |
|
DWORD LargeValueHi; |
|
|
|
} PART_FILE_MAP_ENTRY, *PPART_FILE_MAP_ENTRY; |
|
|
|
typedef struct _FILE_BITMAP_FOOTER |
|
{ |
|
DWORD Signature; // 'ptv3' (ID_FILE_BITMAP_FOOTER) |
|
DWORD Version; // Unknown, seems to always have value of 3 (version?) |
|
DWORD BuildNumber; // Game build number for that MPQ |
|
DWORD MapOffsetLo; // Low 32-bits of the offset of the bit map |
|
DWORD MapOffsetHi; // High 32-bits of the offset of the bit map |
|
DWORD BlockSize; // Size of one block (usually 0x4000 bytes) |
|
|
|
} FILE_BITMAP_FOOTER, *PFILE_BITMAP_FOOTER; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Structure for file stream |
|
|
|
union TBaseProviderData |
|
{ |
|
struct |
|
{ |
|
ULONGLONG FileSize; // Size of the file |
|
ULONGLONG FilePos; // Current file position |
|
ULONGLONG FileTime; // Last write time |
|
HANDLE hFile; // File handle |
|
} File; |
|
|
|
struct |
|
{ |
|
ULONGLONG FileSize; // Size of the file |
|
ULONGLONG FilePos; // Current file position |
|
ULONGLONG FileTime; // Last write time |
|
LPBYTE pbFile; // Pointer to mapped view |
|
} Map; |
|
|
|
struct |
|
{ |
|
ULONGLONG FileSize; // Size of the file |
|
ULONGLONG FilePos; // Current file position |
|
ULONGLONG FileTime; // Last write time |
|
HANDLE hInternet; // Internet handle |
|
HANDLE hConnect; // Connection to the internet server |
|
} Http; |
|
}; |
|
|
|
struct TFileStream |
|
{ |
|
// Stream provider functions |
|
STREAM_READ StreamRead; // Pointer to stream read function for this archive. Do not use directly. |
|
STREAM_WRITE StreamWrite; // Pointer to stream write function for this archive. Do not use directly. |
|
STREAM_RESIZE StreamResize; // Pointer to function changing file size |
|
STREAM_GETSIZE StreamGetSize; // Pointer to function returning file size |
|
STREAM_GETPOS StreamGetPos; // Pointer to function that returns current file position |
|
STREAM_CLOSE StreamClose; // Pointer to function closing the stream |
|
|
|
// Block-oriented functions |
|
BLOCK_READ BlockRead; // Pointer to function reading one or more blocks |
|
BLOCK_CHECK BlockCheck; // Pointer to function checking whether the block is present |
|
|
|
// Base provider functions |
|
STREAM_CREATE BaseCreate; // Pointer to base create function |
|
STREAM_OPEN BaseOpen; // Pointer to base open function |
|
STREAM_READ BaseRead; // Read from the stream |
|
STREAM_WRITE BaseWrite; // Write to the stream |
|
STREAM_RESIZE BaseResize; // Pointer to function changing file size |
|
STREAM_GETSIZE BaseGetSize; // Pointer to function returning file size |
|
STREAM_GETPOS BaseGetPos; // Pointer to function that returns current file position |
|
STREAM_CLOSE BaseClose; // Pointer to function closing the stream |
|
|
|
// Base provider data (file size, file position) |
|
TBaseProviderData Base; |
|
|
|
// Stream provider data |
|
TFileStream * pMaster; // Master stream (e.g. MPQ on a web server) |
|
TCHAR * szFileName; // File name (self-relative pointer) |
|
|
|
ULONGLONG StreamSize; // Stream size (can be less than file size) |
|
ULONGLONG StreamPos; // Stream position |
|
DWORD BuildNumber; // Game build number |
|
DWORD dwFlags; // Stream flags |
|
|
|
// Followed by stream provider data, with variable length |
|
}; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Structures for block-oriented stream |
|
|
|
struct TBlockStream : public TFileStream |
|
{ |
|
SFILE_DOWNLOAD_CALLBACK pfnCallback; // Callback for downloading |
|
void * FileBitmap; // Array of bits for file blocks |
|
void * UserData; // User data to be passed to the download callback |
|
DWORD BitmapSize; // Size of the file bitmap (in bytes) |
|
DWORD BlockSize; // Size of one block, in bytes |
|
DWORD BlockCount; // Number of data blocks in the file |
|
DWORD IsComplete; // If nonzero, no blocks are missing |
|
DWORD IsModified; // nonzero if the bitmap has been modified |
|
}; |
|
|
|
//----------------------------------------------------------------------------- |
|
// Structure for encrypted stream |
|
|
|
#define MPQE_CHUNK_SIZE 0x40 // Size of one chunk to be decrypted |
|
|
|
struct TEncryptedStream : public TBlockStream |
|
{ |
|
BYTE Key[MPQE_CHUNK_SIZE]; // File key |
|
}; |
|
|
|
#endif // __FILESTREAM_H__
|
|
|