| 259 | } |
| 260 | |
| 261 | static ULONGLONG DetermineArchiveSize_V2( |
| 262 | TMPQHeader * pHeader, |
| 263 | ULONGLONG MpqOffset, |
| 264 | ULONGLONG FileSize) |
| 265 | { |
| 266 | ULONGLONG EndOfMpq = FileSize; |
| 267 | DWORD dwArchiveSize32; |
| 268 | |
| 269 | // This could only be called for MPQs version 2.0 |
| 270 | assert(pHeader->wFormatVersion == MPQ_FORMAT_VERSION_2); |
| 271 | |
| 272 | // Check if we can rely on the archive size in the header |
| 273 | if((FileSize >> 0x20) == 0) |
| 274 | { |
| 275 | if(pHeader->dwBlockTablePos < pHeader->dwArchiveSize) |
| 276 | { |
| 277 | if((pHeader->dwArchiveSize - pHeader->dwBlockTablePos) <= (pHeader->dwBlockTableSize * sizeof(TMPQBlock))) |
| 278 | return pHeader->dwArchiveSize; |
| 279 | |
| 280 | // If the archive size in the header is less than real file size |
| 281 | dwArchiveSize32 = (DWORD)(FileSize - MpqOffset); |
| 282 | if(pHeader->dwArchiveSize <= dwArchiveSize32) |
| 283 | return pHeader->dwArchiveSize; |
| 284 | } |
| 285 | } |
| 286 | |
| 287 | // Return the calculated archive size |
| 288 | return (EndOfMpq - MpqOffset); |
| 289 | } |
| 290 | |
| 291 | ULONGLONG FileOffsetFromMpqOffset(TMPQArchive * ha, ULONGLONG MpqOffset) |
| 292 | { |
no outgoing calls
no test coverage detected