| 578 | } |
| 579 | |
| 580 | TMPQBlock * LoadMpkBlockTable(TMPQArchive * ha) |
| 581 | { |
| 582 | TMPQHeader * pHeader = ha->pHeader; |
| 583 | TMPKBlock * pMpkBlockTable; |
| 584 | TMPKBlock * pMpkBlockEnd; |
| 585 | TMPQBlock * pBlockTable = NULL; |
| 586 | TMPKBlock * pMpkBlock; |
| 587 | TMPQBlock * pMpqBlock; |
| 588 | |
| 589 | // Load and decrypt the MPK block table |
| 590 | pMpkBlockTable = pMpkBlock = (TMPKBlock *)LoadMpkTable(ha, pHeader->dwBlockTablePos, pHeader->dwBlockTableSize * sizeof(TMPKBlock)); |
| 591 | if(pMpkBlockTable != NULL) |
| 592 | { |
| 593 | // Allocate buffer for MPQ-like block table |
| 594 | pBlockTable = pMpqBlock = STORM_ALLOC(TMPQBlock, pHeader->dwBlockTableSize); |
| 595 | if(pBlockTable != NULL) |
| 596 | { |
| 597 | // Convert the MPK block table to MPQ block table |
| 598 | pMpkBlockEnd = pMpkBlockTable + pHeader->dwBlockTableSize; |
| 599 | while(pMpkBlock < pMpkBlockEnd) |
| 600 | { |
| 601 | // Translate the MPK block table entry to MPQ block table entry |
| 602 | pMpqBlock->dwFilePos = pMpkBlock->dwFilePos; |
| 603 | pMpqBlock->dwCSize = pMpkBlock->dwCSize; |
| 604 | pMpqBlock->dwFSize = pMpkBlock->dwFSize; |
| 605 | pMpqBlock->dwFlags = ConvertMpkFlagsToMpqFlags(pMpkBlock->dwFlags); |
| 606 | |
| 607 | // Move both |
| 608 | pMpkBlock++; |
| 609 | pMpqBlock++; |
| 610 | } |
| 611 | } |
| 612 | |
| 613 | // Free the MPK block table |
| 614 | STORM_FREE(pMpkBlockTable); |
| 615 | } |
| 616 | |
| 617 | return pBlockTable; |
| 618 | } |
no test coverage detected