diff options
Diffstat (limited to 'dep/CascLib/src/CascRootFile_OW.cpp')
-rw-r--r-- | dep/CascLib/src/CascRootFile_OW.cpp | 605 |
1 files changed, 208 insertions, 397 deletions
diff --git a/dep/CascLib/src/CascRootFile_OW.cpp b/dep/CascLib/src/CascRootFile_OW.cpp index b1fbd5b9fec..05a33ff7a51 100644 --- a/dep/CascLib/src/CascRootFile_OW.cpp +++ b/dep/CascLib/src/CascRootFile_OW.cpp @@ -12,107 +12,15 @@ #include "CascLib.h" #include "CascCommon.h" -//----------------------------------------------------------------------------- -// Structure definitions for CMF files - -#define MAX_LINE_ELEMENTS 8 - -typedef struct _CMF_HEADER_V3 -{ - DWORD BuildVersion; - DWORD Unknown0; - DWORD Unknown1; - DWORD Unknown2; - DWORD Unknown3; - DWORD DataCount; - DWORD Unknown4; - DWORD EntryCount; - DWORD Magic; -} CMF_HEADER_V3, *PCMF_HEADER_V3; - -typedef struct _CMF_HEADER_V2 -{ - DWORD BuildVersion; - DWORD Unknown0; - DWORD Unknown1; - DWORD Unknown2; - DWORD DataCount; - DWORD Unknown3; - DWORD EntryCount; - DWORD Magic; -} CMF_HEADER_V2, *PCMF_HEADER_V2; +// Implemented in "overwatch/apm.cpp" +DWORD LoadApplicationPackageManifestFile(TCascStorage * hs, CASC_FILE_TREE & FileTree, PCASC_CKEY_ENTRY pCKeyEntry, const char * szApmFileName); -typedef struct _CMF_HEADER_V1 -{ - DWORD BuildVersion; - DWORD Unknown0; - DWORD DataCount; - DWORD Unknown1; - DWORD EntryCount; - DWORD Magic; -} CMF_HEADER_V1, *PCMF_HEADER_V1; +// Implemented in "overwatch/cmf.cpp" +DWORD LoadContentManifestFile(TCascStorage * hs, CASC_FILE_TREE & FileTree, PCASC_CKEY_ENTRY pCKeyEntry, const char * szFileName); //----------------------------------------------------------------------------- // Structure definitions for APM files -// In-memory format -typedef struct _APM_ENTRY -{ - DWORD Index; - ULONGLONG HashA; - ULONGLONG HashB; -} APM_ENTRY, *PAPM_ENTRY; - -// On-disk format, size = 0x14 -typedef struct _APM_ENTRY_V2 -{ - DWORD Index; - DWORD HashA_Lo; // Must split the hashes in order to make this structure properly aligned - DWORD HashA_Hi; - DWORD HashB_Lo; - DWORD HashB_Hi; -} APM_ENTRY_V2, *PAPM_ENTRY_V2; - -// On-disk format, size = 0x0C -typedef struct _APM_ENTRY_V1 -{ - DWORD Index; - DWORD HashA_Lo; // Must split the hashes in order to make this structure properly aligned - DWORD HashA_Hi; -} APM_ENTRY_V1, *PAPM_ENTRY_V1; - -// In-memory format -typedef struct _APM_PACKAGE_ENTRY -{ - ULONGLONG PackageGUID; // 077 file - ULONGLONG Unknown1; - DWORD Unknown2; - DWORD Unknown3; - ULONGLONG Unknown4; -} APM_PACKAGE_ENTRY, *PAPM_PACKAGE_ENTRY; - -// On-disk format -typedef struct _APM_PACKAGE_ENTRY_V2 -{ - ULONGLONG PackageGUID; // 077 file - ULONGLONG Unknown1; - DWORD Unknown2; - DWORD Unknown3; - ULONGLONG Unknown4; -} APM_PACKAGE_ENTRY_V2, *PAPM_PACKAGE_ENTRY_V2; - -// On-disk format -typedef struct _APM_PACKAGE_ENTRY_V1 -{ - ULONGLONG EntryPointGUID; // virtual most likely - ULONGLONG PrimaryGUID; // real - ULONGLONG SecondaryGUID; // real - ULONGLONG Key; // encryption - ULONGLONG PackageGUID; // 077 file - ULONGLONG Unknown1; - DWORD Unknown2; -} APM_PACKAGE_ENTRY_V1, *PAPM_PACKAGE_ENTRY_V1; - typedef struct _APM_HEADER_V3 { ULONGLONG BuildNumber; // Build number of the game @@ -126,7 +34,7 @@ typedef struct _APM_HEADER_V3 // Followed by the array of APM_ENTRY (count is in "EntryCount") // Followed by the array of APM_PACKAGE (count is in "PackageCount") -} APM_HEADER_V3, *PAPM_HEADER_V3; +} APM_HEADER_V3, * PAPM_HEADER_V3; typedef struct _APM_HEADER_V2 { @@ -140,7 +48,7 @@ typedef struct _APM_HEADER_V2 // Followed by the array of APM_ENTRY (count is in "EntryCount") // Followed by the array of APM_PACKAGE (count is in "PackageCount") -} APM_HEADER_V2, *PAPM_HEADER_V2; +} APM_HEADER_V2, * PAPM_HEADER_V2; typedef struct _APM_HEADER_V1 { @@ -153,224 +61,218 @@ typedef struct _APM_HEADER_V1 // Followed by the array of APM_ENTRY (count is in "EntryCount") // Followed by the array of APM_PACKAGE (count is in "PackageCount") -} APM_HEADER_V1, *PAPM_HEADER_V1; +} APM_HEADER_V1, * PAPM_HEADER_V1; + +// On-disk format, size = 0x0C +typedef struct _APM_ENTRY_V1 +{ + DWORD Index; + DWORD HashA_Lo; // Must split the hashes in order to make this structure properly aligned + DWORD HashA_Hi; +} APM_ENTRY_V1, * PAPM_ENTRY_V1; + +// On-disk format, size = 0x14 +typedef struct _APM_ENTRY_V2 +{ + DWORD Index; + DWORD HashA_Lo; // Must split the hashes in order to make this structure properly aligned + DWORD HashA_Hi; + DWORD HashB_Lo; + DWORD HashB_Hi; +} APM_ENTRY_V2, *PAPM_ENTRY_V2; + +// On-disk format +typedef struct _APM_PACKAGE_ENTRY_V1 +{ + ULONGLONG EntryPointGUID; // virtual most likely + ULONGLONG PrimaryGUID; // real + ULONGLONG SecondaryGUID; // real + ULONGLONG Key; // encryption + ULONGLONG PackageGUID; // 077 file + ULONGLONG Unknown1; + DWORD Unknown2; +} APM_PACKAGE_ENTRY_V1, * PAPM_PACKAGE_ENTRY_V1; + +// On-disk format +typedef struct _APM_PACKAGE_ENTRY_V2 +{ + ULONGLONG PackageGUID; // 077 file + ULONGLONG Unknown1; + DWORD Unknown2; + DWORD Unknown3; + ULONGLONG Unknown4; +} APM_PACKAGE_ENTRY_V2, *PAPM_PACKAGE_ENTRY_V2; //----------------------------------------------------------------------------- -// Handler classes +// Local functions (non-class) -/* -struct TCmfFile +static bool IsManifestFolderName(const char * szFileName, const char * szManifestFolder, size_t nLength) { - TCmfFile() + if(!_strnicmp(szFileName, szManifestFolder, nLength)) { - memset(this, 0, sizeof(TCmfFile)); + return (szFileName[nLength] == '\\' || szFileName[nLength] == '/'); } + return false; +} - LPBYTE CaptureHeader(LPBYTE pbCmfData, LPBYTE pbCmfEnd) - { - DWORD BuildNumber = *(PDWORD)pbCmfData; +//----------------------------------------------------------------------------- +// Public functions (non-class) - // Check the newest header version - if(BuildNumber >= 45104 && BuildNumber != 45214) - { - PCMF_HEADER_V3 pHeader3 = (PCMF_HEADER_V3)pbCmfData; - - if((LPBYTE)(pHeader3 + 1) > pbCmfEnd) - return NULL; - - BuildVersion = pHeader3->BuildVersion; - DataCount = pHeader3->DataCount; - EntryCount = pHeader3->EntryCount; - Magic = pHeader3->Magic; - return (LPBYTE)(pHeader3 + 1); - } +static void BinaryReverse64(LPBYTE GuidReversed, LPBYTE pbGuid) +{ + GuidReversed[0] = pbGuid[7]; + GuidReversed[1] = pbGuid[6]; + GuidReversed[2] = pbGuid[5]; + GuidReversed[3] = pbGuid[4]; + GuidReversed[4] = pbGuid[3]; + GuidReversed[5] = pbGuid[2]; + GuidReversed[6] = pbGuid[1]; + GuidReversed[7] = pbGuid[0]; +} - else if(BuildNumber >= 39028) - { - // TODO - assert(false); - return NULL; - } +static const char * ExtractAssetSubString(char * szBuffer, size_t ccBuffer, const char * szPlainName) +{ + char * szBufferEnd = szBuffer + ccBuffer - 1; - else - { - // TODO - assert(false); - return NULL; - } - } + while(szBuffer < szBufferEnd && szPlainName[0] != 0 && szPlainName[0] != '.' && szPlainName[0] != '_') + *szBuffer++ = *szPlainName++; - DWORD BuildVersion; - DWORD DataCount; - DWORD EntryCount; - DWORD Magic; -}; + if(szBuffer <= szBufferEnd) + szBuffer[0] = 0; + return szPlainName; +} -struct TApmFile +static const char * AppendAssetSubString(char * szBuffer, size_t ccBuffer, const char * szPlainName) { - TApmFile() - { - memset(this, 0, sizeof(TApmFile)); - } + char * szBufferPtr = szBuffer + strlen(szBuffer); + char * szBufferEnd = szBuffer + ccBuffer - 1; - ~TApmFile() - { - CASC_FREE(pApmPackages); - CASC_FREE(pApmEntries); - } + if(szBufferPtr < szBufferEnd) + *szBufferPtr++ = '-'; - LPBYTE CaptureHeader(LPBYTE pbApmData, LPBYTE pbApmEnd) + while(szBufferPtr < szBufferEnd && szPlainName[0] != '_') + *szBufferPtr++ = *szPlainName++; + + szBufferPtr[0] = 0; + return szPlainName; +} + +size_t BuildAssetFileNameTemplate( + char * szNameTemplate, + size_t ccNameTemplate, + const char * szPrefix, + const char * szAssetName) +{ + const char * szFileName = "0000000000000000"; // Base name for 64-bit GUID + const char * szFileExt = NULL; + char * szBufferEnd = szNameTemplate + ccNameTemplate; + char * szBufferPtr = szNameTemplate; + char * szPlainName; + char szPlatform[64] = {0}; + char szLocale[64] = {0}; + char szAsset[64] = {0}; + + // Parse the plain name + while(szAssetName[0] != '.') { - // Check the data size for the largest possible header size - if((pbApmData + sizeof(APM_HEADER_V3)) < pbApmEnd) + // Watch start of the new field + if(szAssetName[0] == '_') { - // Try the version 3 - PAPM_HEADER_V3 pApmFile3 = (PAPM_HEADER_V3)(pbApmData); - if(pApmFile3->ZeroValue1 == 0 && pApmFile3->ZeroValue2 == 0 && pApmFile3->PackageCount && pApmFile3->EntryCount && pApmFile3->Checksum) + // Extract platform from "_SP" + if(szAssetName[1] == 'S' && szAssetName[2] == 'P' && !_strnicmp(szAssetName, "_SPWin_", 7)) { - BuildNumber = pApmFile3->BuildNumber; - PackageCount = pApmFile3->PackageCount; - EntryCount = pApmFile3->EntryCount; - Checksum = pApmFile3->Checksum; - return pbApmData + 0x24; + CascStrCopy(szPlatform, _countof(szPlatform), "Windows"); + szAssetName += 6; + continue; } - // Try the version 2 - PAPM_HEADER_V2 pApmFile2 = (PAPM_HEADER_V2)(pbApmData); - if(pApmFile2->ZeroValue1 == 0 && pApmFile2->PackageCount && pApmFile2->EntryCount && pApmFile2->Checksum) + // Extract "RDEV" or "RCN" + if(szAssetName[1] == 'R') { - BuildNumber = pApmFile2->BuildNumber; - PackageCount = pApmFile2->PackageCount; - EntryCount = pApmFile2->EntryCount; - Checksum = pApmFile2->Checksum; - return pbApmData + 0x20; + szAssetName = AppendAssetSubString(szPlatform, _countof(szPlatform), szAssetName + 1); + continue; } - // Try the version 1 (build 24919) - PAPM_HEADER_V1 pApmHeader1 = (PAPM_HEADER_V1)(pbApmData); - if(pApmHeader1->BuildVersion != 0 && pApmHeader1->PackageCount && pApmHeader1->EntryCount && pApmHeader1->Checksum) + // Extract locale + if(szAssetName[1] == 'L') { - BuildNumber = pApmHeader1->BuildNumber; - PackageCount = pApmHeader1->PackageCount; - EntryCount = pApmHeader1->EntryCount; - Checksum = pApmHeader1->Checksum; - return pbApmData + 0x18; + szAssetName = ExtractAssetSubString(szLocale, _countof(szLocale), szAssetName + 2); + continue; } - } - - return NULL; - } - LPBYTE CaptureArrayOfEntries(LPBYTE pbArrayOfEntries, LPBYTE pbApmEnd) - { - // Allocate array of entries - pApmEntries = CASC_ALLOC<APM_ENTRY>(EntryCount); - if(pApmEntries != NULL) - { - // The newest format - if(BuildNumber > 45104 && BuildNumber != 45214) + // Ignore "_EExt" + if(szAssetName[1] == 'E' && szAssetName[2] == 'E') { - PAPM_ENTRY_V2 pEntry2 = (PAPM_ENTRY_V2)pbArrayOfEntries; - LPBYTE pbEntriesEnd = (LPBYTE)(pEntry2 + EntryCount); - - if(pbEntriesEnd <= pbApmEnd) - { - for(DWORD i = 0; i < EntryCount; i++) - { - pApmEntries[i].Index = pEntry2->Index; - pApmEntries[i].HashA = MAKE_OFFSET64(pEntry2->HashA_Hi, pEntry2->HashA_Lo); - pApmEntries[i].HashB = MAKE_OFFSET64(pEntry2->HashB_Hi, pEntry2->HashB_Lo); - } - - return pbEntriesEnd; - } + szAssetName += 5; + continue; } - else - { - PAPM_ENTRY_V1 pEntry1 = (PAPM_ENTRY_V1)pbArrayOfEntries; - LPBYTE pbEntriesEnd = (LPBYTE)(pEntry1 + EntryCount); - if(pbEntriesEnd <= pbApmEnd) - { - for(DWORD i = 0; i < EntryCount; i++) - { - pApmEntries[i].Index = pEntry1->Index; - pApmEntries[i].HashA = MAKE_OFFSET64(pEntry1->HashA_Hi, pEntry1->HashA_Lo); - pApmEntries[i].HashB = 0; - } + // Extract the asset name + szAssetName = ExtractAssetSubString(szAsset, _countof(szAsset), szAssetName + 1); - return pbEntriesEnd; - } - } + // Extract a possible extension + //if(!_stricmp(szAsset, "speech")) + // szFileExt = ".wav"; + //if(!_stricmp(szAsset, "text")) + // szFileExt = ".text"; + continue; } - - return NULL; + szAssetName++; } - LPBYTE CapturePackageEntries(LPBYTE pbArrayOfEntries, LPBYTE pbApmEnd) - { - // Allocate array of entries - pApmPackages = CASC_ALLOC_ZERO<APM_PACKAGE_ENTRY>(PackageCount); - if(pApmPackages != NULL) - { - // The newest format - if(BuildNumber > 45104 && BuildNumber != 45214) - { - PAPM_PACKAGE_ENTRY_V2 pEntry2 = (PAPM_PACKAGE_ENTRY_V2)pbArrayOfEntries; - LPBYTE pbEntriesEnd = (LPBYTE)(pEntry2 + PackageCount); - - if(pbEntriesEnd <= pbApmEnd) - { - for(DWORD i = 0; i < PackageCount; i++) - { - pApmPackages[i].PackageGUID = pEntry2[i].PackageGUID; - pApmPackages[i].Unknown1 = pEntry2[i].Unknown1; - pApmPackages[i].Unknown2 = pEntry2[i].Unknown2; - pApmPackages[i].Unknown3 = pEntry2[i].Unknown3; - pApmPackages[i].Unknown4 = pEntry2[i].Unknown4; - } + // Combine the path like "%PREFIX%\\%PLATFORM%-%DEV%\\%LOCALE%\\%ASSET%\\%PLAIN_NAME%.%EXTENSSION%" + if(szPrefix && szPrefix[0]) + szBufferPtr += CascStrPrintf(szBufferPtr, (szBufferEnd - szBufferPtr), "%s\\", szPrefix); + if(szPlatform[0]) + szBufferPtr += CascStrPrintf(szBufferPtr, (szBufferEnd - szBufferPtr), "%s\\", szPlatform); + if(szLocale[0]) + szBufferPtr += CascStrPrintf(szBufferPtr, (szBufferEnd - szBufferPtr), "%s\\", szLocale); + if(szAsset[0]) + szBufferPtr += CascStrPrintf(szBufferPtr, (szBufferEnd - szBufferPtr), "%s\\", szAsset); + szPlainName = szBufferPtr; + + // Append file name and extension + if(szFileName && szFileName[0]) + szBufferPtr += CascStrPrintf(szBufferPtr, (szBufferEnd - szBufferPtr), "%s", szFileName); + if(szFileExt && szFileExt[0]) + CascStrPrintf(szBufferPtr, (szBufferEnd - szBufferPtr), "%s", szFileExt); + + // Return the length of the path + return (szPlainName - szNameTemplate); +} - return pbEntriesEnd; - } - } - else - { - PAPM_PACKAGE_ENTRY_V1 pEntry1 = (PAPM_PACKAGE_ENTRY_V1)pbArrayOfEntries; - LPBYTE pbEntriesEnd = (LPBYTE)(pEntry1 + PackageCount); +DWORD InsertAssetFile( + TCascStorage * hs, + CASC_FILE_TREE & FileTree, + char * szFileName, + size_t nPlainName, // Offset of the plain name in the name template + LPBYTE pbCKey, + LPBYTE pbGuid) +{ + PCASC_CKEY_ENTRY pCKeyEntry; + DWORD dwErrCode = ERROR_SUCCESS; + BYTE GuidReversed[8]; - if(pbEntriesEnd <= pbApmEnd) - { - for(DWORD i = 0; i < PackageCount; i++) - { - // TODO!!! - pApmPackages[i].PackageGUID = pEntry1->PackageGUID; - } + // Try to find the CKey + if((pCKeyEntry = FindCKeyEntry_CKey(hs, pbCKey)) != NULL) + { + // Save the character at the end of the name (dot or EOS) + char chSaveChar = szFileName[nPlainName + 16]; - return pbEntriesEnd; - } - } - } + // Imprint the GUID as binary value + BinaryReverse64(GuidReversed, pbGuid); + StringFromBinary(GuidReversed, sizeof(GuidReversed), szFileName + nPlainName); + szFileName[nPlainName + 16] = chSaveChar; - return NULL; + // Insert the asset to the file tree + if(FileTree.InsertByName(pCKeyEntry, szFileName) == NULL) + dwErrCode = ERROR_NOT_ENOUGH_MEMORY; } - - PAPM_ENTRY pApmEntries; - PAPM_PACKAGE_ENTRY pApmPackages; - ULONGLONG BuildNumber; - DWORD PackageCount; - DWORD EntryCount; - DWORD Checksum; - size_t HeaderSize; - - // Followed by the array of APM_ENTRY (count is in "EntryCount") - // Followed by the array of APM_PACKAGE (count is in "PackageCount") - -}; -*/ + return dwErrCode; +} //----------------------------------------------------------------------------- // Handler definition for OVERWATCH root file - // // ------------------------------------- // Overwatch ROOT file (build 24919): @@ -397,97 +299,12 @@ struct TRootHandler_OW : public TFileTreeRoot // We have file names and return CKey as result of search dwFeatures |= (CASC_FEATURE_FILE_NAMES | CASC_FEATURE_ROOT_CKEY); } -/* - bool IsManifestFolderName(const char * szFileName, const char * szManifestFolder, size_t nLength) - { - if(!_strnicmp(szFileName, szManifestFolder, nLength)) - { - return (szFileName[nLength] == '\\' || szFileName[nLength] == '/'); - } - return false; - } - - bool IsApmFileName(const char * szFileName) - { - const char * szExtension; - - if(IsManifestFolderName(szFileName, "Manifest", 8) || IsManifestFolderName(szFileName, "TactManifest", 12)) - { - szExtension = GetFileExtension(szFileName); - if(!_stricmp(szExtension, ".apm")) - { - return true; - } - } - - return false; - } - DWORD LoadApmFile(TCascStorage * hs, CONTENT_KEY & CKey, const char * szFileName) - { - TApmFile ApmFile; - LPBYTE pbApmData; - DWORD cbApmData = 0; - DWORD dwErrCode = ERROR_BAD_FORMAT; - - pbApmData = LoadInternalFileToMemory(hs, CKey.Value, CASC_OPEN_BY_CKEY, &cbApmData); - if(pbApmData != NULL) - { - LPBYTE pbApmEnd = pbApmData + cbApmData; - LPBYTE pbApmPtr = pbApmData; - - pbApmPtr = ApmFile.CaptureHeader(pbApmPtr, pbApmEnd); - if(pbApmPtr == NULL) - return ERROR_BAD_FORMAT; - - // Read the array of entries - pbApmPtr = ApmFile.CaptureArrayOfEntries(pbApmPtr, pbApmEnd); - if(pbApmPtr == NULL) - return ERROR_BAD_FORMAT; - - // Read the array of package entries - pbApmPtr = ApmFile.CapturePackageEntries(pbApmPtr, pbApmEnd); - if(pbApmPtr == NULL) - return ERROR_BAD_FORMAT; - - CASC_FREE(pbApmData); - } - - return dwErrCode; - } - - static DWORD LoadCmfFile(TCascStorage * hs, CONTENT_KEY & CKey, const char * szFileName) - { - TCmfFile CmfFile; - LPBYTE pbCmfData; - DWORD cbCmfData = 0; - DWORD dwErrCode = ERROR_BAD_FORMAT; - - pbCmfData = LoadInternalFileToMemory(hs, CKey.Value, CASC_OPEN_BY_CKEY, &cbCmfData); - if(pbCmfData != NULL) - { - LPBYTE pbCmfEnd = pbCmfData + cbCmfData; - LPBYTE pbCmfPtr = pbCmfData; - - // Capture the CMF header - pbCmfPtr = CmfFile.CaptureHeader(pbCmfPtr, pbCmfEnd); - if(pbCmfPtr == NULL) - return ERROR_BAD_FORMAT; - -// if(CmfFile.Magic >= 0x636D6614) -// DecryptCmfFile( - - CASC_FREE(pbCmfData); - } - - return dwErrCode; - } -*/ - int Load(TCascStorage * hs, CASC_CSV & Csv, size_t nFileNameIndex, size_t nCKeyIndex) + DWORD Load(TCascStorage * hs, CASC_CSV & Csv, size_t nFileNameIndex, size_t nCKeyIndex) { PCASC_CKEY_ENTRY pCKeyEntry; -// size_t ApmFiles[0x80]; -// size_t nApmFiles = 0; + size_t nFileCount; + DWORD dwErrCode = ERROR_SUCCESS; BYTE CKey[MD5_HASH_SIZE]; CASCLIB_UNUSED(hs); @@ -509,49 +326,43 @@ struct TRootHandler_OW : public TFileTreeRoot { // Insert the file name and the CKey into the tree FileTree.InsertByName(pCKeyEntry, FileName.szValue); - - // If the file name is actually an asset, we need to parse that asset and load files in it -// if(IsApmFileName(szFileName)) -// { -// ApmFiles[nApmFiles++] = FileTree_IndexOf(&pRootHandler->FileTree, pFileNode1); -// } } } } } -/* - // Load all CMF+APM files - if(dwErrCode == ERROR_SUCCESS) + + // Get the total file count that we loaded so far + nFileCount = FileTree.GetCount(); + + // Parse Content Manifest Files (.cmf) + for(size_t i = 0; i < nFileCount && dwErrCode == ERROR_SUCCESS; i++) { - for(size_t i = 0; i < nApmFiles; i++) + PCASC_FILE_NODE pFileNode; + const char * szExtension; + char szFileName[MAX_PATH]; + + // Get the n-th file + pFileNode = (PCASC_FILE_NODE)FileTree.PathAt(szFileName, _countof(szFileName), i); + if(pFileNode != NULL) { - char szApmFile[MAX_PATH + 1]; - char szCmfFile[MAX_PATH + 1]; - - // Get the n-th item and its name - pFileNode1 = (PCASC_FILE_NODE)FileTree_PathAt(&pRootHandler->FileTree, szApmFile, MAX_PATH, ApmFiles[i]); - if(pFileNode1 == NULL) - break; - - if(strcmp(szApmFile, "TactManifest\\Win_SPWin_RDEV_LenUS_EExt.apm")) - continue; - - // Get the name of thew CMF file - CascStrCopy(szCmfFile, _countof(szCmfFile), szApmFile); - CascStrCopy((char *)GetFileExtension(szCmfFile), 5, ".cmf"); - pFileNode2 = (PCASC_FILE_NODE)FileTree_Find(&pRootHandler->FileTree, szCmfFile); - if(pFileNode2 == NULL) - break; - - // Create the map of CMF entries - dwErrCode = LoadCmfFile(hs, pFileNode2->CKey, szCmfFile); - if(dwErrCode != ERROR_SUCCESS) - break; + if(IsManifestFolderName(szFileName, "Manifest", 8) || IsManifestFolderName(szFileName, "TactManifest", 12)) + { + // Retrieve the file extension + szExtension = GetFileExtension(szFileName); + // Check for content manifest files + if(!_stricmp(szExtension, ".cmf")) + { + dwErrCode = LoadContentManifestFile(hs, FileTree, pFileNode->pCKeyEntry, szFileName); + } + else if(!_stricmp(szExtension, ".apm")) + { + dwErrCode = LoadApplicationPackageManifestFile(hs, FileTree, pFileNode->pCKeyEntry, szFileName); + } + } } } -*/ - return ERROR_SUCCESS; + return dwErrCode; } }; |