Current News
Archived News
Search News
Discussion Forum


Old Forum
Install Programs More Downloads...
Troubleshooting
Source Code
Format Specs.
Misc. Information
Non-SF Stuff
Links




index fecddf9..5ca8bed 100644 (file)
@@ -564,7 +564,7 @@ BOOL SFMPQAPI WINAPI SFileOpenFileAsArchive(MPQHANDLE hSourceMPQ, LPCSTR lpFileN
                }
                DWORD dwMpqStart;
                MPQARCHIVE *mpqOpenArc;
-               dwMpqStart = mpqOpenArc->dwMPQStart + mpqArcFile.lpBlockEntry->dwFileOffset;
+               dwMpqStart = mpqArcFile.lpParentArc->dwMPQStart + mpqArcFile.lpBlockEntry->dwFileOffset;
                flen = mpqArcFile.lpBlockEntry->dwFullSize;
                dwMpqStart = FindMpqHeaderAtLocation(hFile,dwMpqStart,flen);
                if (dwMpqStart==0xFFFFFFFF) {
@@ -1124,7 +1124,7 @@ DWORD SFMPQAPI WINAPI SFileGetFileInfo(MPQHANDLE hFile, DWORD dwInfoType)
        return (DWORD)-1;
 }
 
-DWORD SFMPQAPI WINAPI SFileSetFilePointer(MPQHANDLE hFile, long lDistanceToMove, PLONG lplDistanceToMoveHigh, DWORD dwMoveMethod)
+DWORD SFMPQAPI WINAPI SFileSetFilePointer(MPQHANDLE hFile, LONG lDistanceToMove, PLONG lplDistanceToMoveHigh, DWORD dwMoveMethod)
 {
        if (!hFile) {
                SetLastError(ERROR_INVALID_PARAMETER);
@@ -1136,21 +1136,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 (lDistanceToMove<cpos || cpos+lDistanceToMove>fsz) return (DWORD)-1;
+                       if (cpos + lDistanceToMove < 0 || cpos + lDistanceToMove > fsz) return (DWORD)-1;
                        mpqOpenFile->dwFilePointer += lDistanceToMove;
                        break;
 
                case FILE_END:
-                       if (lDistanceToMove<fsz || lDistanceToMove>0) 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;
@@ -1176,7 +1173,7 @@ BOOL SFMPQAPI WINAPI SFileReadFile(MPQHANDLE hFile,LPVOID lpBuffer,DWORD nNumber
        }
        if (lpOverlapped)
                if (lpOverlapped->Internal || lpOverlapped->InternalHigh || lpOverlapped->Offset || lpOverlapped->OffsetHigh || lpOverlapped->hEvent)
-                       SFileSetFilePointer(hFile,lpOverlapped->Offset,(long *)&lpOverlapped->OffsetHigh,FILE_BEGIN);
+                       SFileSetFilePointer(hFile,lpOverlapped->Offset,(LONG *)&lpOverlapped->OffsetHigh,FILE_BEGIN);
        if (nNumberOfBytesToRead==0) {
                if (lpNumberOfBytesRead) *lpNumberOfBytesRead = 0;
                if (lpOverlapped) lpOverlapped->InternalHigh = 0;
@@ -2187,6 +2184,7 @@ BOOL SFMPQAPI WINAPI MpqAddFileFromBufferEx(MPQHANDLE hMPQ, LPVOID lpBuffer, DWO
                        if (i==TotalBlocks-1 && (ucfsz % blockSize)!=0) blockSize=ucfsz % blockSize;
                        DWORD outLength=blockSize;
                        BYTE *compdata = compbuffer;
+                       char *oldoutbuffer = outbuffer;
                        if (dwFlags & MAFA_COMPRESS)
                        {
                                memcpy(compdata,(char *)buffer+CurPos,blockSize);
@@ -2233,6 +2231,7 @@ BOOL SFMPQAPI WINAPI MpqAddFileFromBufferEx(MPQHANDLE hMPQ, LPVOID lpBuffer, DWO
                                memcpy((char *)newbuffer+LastOffset,outbuffer,outLength);
                                LastOffset+=outLength;
                        }
+                       outbuffer = oldoutbuffer;
                        CurPos += blockSize;
                }
                fsz = LastOffset;
@@ -2576,7 +2575,7 @@ BOOL SFMPQAPI WINAPI MpqCompactArchive(MPQHANDLE hMPQ)
        DWORD i;
        if (hFile==INVALID_HANDLE_VALUE) {
                for (i=0;i<10000;i++) {
-                       sprintf(lpFileName,"%s.compact.%04ld",mpqOpenArc->lpFileName,i);
+                       sprintf(lpFileName,"%s.compact.%04d",mpqOpenArc->lpFileName,i);
 
                        hFile = CreateFile(lpFileName,GENERIC_READ|GENERIC_WRITE,0,0,CREATE_NEW,0,0);
                        if (hFile!=INVALID_HANDLE_VALUE) break;
@@ -3116,16 +3115,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)
                {
@@ -3138,6 +3140,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;
 }
@@ -3404,7 +3408,7 @@ DWORD DetectFileSeedEx(MPQARCHIVE * mpqOpenArc, HASHTABLEENTRY * lpHashEntry, LP
                else {
                        HANDLE hlFile,hMPQ=(HANDLE)mpqOpenArc;
                        DWORD fsz;
-                       char *listbuffer;
+                       char *listbuffer = 0;
                        LCID lcOldLocale = LocaleID;
                        for (DWORD lcn=0;lcn<nLocales;lcn++) {
                                LocaleID = availLocales[lcn];
@@ -3427,7 +3431,7 @@ DWORD DetectFileSeedEx(MPQARCHIVE * mpqOpenArc, HASHTABLEENTRY * lpHashEntry, LP
                                        }
                                        SFileCloseFile(hlFile);
                                        if (listbuffer!=0) {
-                                               char *listline;
+                                               char *listline = 0;
                                                for (listline=listbuffer;listline!=0;listline=nextline(listline)) {
                                                        if (listline[0]==0) break;
                                                        DWORD lnlen=strlnlen(listline);