From: ShadowFlare Date: Wed, 16 Jan 2013 08:45:40 +0000 (-0700) Subject: Merge branch 'master' into large_archive X-Git-Url: https://sfsrealm.hopto.org/projects/gitweb.cgi?a=commitdiff_plain;h=refs%2Fheads%2Flarge_archive;hp=655bd6bcdb58f9d05b03babeaf5d155570f27c92;p=SFmpqapi.git Merge branch 'master' into large_archive --- diff --git a/SFUtil.cpp b/SFUtil.cpp index 4a97b31..e9fffcd 100644 --- a/SFUtil.cpp +++ b/SFUtil.cpp @@ -60,7 +60,11 @@ UInt64 SFSetFilePointer(HANDLE hFile, Int64 nDistance, UInt32 dwMoveMethod) FilePos.ui32[0] = ::SetFilePointer(hFile, FilePos.i32[0], &FilePos.i32[1], dwMoveMethod); +#ifdef INVALID_SET_FILE_POINTER if (FilePos.ui32[0] == INVALID_SET_FILE_POINTER) { +#else + if (FilePos.ui32[0] == INVALID_FILE_SIZE) { +#endif if (::GetLastError() != NO_ERROR) return (UInt64)-1; } diff --git a/SFmpqapi.cpp b/SFmpqapi.cpp index 7b22014..694d730 100644 --- a/SFmpqapi.cpp +++ b/SFmpqapi.cpp @@ -1114,21 +1114,18 @@ DWORD SFMPQAPI WINAPI SFileSetFilePointer(MPQHANDLE hFile, LONG lDistanceToMove, long fsz = mpqOpenFile->lpBlockEntry->dwFullSize; long cpos = mpqOpenFile->dwFilePointer; switch (dwMoveMethod) { - case FILE_BEGIN: - if (lDistanceToMove<0 || lDistanceToMove>fsz) return (DWORD)-1; - mpqOpenFile->dwFilePointer = lDistanceToMove; - break; case FILE_CURRENT: - if (lDistanceToMovefsz) return (DWORD)-1; + if (cpos + lDistanceToMove < 0 || cpos + lDistanceToMove > fsz) return (DWORD)-1; mpqOpenFile->dwFilePointer += lDistanceToMove; break; case FILE_END: - if (lDistanceToMove0) return (DWORD)-1; - mpqOpenFile->dwFilePointer = fsz+lDistanceToMove; + if (fsz + lDistanceToMove < 0 || lDistanceToMove > 0) return (DWORD)-1; + mpqOpenFile->dwFilePointer = fsz + lDistanceToMove; break; + case FILE_BEGIN: default: - if (lDistanceToMove<0 || lDistanceToMove>fsz) return (DWORD)-1; + if (lDistanceToMove < 0 || lDistanceToMove > fsz) return (DWORD)-1; mpqOpenFile->dwFilePointer = lDistanceToMove; } if (lplDistanceToMoveHigh!=0) *lplDistanceToMoveHigh = 0; @@ -3135,16 +3132,19 @@ MPQHANDLE GetFreeHashTableEntry(MPQHANDLE hMPQ, LPCSTR lpFileName, LCID FileLoca DWORD i=dwTablePos, nFirstFree = 0xFFFFFFFF; do { - if ((mpqOpenArc->lpHashTable[i].dwBlockTableIndex&0xFFFFFFFE)==0xFFFFFFFE && (nFirstFree == 0xFFFFFFFF || mpqOpenArc->lpHashTable[i].dwBlockTableIndex == 0xFFFFFFFF)) + if ((mpqOpenArc->lpHashTable[i].dwBlockTableIndex&0xFFFFFFFE)==0xFFFFFFFE) { - if (mpqOpenArc->lpHashTable[i].dwBlockTableIndex == 0xFFFFFFFF) + if (nFirstFree == 0xFFFFFFFF || mpqOpenArc->lpHashTable[i].dwBlockTableIndex == 0xFFFFFFFF) { - if (nFirstFree == 0xFFFFFFFF) - return (MPQHANDLE)&mpqOpenArc->lpHashTable[i]; - else - return (MPQHANDLE)&mpqOpenArc->lpHashTable[nFirstFree]; + if (mpqOpenArc->lpHashTable[i].dwBlockTableIndex == 0xFFFFFFFF) + { + if (nFirstFree == 0xFFFFFFFF) + return (MPQHANDLE)&mpqOpenArc->lpHashTable[i]; + else + return (MPQHANDLE)&mpqOpenArc->lpHashTable[nFirstFree]; + } + else nFirstFree = i; } - else nFirstFree = i; } else if (mpqOpenArc->lpHashTable[i].dwNameHashA==dwNameHashA && mpqOpenArc->lpHashTable[i].dwNameHashB==dwNameHashB && mpqOpenArc->lpHashTable[i].lcLocale==FileLocale) { @@ -3157,6 +3157,8 @@ MPQHANDLE GetFreeHashTableEntry(MPQHANDLE hMPQ, LPCSTR lpFileName, LCID FileLoca } i = (i + 1) % mpqOpenArc->MpqHeader.dwHashTableSize; } while (i!=dwTablePos); + if (nFirstFree != 0xFFFFFFFF) + return (MPQHANDLE)&mpqOpenArc->lpHashTable[nFirstFree]; SetLastError(MPQ_ERROR_HASH_TABLE_FULL); return 0; }