X-Git-Url: https://sfsrealm.hopto.org/projects/gitweb.cgi?p=SFmpqapi.git;a=blobdiff_plain;f=MpqBlockTable.cpp;fp=MpqBlockTable.cpp;h=650acc123f9406e4012d1ee6c60a8627cb952818;hp=0000000000000000000000000000000000000000;hb=7214af3eb69acdaef221c1846157ed07438bd0c1;hpb=1c63ef2a5d9f881e1006c4c674a81cebd9596c5e diff --git a/MpqBlockTable.cpp b/MpqBlockTable.cpp new file mode 100644 index 0000000..650acc1 --- /dev/null +++ b/MpqBlockTable.cpp @@ -0,0 +1,31 @@ +// License information for this code is in license.txt + +#include +#include "SFmpqapi.h" +#include "SFUtil.h" +#include "MpqCrypt.h" + +BOOL WriteBlockTable(MPQARCHIVE *mpqOpenArc) +{ + DWORD tsz; + + if (mpqOpenArc->MpqHeader.dwBlockTableSize == 0) return TRUE; + if (!mpqOpenArc->lpBlockTable) return FALSE; + + char *buffer = (char *)SFAlloc(sizeof(BLOCKTABLEENTRY) * mpqOpenArc->MpqHeader.dwBlockTableSize); + if (buffer) { + memcpy(buffer,mpqOpenArc->lpBlockTable,sizeof(BLOCKTABLEENTRY) * mpqOpenArc->MpqHeader.dwBlockTableSize); + EncryptData((LPBYTE)buffer,sizeof(BLOCKTABLEENTRY) * mpqOpenArc->MpqHeader.dwBlockTableSize,dwBlockTableKey); + SFSetFilePointer(mpqOpenArc->hFile,mpqOpenArc->dwMPQStart+mpqOpenArc->MpqHeader.dwBlockTableOffset,FILE_BEGIN); + WriteFile(mpqOpenArc->hFile,buffer,sizeof(BLOCKTABLEENTRY) * mpqOpenArc->MpqHeader.dwBlockTableSize,&tsz,0); + SFFree(buffer); + } + else { + EncryptData((LPBYTE)mpqOpenArc->lpBlockTable,sizeof(BLOCKTABLEENTRY) * mpqOpenArc->MpqHeader.dwBlockTableSize,dwBlockTableKey); + SFSetFilePointer(mpqOpenArc->hFile,mpqOpenArc->dwMPQStart+mpqOpenArc->MpqHeader.dwBlockTableOffset,FILE_BEGIN); + WriteFile(mpqOpenArc->hFile,mpqOpenArc->lpBlockTable,sizeof(BLOCKTABLEENTRY) * mpqOpenArc->MpqHeader.dwBlockTableSize,&tsz,0); + DecryptData((LPBYTE)mpqOpenArc->lpBlockTable,sizeof(BLOCKTABLEENTRY) * mpqOpenArc->MpqHeader.dwBlockTableSize,dwBlockTableKey); + } + + return TRUE; +}