| 2225 | } |
| 2226 | |
| 2227 | TMPQBlock * LoadBlockTable(TMPQArchive * ha, bool /* bDontFixEntries */) |
| 2228 | { |
| 2229 | TMPQHeader * pHeader = ha->pHeader; |
| 2230 | TMPQBlock * pBlockTable = NULL; |
| 2231 | ULONGLONG ByteOffset; |
| 2232 | DWORD dwTableSize; |
| 2233 | DWORD dwCmpSize; |
| 2234 | bool bBlockTableIsCut = false; |
| 2235 | |
| 2236 | // Note: It is possible that the block table starts at offset 0 |
| 2237 | // Example: MPQ_2016_v1_ProtectedMap_HashOffsIsZero.w3x |
| 2238 | // if(pHeader->dwBlockTablePos == 0 && pHeader->wBlockTablePosHi == 0) |
| 2239 | // return NULL; |
| 2240 | |
| 2241 | // Do nothing if the block table size is zero |
| 2242 | if(pHeader->dwBlockTableSize == 0) |
| 2243 | return NULL; |
| 2244 | |
| 2245 | // Load the block table for MPQ variations |
| 2246 | switch(ha->dwSubType) |
| 2247 | { |
| 2248 | case MPQ_SUBTYPE_MPQ: |
| 2249 | |
| 2250 | // Calculate byte position of the block table |
| 2251 | ByteOffset = FileOffsetFromMpqOffset(ha, MAKE_OFFSET64(pHeader->wBlockTablePosHi, pHeader->dwBlockTablePos)); |
| 2252 | dwTableSize = pHeader->dwBlockTableSize * sizeof(TMPQBlock); |
| 2253 | dwCmpSize = (DWORD)pHeader->BlockTableSize64; |
| 2254 | |
| 2255 | // Read, decrypt and uncompress the block table |
| 2256 | pBlockTable = (TMPQBlock * )LoadMpqTable(ha, ByteOffset, dwCmpSize, dwTableSize, MPQ_KEY_BLOCK_TABLE, &bBlockTableIsCut); |
| 2257 | |
| 2258 | // If the block table was cut, we need to remember it |
| 2259 | if(pBlockTable != NULL && bBlockTableIsCut) |
| 2260 | ha->dwFlags |= (MPQ_FLAG_MALFORMED | MPQ_FLAG_BLOCK_TABLE_CUT); |
| 2261 | break; |
| 2262 | |
| 2263 | case MPQ_SUBTYPE_SQP: |
| 2264 | |
| 2265 | pBlockTable = LoadSqpBlockTable(ha); |
| 2266 | break; |
| 2267 | |
| 2268 | case MPQ_SUBTYPE_MPK: |
| 2269 | |
| 2270 | pBlockTable = LoadMpkBlockTable(ha); |
| 2271 | break; |
| 2272 | } |
| 2273 | |
| 2274 | return pBlockTable; |
| 2275 | } |
| 2276 | |
| 2277 | #ifdef FULL |
| 2278 | TMPQHetTable * LoadHetTable(TMPQArchive * ha) |
no test coverage detected