X-Git-Url: https://sfsrealm.hopto.org/projects/?a=blobdiff_plain;f=SFmpqapi.cpp;h=56cca21b1c4fe1d1567d60ab35b50e8eb5f1edf0;hb=bafaf795956845afe0b87e8cc9b6b56c81ab0f2e;hp=fecddf9059723e4d90794d59133545c45ff1a1ed;hpb=51985fb5c4cd62015f10ead28558815266fd2460;p=SFmpqapi.git diff --git a/SFmpqapi.cpp b/SFmpqapi.cpp index fecddf9..56cca21 100644 --- a/SFmpqapi.cpp +++ b/SFmpqapi.cpp @@ -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 (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; @@ -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; @@ -3404,7 +3403,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