| 951 | // General EXT table functions |
| 952 | |
| 953 | TMPQExtHeader * LoadExtTable( |
| 954 | TMPQArchive * ha, |
| 955 | ULONGLONG ByteOffset, |
| 956 | size_t Size, |
| 957 | DWORD dwSignature, |
| 958 | DWORD dwKey) |
| 959 | { |
| 960 | TMPQExtHeader * pCompressed = NULL; // Compressed table |
| 961 | TMPQExtHeader * pExtTable = NULL; // Uncompressed table |
| 962 | |
| 963 | // Do nothing if the size is zero |
| 964 | if(ByteOffset != 0 && Size != 0) |
| 965 | { |
| 966 | // Allocate size for the compressed table |
| 967 | pExtTable = (TMPQExtHeader *)STORM_ALLOC(BYTE, Size); |
| 968 | if(pExtTable != NULL) |
| 969 | { |
| 970 | // Load the table from the MPQ |
| 971 | ByteOffset += ha->MpqPos; |
| 972 | if(!FileStream_Read(ha->pStream, &ByteOffset, pExtTable, (DWORD)Size)) |
| 973 | { |
| 974 | STORM_FREE(pExtTable); |
| 975 | return NULL; |
| 976 | } |
| 977 | |
| 978 | // Swap the ext table header |
| 979 | BSWAP_ARRAY32_UNSIGNED(pExtTable, sizeof(TMPQExtHeader)); |
| 980 | if(pExtTable->dwSignature != dwSignature) |
| 981 | { |
| 982 | STORM_FREE(pExtTable); |
| 983 | return NULL; |
| 984 | } |
| 985 | |
| 986 | // Decrypt the block |
| 987 | BSWAP_ARRAY32_UNSIGNED(pExtTable + 1, pExtTable->dwDataSize); |
| 988 | DecryptMpqBlock(pExtTable + 1, (DWORD)(Size - sizeof(TMPQExtHeader)), dwKey); |
| 989 | BSWAP_ARRAY32_UNSIGNED(pExtTable + 1, pExtTable->dwDataSize); |
| 990 | |
| 991 | // If the table is compressed, decompress it |
| 992 | if((pExtTable->dwDataSize + sizeof(TMPQExtHeader)) > Size) |
| 993 | { |
| 994 | pCompressed = pExtTable; |
| 995 | pExtTable = (TMPQExtHeader *)STORM_ALLOC(BYTE, sizeof(TMPQExtHeader) + pCompressed->dwDataSize); |
| 996 | if(pExtTable != NULL) |
| 997 | { |
| 998 | int cbOutBuffer = (int)pCompressed->dwDataSize; |
| 999 | int cbInBuffer = (int)Size; |
| 1000 | |
| 1001 | // Decompress the extended table |
| 1002 | pExtTable->dwSignature = pCompressed->dwSignature; |
| 1003 | pExtTable->dwVersion = pCompressed->dwVersion; |
| 1004 | pExtTable->dwDataSize = pCompressed->dwDataSize; |
| 1005 | if(!SCompDecompress2(pExtTable + 1, &cbOutBuffer, pCompressed + 1, cbInBuffer)) |
| 1006 | { |
| 1007 | STORM_FREE(pExtTable); |
| 1008 | pExtTable = NULL; |
| 1009 | } |
| 1010 | } |
no test coverage detected