mirror of
https://github.com/HarbourMasters/Shipwright.git
synced 2024-12-02 22:32:19 -05:00
b3e299dbde
Some modifications to handle backslashes and forward slashes, along with some optimizations to speed up OTR generation.
184 lines
9.8 KiB
C++
184 lines
9.8 KiB
C++
/*****************************************************************************/
|
|
/* SBaseDumpData.cpp Copyright (c) Ladislav Zezula 2011 */
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Description : */
|
|
/*---------------------------------------------------------------------------*/
|
|
/* Date Ver Who Comment */
|
|
/* -------- ---- --- ------- */
|
|
/* 26.01.11 1.00 Lad The first version of SBaseDumpData.cpp */
|
|
/*****************************************************************************/
|
|
|
|
#define __STORMLIB_SELF__
|
|
#include "StormLib.h"
|
|
#include "StormCommon.h"
|
|
|
|
#ifdef __STORMLIB_DUMP_DATA__
|
|
|
|
void DumpMpqHeader(TMPQHeader * pHeader)
|
|
{
|
|
printf("== MPQ Header =================================\n");
|
|
printf("DWORD dwID = %08X\n", pHeader->dwID);
|
|
printf("DWORD dwHeaderSize = %08X\n", pHeader->dwHeaderSize);
|
|
printf("DWORD dwArchiveSize = %08X\n", pHeader->dwArchiveSize);
|
|
printf("USHORT wFormatVersion = %04X\n", pHeader->wFormatVersion);
|
|
printf("USHORT wSectorSize = %04X\n", pHeader->wSectorSize);
|
|
printf("DWORD dwHashTablePos = %08X\n", pHeader->dwHashTablePos);
|
|
printf("DWORD dwBlockTablePos = %08X\n", pHeader->dwBlockTablePos);
|
|
printf("DWORD dwHashTableSize = %08X\n", pHeader->dwHashTableSize);
|
|
printf("DWORD dwBlockTableSize = %08X\n", pHeader->dwBlockTableSize);
|
|
printf("ULONGLONG HiBlockTablePos64 = %016llX\n", pHeader->HiBlockTablePos64);
|
|
printf("USHORT wHashTablePosHi = %04X\n", pHeader->wHashTablePosHi);
|
|
printf("USHORT wBlockTablePosHi = %04X\n", pHeader->wBlockTablePosHi);
|
|
printf("ULONGLONG ArchiveSize64 = %016llX\n", pHeader->ArchiveSize64);
|
|
printf("ULONGLONG BetTablePos64 = %016llX\n", pHeader->BetTablePos64);
|
|
printf("ULONGLONG HetTablePos64 = %016llX\n", pHeader->HetTablePos64);
|
|
printf("ULONGLONG HashTableSize64 = %016llX\n", pHeader->HashTableSize64);
|
|
printf("ULONGLONG BlockTableSize64 = %016llX\n", pHeader->BlockTableSize64);
|
|
printf("ULONGLONG HiBlockTableSize64 = %016llX\n", pHeader->HiBlockTableSize64);
|
|
printf("ULONGLONG HetTableSize64 = %016llX\n", pHeader->HetTableSize64);
|
|
printf("ULONGLONG BetTableSize64 = %016llX\n", pHeader->BetTableSize64);
|
|
printf("DWORD dwRawChunkSize = %08X\n", pHeader->dwRawChunkSize);
|
|
printf("-----------------------------------------------\n\n");
|
|
}
|
|
|
|
void DumpHashTable(TMPQHash * pHashTable, DWORD dwHashTableSize)
|
|
{
|
|
DWORD i;
|
|
|
|
if(pHashTable == NULL || dwHashTableSize == 0)
|
|
return;
|
|
|
|
printf("== Hash Table =================================\n");
|
|
for(i = 0; i < dwHashTableSize; i++)
|
|
{
|
|
printf("[%08x] %08X %08X %04X %02X %08X\n", i,
|
|
pHashTable[i].dwName1,
|
|
pHashTable[i].dwName2,
|
|
pHashTable[i].lcLocale,
|
|
pHashTable[i].Platform,
|
|
pHashTable[i].dwBlockIndex);
|
|
}
|
|
printf("-----------------------------------------------\n\n");
|
|
}
|
|
|
|
void DumpHetAndBetTable(TMPQHetTable * pHetTable, TMPQBetTable * pBetTable)
|
|
{
|
|
DWORD i;
|
|
|
|
if(pHetTable == NULL || pBetTable == NULL)
|
|
return;
|
|
|
|
printf("== HET Header =================================\n");
|
|
printf("ULONGLONG AndMask64 = %016llX\n", pHetTable->AndMask64);
|
|
printf("ULONGLONG OrMask64 = %016llX\n", pHetTable->OrMask64);
|
|
printf("DWORD dwEntryCount = %08X\n", pHetTable->dwEntryCount);
|
|
printf("DWORD dwTotalCount = %08X\n", pHetTable->dwTotalCount);
|
|
printf("DWORD dwNameHashBitSize = %08X\n", pHetTable->dwNameHashBitSize);
|
|
printf("DWORD dwIndexSizeTotal = %08X\n", pHetTable->dwIndexSizeTotal);
|
|
printf("DWORD dwIndexSizeExtra = %08X\n", pHetTable->dwIndexSizeExtra);
|
|
printf("DWORD dwIndexSize = %08X\n", pHetTable->dwIndexSize);
|
|
printf("-----------------------------------------------\n\n");
|
|
|
|
printf("== BET Header =================================\n");
|
|
printf("DWORD dwTableEntrySize = %08X\n", pBetTable->dwTableEntrySize);
|
|
printf("DWORD dwBitIndex_FilePos = %08X\n", pBetTable->dwBitIndex_FilePos);
|
|
printf("DWORD dwBitIndex_FileSize = %08X\n", pBetTable->dwBitIndex_FileSize);
|
|
printf("DWORD dwBitIndex_CmpSize = %08X\n", pBetTable->dwBitIndex_CmpSize);
|
|
printf("DWORD dwBitIndex_FlagIndex = %08X\n", pBetTable->dwBitIndex_FlagIndex);
|
|
printf("DWORD dwBitIndex_Unknown = %08X\n", pBetTable->dwBitIndex_Unknown);
|
|
printf("DWORD dwBitCount_FilePos = %08X\n", pBetTable->dwBitCount_FilePos);
|
|
printf("DWORD dwBitCount_FileSize = %08X\n", pBetTable->dwBitCount_FileSize);
|
|
printf("DWORD dwBitCount_CmpSize = %08X\n", pBetTable->dwBitCount_CmpSize);
|
|
printf("DWORD dwBitCount_FlagIndex = %08X\n", pBetTable->dwBitCount_FlagIndex);
|
|
printf("DWORD dwBitCount_Unknown = %08X\n", pBetTable->dwBitCount_Unknown);
|
|
printf("DWORD dwBitTotal_NameHash2 = %08X\n", pBetTable->dwBitTotal_NameHash2);
|
|
printf("DWORD dwBitExtra_NameHash2 = %08X\n", pBetTable->dwBitExtra_NameHash2);
|
|
printf("DWORD dwBitCount_NameHash2 = %08X\n", pBetTable->dwBitCount_NameHash2);
|
|
printf("DWORD dwEntryCount = %08X\n", pBetTable->dwEntryCount);
|
|
printf("DWORD dwFlagCount = %08X\n", pBetTable->dwFlagCount);
|
|
printf("-----------------------------------------------\n\n");
|
|
|
|
printf("== HET & Bet Table ======================================================================\n\n");
|
|
printf("HetIdx HetHash BetIdx BetHash ByteOffset FileSize CmpSize FlgIdx Flags \n");
|
|
printf("------ ------- ------ ---------------- ---------------- -------- -------- ------ --------\n");
|
|
for(i = 0; i < pHetTable->dwTotalCount; i++)
|
|
{
|
|
ULONGLONG ByteOffset = 0;
|
|
ULONGLONG BetHash = 0;
|
|
DWORD dwFileSize = 0;
|
|
DWORD dwCmpSize = 0;
|
|
DWORD dwFlagIndex = 0;
|
|
DWORD dwFlags = 0;
|
|
DWORD dwBetIndex = 0;
|
|
|
|
GetMPQBits(pHetTable->pBetIndexes, i * pHetTable->dwIndexSizeTotal,
|
|
pHetTable->dwIndexSize,
|
|
&dwBetIndex, 4);
|
|
|
|
if(dwBetIndex < pHetTable->dwTotalCount)
|
|
{
|
|
DWORD dwEntryIndex = pBetTable->dwTableEntrySize * dwBetIndex;
|
|
|
|
GetMPQBits(pBetTable->pNameHashes, dwBetIndex * pBetTable->dwBitTotal_NameHash2,
|
|
pBetTable->dwBitCount_NameHash2,
|
|
&BetHash, 8);
|
|
|
|
GetMPQBits(pBetTable->pFileTable, dwEntryIndex + pBetTable->dwBitIndex_FilePos,
|
|
pBetTable->dwBitCount_FilePos,
|
|
&ByteOffset, 8);
|
|
|
|
GetMPQBits(pBetTable->pFileTable, dwEntryIndex + pBetTable->dwBitIndex_FileSize,
|
|
pBetTable->dwBitCount_FileSize,
|
|
&dwFileSize, 4);
|
|
|
|
GetMPQBits(pBetTable->pFileTable, dwEntryIndex + pBetTable->dwBitIndex_CmpSize,
|
|
pBetTable->dwBitCount_CmpSize,
|
|
&dwCmpSize, 4);
|
|
|
|
GetMPQBits(pBetTable->pFileTable, dwEntryIndex + pBetTable->dwBitIndex_FlagIndex,
|
|
pBetTable->dwBitCount_FlagIndex,
|
|
&dwFlagIndex, 4);
|
|
|
|
dwFlags = pBetTable->pFileFlags[dwFlagIndex];
|
|
}
|
|
|
|
printf(" %04X %02lX %04X %016llX %016llX %08X %08X %04X %08X\n", i,
|
|
pHetTable->pNameHashes[i],
|
|
dwBetIndex,
|
|
BetHash,
|
|
ByteOffset,
|
|
dwFileSize,
|
|
dwCmpSize,
|
|
dwFlagIndex,
|
|
dwFlags);
|
|
}
|
|
printf("-----------------------------------------------------------------------------------------\n");
|
|
}
|
|
|
|
void DumpFileTable(TFileEntry * pFileTable, DWORD dwFileTableSize)
|
|
{
|
|
DWORD i;
|
|
|
|
if(pFileTable == NULL || dwFileTableSize == 0)
|
|
return;
|
|
|
|
printf("== File Table =================================\n");
|
|
for(i = 0; i < dwFileTableSize; i++, pFileTable++)
|
|
{
|
|
printf("[%04u] %08X-%08X %08X-%08X %08X-%08X 0x%08X 0x%08X 0x%08X %s\n", i,
|
|
(DWORD)(pFileTable->FileNameHash >> 0x20),
|
|
(DWORD)(pFileTable->FileNameHash & 0xFFFFFFFF),
|
|
(DWORD)(pFileTable->ByteOffset >> 0x20),
|
|
(DWORD)(pFileTable->ByteOffset & 0xFFFFFFFF),
|
|
(DWORD)(pFileTable->FileTime >> 0x20),
|
|
(DWORD)(pFileTable->FileTime & 0xFFFFFFFF),
|
|
pFileTable->dwFileSize,
|
|
pFileTable->dwCmpSize,
|
|
pFileTable->dwFlags,
|
|
pFileTable->szFileName != NULL ? pFileTable->szFileName : "");
|
|
}
|
|
printf("-----------------------------------------------\n\n");
|
|
}
|
|
|
|
#endif // __STORMLIB_DUMP_DATA__
|