diff options
author | Ladislav Zezula <ladislav.zezula@avg.com> | 2013-01-11 14:55:08 +0100 |
---|---|---|
committer | Ladislav Zezula <ladislav.zezula@avg.com> | 2013-01-11 14:55:08 +0100 |
commit | 3a926f0228c68d7d91cf3946624d7859976440ec (patch) | |
tree | c4e7d36dc8157576929988cdfcf5bfd8262cd09c /src/FileStream.h | |
parent | df4b0c085478389c9a21a09521d46735a0109c8a (diff) |
Initial creation
Diffstat (limited to 'src/FileStream.h')
-rw-r--r-- | src/FileStream.h | 189 |
1 files changed, 189 insertions, 0 deletions
diff --git a/src/FileStream.h b/src/FileStream.h new file mode 100644 index 0000000..d00c82e --- /dev/null +++ b/src/FileStream.h @@ -0,0 +1,189 @@ +/*****************************************************************************/ +/* 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 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_GETPOS)( + struct TFileStream * pStream, // Pointer to an open stream + ULONGLONG * pByteOffset // Pointer to store current file position + ); + +typedef bool (*STREAM_GETSIZE)( + struct TFileStream * pStream, // Pointer to an open stream + ULONGLONG * pFileSize // Receives the file size, in bytes + ); + +typedef bool (*STREAM_SETSIZE)( + struct TFileStream * pStream, // Pointer to an open stream + ULONGLONG FileSize // New size for the file, in bytes + ); + +typedef bool (*STREAM_GETTIME)( + struct TFileStream * pStream, + ULONGLONG * pFT + ); + +typedef bool (*STREAM_SWITCH)( + struct TFileStream * pStream, + struct TFileStream * pNewStream + ); + +typedef bool (*STREAM_GETBMP)( + TFileStream * pStream, + TFileBitmap * pBitmap, + DWORD Length, + LPDWORD LengthNeeded + ); + +typedef void (*STREAM_CLOSE)( + struct TFileStream * pStream + ); + +//----------------------------------------------------------------------------- +// Local structures - part file structure + +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; + +//----------------------------------------------------------------------------- +// Local structures + +union TBaseData +{ + struct + { + ULONGLONG FileSize; // Size of the file + ULONGLONG FilePos; // Current file position + ULONGLONG FileTime; // Date/time of last modification of the file + HANDLE hFile; // File handle + } File; + + struct + { + ULONGLONG FileSize; // Mapped file size + ULONGLONG FilePos; // Current stream position + ULONGLONG FileTime; // Date/time of last modification of the file + LPBYTE pbFile; // Pointer to mapped view + } Map; + + struct + { + ULONGLONG FileSize; // Size of the internet file + ULONGLONG FilePos; // Current position in the file + ULONGLONG FileTime; // Date/time of last modification of the file + HANDLE hInternet; // Internet handle + HANDLE hConnect; // Connection to the internet server + } Http; +}; + +//----------------------------------------------------------------------------- +// Structure for linear stream + +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_GETPOS StreamGetPos; // Pointer to function that returns current file position + STREAM_GETSIZE StreamGetSize; // Pointer to function returning file size + STREAM_SETSIZE StreamSetSize; // Pointer to function changing file size + STREAM_GETTIME StreamGetTime; // Pointer to function retrieving the file time + STREAM_GETBMP StreamGetBmp; // Pointer to function that retrieves the file bitmap + STREAM_SWITCH StreamSwitch; // Pointer to function changing the stream to another file + STREAM_CLOSE StreamClose; // Pointer to function closing the stream + + // Stream provider data members + TCHAR szFileName[MAX_PATH]; // File name + DWORD dwFlags; // Stream flags + + // Base provider functions + STREAM_READ BaseRead; + STREAM_WRITE BaseWrite; + STREAM_GETPOS BaseGetPos; // Pointer to function that returns current file position + STREAM_GETSIZE BaseGetSize; // Pointer to function returning file size + STREAM_SETSIZE BaseSetSize; // Pointer to function changing file size + STREAM_GETTIME BaseGetTime; // Pointer to function retrieving the file time + STREAM_CLOSE BaseClose; // Pointer to function closing the stream + + // Base provider data members + TBaseData Base; // Base provider data + + // Followed by stream provider data, with variable length +}; + +//----------------------------------------------------------------------------- +// Structure for linear stream + +struct TLinearStream : public TFileStream +{ + TFileBitmap * pBitmap; // Pointer to the stream bitmap +}; + +//----------------------------------------------------------------------------- +// Structure for partial stream + +struct TPartialStream : public TFileStream +{ + ULONGLONG VirtualSize; // Virtual size of the file + ULONGLONG VirtualPos; // Virtual position in the file + DWORD BlockCount; // Number of file blocks. Used by partial file stream + DWORD BlockSize; // Size of one block. Used by partial file stream + + PPART_FILE_MAP_ENTRY PartMap; // File map, variable length +}; + +//----------------------------------------------------------------------------- +// Structure for encrypted stream + +#define MPQE_CHUNK_SIZE 0x40 // Size of one chunk to be decrypted + +struct TEncryptedStream : public TFileStream +{ + BYTE Key[MPQE_CHUNK_SIZE]; // File key +}; + +#endif // __FILESTREAM_H__ |