mirror of
https://github.com/ladislav-zezula/StormLib.git
synced 2026-01-20 14:47:22 +01:00
+ 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:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user