Commit | Line | Data |
7214af3e |
1 | // License information for this code is in license.txt |
2 | |
3 | #include <windows.h> |
4 | #include "SFmpqapi.h" |
a36705ea |
5 | #include "SFmpqInternal.h" |
7214af3e |
6 | #include "SFUtil.h" |
7 | #include "MpqCrypt.h" |
8 | |
9 | BOOL WriteBlockTable(MPQARCHIVE *mpqOpenArc) |
10 | { |
11 | DWORD tsz; |
212e7d69 |
12 | BOOL bReturnVal = FALSE; |
7214af3e |
13 | |
14 | if (mpqOpenArc->MpqHeader.dwBlockTableSize == 0) return TRUE; |
15 | if (!mpqOpenArc->lpBlockTable) return FALSE; |
16 | |
17 | char *buffer = (char *)SFAlloc(sizeof(BLOCKTABLEENTRY) * mpqOpenArc->MpqHeader.dwBlockTableSize); |
18 | if (buffer) { |
19 | memcpy(buffer,mpqOpenArc->lpBlockTable,sizeof(BLOCKTABLEENTRY) * mpqOpenArc->MpqHeader.dwBlockTableSize); |
20 | EncryptData((LPBYTE)buffer,sizeof(BLOCKTABLEENTRY) * mpqOpenArc->MpqHeader.dwBlockTableSize,dwBlockTableKey); |
212e7d69 |
21 | SFSetFilePointer(mpqOpenArc->hFile, mpqOpenArc->qwMPQStart + MakeUInt64(mpqOpenArc->MpqHeader.dwBlockTableOffset, mpqOpenArc->MpqHeader_Ex.wBlockTableOffsetHigh), FILE_BEGIN); |
22 | bReturnVal = WriteFile(mpqOpenArc->hFile,buffer,sizeof(BLOCKTABLEENTRY) * mpqOpenArc->MpqHeader.dwBlockTableSize,&tsz,0); |
7214af3e |
23 | SFFree(buffer); |
24 | } |
25 | else { |
26 | EncryptData((LPBYTE)mpqOpenArc->lpBlockTable,sizeof(BLOCKTABLEENTRY) * mpqOpenArc->MpqHeader.dwBlockTableSize,dwBlockTableKey); |
212e7d69 |
27 | SFSetFilePointer(mpqOpenArc->hFile, mpqOpenArc->qwMPQStart + MakeUInt64(mpqOpenArc->MpqHeader.dwBlockTableOffset, mpqOpenArc->MpqHeader_Ex.wBlockTableOffsetHigh), FILE_BEGIN); |
28 | bReturnVal = WriteFile(mpqOpenArc->hFile,mpqOpenArc->lpBlockTable,sizeof(BLOCKTABLEENTRY) * mpqOpenArc->MpqHeader.dwBlockTableSize,&tsz,0); |
7214af3e |
29 | DecryptData((LPBYTE)mpqOpenArc->lpBlockTable,sizeof(BLOCKTABLEENTRY) * mpqOpenArc->MpqHeader.dwBlockTableSize,dwBlockTableKey); |
30 | } |
31 | |
212e7d69 |
32 | if (bReturnVal && mpqOpenArc->MpqHeader_Ex.qwExtendedBlockOffsetTable) { |
33 | SFSetFilePointer(mpqOpenArc->hFile, mpqOpenArc->qwMPQStart + mpqOpenArc->MpqHeader_Ex.qwExtendedBlockOffsetTable, FILE_BEGIN); |
34 | bReturnVal = WriteFile(mpqOpenArc->hFile, mpqOpenArc->lpFileOffsetsHigh, sizeof(UInt16) * mpqOpenArc->MpqHeader.dwBlockTableSize, &tsz, 0); |
35 | } |
36 | |
37 | return bReturnVal; |
7214af3e |
38 | } |