diff options
author | unknown <E:\Ladik\Mail> | 2015-05-01 07:06:29 +0200 |
---|---|---|
committer | unknown <E:\Ladik\Mail> | 2015-05-01 07:06:29 +0200 |
commit | 46930855f500c1b494e3b16bb7a3323c07d4d5fb (patch) | |
tree | 6220cc643761137a930841d8ec828db9f3db53cf /src/SFileGetFileInfo.cpp | |
parent | a205159d004871efbedd7cbfb686b8fe82bfb532 (diff) |
+ Removed back reference of FileTable -> HashTable, as it is logically incorrect
+ Optimized patching process so it consimes less memory
+ Added hash table and block table defragmenting for malformed War3 maps
Diffstat (limited to 'src/SFileGetFileInfo.cpp')
-rw-r--r-- | src/SFileGetFileInfo.cpp | 43 |
1 files changed, 17 insertions, 26 deletions
diff --git a/src/SFileGetFileInfo.cpp b/src/SFileGetFileInfo.cpp index f7faea0..40b2720 100644 --- a/src/SFileGetFileInfo.cpp +++ b/src/SFileGetFileInfo.cpp @@ -143,7 +143,6 @@ bool WINAPI SFileGetFileInfo( TFileEntry * pFileEntry = NULL; ULONGLONG Int64Value = 0; ULONGLONG ByteOffset = 0; - TMPQHash * pHash; TMPQFile * hf = NULL; void * pvSrcFileInfo = NULL; DWORD cbSrcFileInfo = 0; @@ -376,7 +375,7 @@ bool WINAPI SFileGetFileInfo( if(ha != NULL && ha->pHashTable != NULL) { pvSrcFileInfo = ha->pHashTable; - cbSrcFileInfo = ha->dwHashTableSize * sizeof(TMPQHash); + cbSrcFileInfo = ha->pHeader->dwHashTableSize * sizeof(TMPQHash); nInfoType = SFILE_INFO_TYPE_DIRECT_POINTER; } break; @@ -629,9 +628,9 @@ bool WINAPI SFileGetFileInfo( case SFileInfoHashEntry: hf = IsValidFileHandle(hMpqOrFile); - if(hf != NULL && hf->ha != NULL && hf->ha->pHashTable != NULL) + if(hf != NULL && hf->pHashEntry != NULL) { - pvSrcFileInfo = hf->ha->pHashTable + hf->pFileEntry->dwHashIndex; + pvSrcFileInfo = hf->pHashEntry; cbSrcFileInfo = sizeof(TMPQHash); nInfoType = SFILE_INFO_TYPE_DIRECT_POINTER; } @@ -639,9 +638,9 @@ bool WINAPI SFileGetFileInfo( case SFileInfoHashIndex: hf = IsValidFileHandle(hMpqOrFile); - if(hf != NULL && hf->pFileEntry != NULL) + if(hf != NULL && hf->pHashEntry != NULL) { - pvSrcFileInfo = &hf->pFileEntry->dwHashIndex; + pvSrcFileInfo = &hf->dwHashIndex; cbSrcFileInfo = sizeof(DWORD); nInfoType = SFILE_INFO_TYPE_DIRECT_POINTER; } @@ -649,10 +648,10 @@ bool WINAPI SFileGetFileInfo( case SFileInfoNameHash1: hf = IsValidFileHandle(hMpqOrFile); - if(hf != NULL && hf->ha != NULL && hf->ha->pHashTable != NULL) + if(hf != NULL && hf->pHashEntry != NULL) { - pHash = hf->ha->pHashTable + hf->pFileEntry->dwHashIndex; - pvSrcFileInfo = &pHash->dwName1; + dwInt32Value = hf->pHashEntry->dwName1; + pvSrcFileInfo = &dwInt32Value; cbSrcFileInfo = sizeof(DWORD); nInfoType = SFILE_INFO_TYPE_DIRECT_POINTER; } @@ -660,10 +659,10 @@ bool WINAPI SFileGetFileInfo( case SFileInfoNameHash2: hf = IsValidFileHandle(hMpqOrFile); - if(hf != NULL && hf->ha != NULL && hf->ha->pHashTable != NULL) + if(hf != NULL && hf->pHashEntry != NULL) { - pHash = hf->ha->pHashTable + hf->pFileEntry->dwHashIndex; - pvSrcFileInfo = &pHash->dwName2; + dwInt32Value = hf->pHashEntry->dwName2; + pvSrcFileInfo = &dwInt32Value; cbSrcFileInfo = sizeof(DWORD); nInfoType = SFILE_INFO_TYPE_DIRECT_POINTER; } @@ -681,9 +680,9 @@ bool WINAPI SFileGetFileInfo( case SFileInfoLocale: hf = IsValidFileHandle(hMpqOrFile); - if(hf != NULL && hf->pFileEntry != NULL) + if(hf != NULL && hf->pHashEntry != NULL) { - dwInt32Value = hf->pFileEntry->lcLocale; + dwInt32Value = hf->pHashEntry->lcLocale; pvSrcFileInfo = &dwInt32Value; cbSrcFileInfo = sizeof(DWORD); nInfoType = SFILE_INFO_TYPE_DIRECT_POINTER; @@ -950,10 +949,6 @@ bool WINAPI SFileGetFileName(HANDLE hFile, char * szFileName) TMPQFile * hf = (TMPQFile *)hFile; // MPQ File handle int nError = ERROR_INVALID_HANDLE; - // Pre-zero the output buffer - if(szFileName != NULL) - *szFileName = 0; - // Check valid parameters if(IsValidFileHandle(hFile)) { @@ -966,15 +961,11 @@ bool WINAPI SFileGetFileName(HANDLE hFile, char * szFileName) { // If the file name is not there yet, create a pseudo name if(pFileEntry->szFileName == NULL) - { nError = CreatePseudoFileName(hFile, pFileEntry, szFileName); - } - else - { - if(szFileName != NULL) - strcpy(szFileName, pFileEntry->szFileName); - nError = ERROR_SUCCESS; - } + + // Copy the file name to the output buffer, if any + if(pFileEntry->szFileName && szFileName) + strcpy(szFileName, pFileEntry->szFileName); } } |