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