static PLISTFILE_MAP ListMap_Finish(PLISTFILE_MAP pListMap) { PLISTFILE_ENTRY pListEntry; PCASC_MAP pMap; LPBYTE pbEntry; // Sanity check assert(pListMap->pNameMap == NULL); // Create the map pListMap->pNameMap = pMap = Map_Create((DWORD)pListMap->nEntries, sizeof(ULONGLONG), 0); if(pListMap->pNameMap == NULL) { ListFile_FreeMap(pListMap); return NULL; } // Fill the map pbEntry = (LPBYTE)(pListMap + 1); for(size_t i = 0; i < pListMap->nEntries; i++) { // Get the listfile entry pListEntry = (PLISTFILE_ENTRY)pbEntry; pbEntry += pListEntry->cbEntrySize; // Insert the entry to the map Map_InsertObject(pMap, pListEntry); } return pListMap; }
static void TRootHandlerWoW6_Dump( TCascStorage * hs, TDumpContext * dc, // Pointer to an opened file LPBYTE pbRootFile, DWORD cbRootFile, const TCHAR * szListFile, int nDumpLevel) { PCASC_ENCODING_ENTRY pEncodingEntry; CASC_ROOT_BLOCK BlockInfo; PLISTFILE_MAP pListMap; QUERY_KEY EncodingKey; LPBYTE pbRootFileEnd = pbRootFile + cbRootFile; LPBYTE pbFilePointer; char szOneLine[0x100]; DWORD i; // Create the listfile map pListMap = ListFile_CreateMap(szListFile); // Dump the root entries for(pbFilePointer = pbRootFile; pbFilePointer <= pbRootFileEnd; ) { // Validate the root block pbFilePointer = VerifyLocaleBlock(&BlockInfo, pbFilePointer, pbRootFileEnd); if(pbFilePointer == NULL) break; // Dump the locale block dump_print(dc, "Flags: %08X Locales: %08X NumberOfFiles: %u\n" "=========================================================\n", BlockInfo.pLocaleBlockHdr->Flags, BlockInfo.pLocaleBlockHdr->Locales, BlockInfo.pLocaleBlockHdr->NumberOfFiles); // Dump the hashes and encoding keys for(i = 0; i < BlockInfo.pLocaleBlockHdr->NumberOfFiles; i++) { // Dump the entry dump_print(dc, "%08X %08X-%08X %s %s\n", (DWORD)(BlockInfo.FileDataIds[i]), (DWORD)(BlockInfo.pRootEntries[i].FileNameHash >> 0x20), (DWORD)(BlockInfo.pRootEntries[i].FileNameHash), StringFromMD5(BlockInfo.pRootEntries[i].EncodingKey.Value, szOneLine), ListFile_FindName(pListMap, BlockInfo.pRootEntries[i].FileNameHash)); // Find the encoding entry in the encoding table if(nDumpLevel >= DUMP_LEVEL_ENCODING_FILE) { EncodingKey.pbData = BlockInfo.pRootEntries[i].EncodingKey.Value; EncodingKey.cbData = MD5_HASH_SIZE; pEncodingEntry = FindEncodingEntry(hs, &EncodingKey, NULL); CascDumpEncodingEntry(hs, dc, pEncodingEntry, nDumpLevel); } } // Put extra newline dump_print(dc, "\n"); } ListFile_FreeMap(pListMap); }