| 1305 | } |
| 1306 | |
| 1307 | static TMPQHetTable * TranslateHetTable(TMPQHetHeader * pHetHeader) |
| 1308 | { |
| 1309 | TMPQHetTable * pHetTable = NULL; |
| 1310 | LPBYTE pbSrcData = (LPBYTE)(pHetHeader + 1); |
| 1311 | |
| 1312 | // Sanity check |
| 1313 | assert(pHetHeader->ExtHdr.dwSignature == HET_TABLE_SIGNATURE); |
| 1314 | assert(pHetHeader->ExtHdr.dwVersion == 1); |
| 1315 | |
| 1316 | // Verify size of the HET table |
| 1317 | if(pHetHeader->ExtHdr.dwDataSize >= (sizeof(TMPQHetHeader) - sizeof(TMPQExtHeader))) |
| 1318 | { |
| 1319 | // Verify the size of the table in the header |
| 1320 | if(pHetHeader->dwTableSize == pHetHeader->ExtHdr.dwDataSize) |
| 1321 | { |
| 1322 | // The size of the HET table must be sum of header, hash and index table size |
| 1323 | assert((sizeof(TMPQHetHeader) - sizeof(TMPQExtHeader) + pHetHeader->dwTotalCount + pHetHeader->dwIndexTableSize) == pHetHeader->dwTableSize); |
| 1324 | |
| 1325 | // So far, all MPQs with HET Table have had total number of entries equal to 4/3 of file count |
| 1326 | // Exception: "2010 - Starcraft II\!maps\Tya's Zerg Defense (unprotected).SC2Map" |
| 1327 | // assert(((pHetHeader->dwEntryCount * 4) / 3) == pHetHeader->dwTotalCount); |
| 1328 | |
| 1329 | // The size of one index is predictable as well |
| 1330 | assert(GetNecessaryBitCount(pHetHeader->dwEntryCount) == pHetHeader->dwIndexSizeTotal); |
| 1331 | |
| 1332 | // The size of index table (in entries) is expected |
| 1333 | // to be the same like the hash table size (in bytes) |
| 1334 | assert(((pHetHeader->dwTotalCount * pHetHeader->dwIndexSizeTotal) + 7) / 8 == pHetHeader->dwIndexTableSize); |
| 1335 | |
| 1336 | // Create translated table |
| 1337 | pHetTable = CreateHetTable(pHetHeader->dwEntryCount, pHetHeader->dwTotalCount, pHetHeader->dwNameHashBitSize, pbSrcData); |
| 1338 | if(pHetTable != NULL) |
| 1339 | { |
| 1340 | // Now the sizes in the hash table should be already set |
| 1341 | assert(pHetTable->dwEntryCount == pHetHeader->dwEntryCount); |
| 1342 | assert(pHetTable->dwTotalCount == pHetHeader->dwTotalCount); |
| 1343 | assert(pHetTable->dwIndexSizeTotal == pHetHeader->dwIndexSizeTotal); |
| 1344 | |
| 1345 | // Copy the missing variables |
| 1346 | pHetTable->dwIndexSizeExtra = pHetHeader->dwIndexSizeExtra; |
| 1347 | pHetTable->dwIndexSize = pHetHeader->dwIndexSize; |
| 1348 | } |
| 1349 | } |
| 1350 | } |
| 1351 | |
| 1352 | return pHetTable; |
| 1353 | } |
| 1354 | |
| 1355 | static TMPQExtHeader * TranslateHetTable(TMPQHetTable * pHetTable, ULONGLONG * pcbHetTable) |
| 1356 | { |
no test coverage detected