+ 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
This commit is contained in:
unknown
2015-05-01 07:06:29 +02:00
parent a205159d00
commit 46930855f5
19 changed files with 1443 additions and 1610 deletions

View File

@@ -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);
}
}