Browse Source

Clean up mpqapi_write_file_contents.

pull/133/head
Sergey Semushin 7 years ago committed by Anders Jenbo
parent
commit
f3f29cf0a9
  1. 159
      Source/mpqapi.cpp

159
Source/mpqapi.cpp

@ -285,98 +285,87 @@ _BLOCKENTRY *mpqapi_add_file(const char *pszName, _BLOCKENTRY *pBlk, int block_i
BOOL mpqapi_write_file_contents(const char *pszName, const BYTE *pbData, DWORD dwLen, _BLOCKENTRY *pBlk) BOOL mpqapi_write_file_contents(const char *pszName, const BYTE *pbData, DWORD dwLen, _BLOCKENTRY *pBlk)
{ {
const char *v4; // esi DWORD *sectoroffsettable;
const char *v5; // eax DWORD destsize, num_bytes, block_size, nNumberOfBytesToWrite;
unsigned int destsize; // ebx const BYTE *src;
const char *v7; // eax const char *tmp, *str_ptr;
unsigned int v8; // esi int i, j;
_BLOCKENTRY *v9; // edi
int v10; // eax str_ptr = pszName;
signed int v11; // eax src = pbData;
unsigned int v13; // eax while ((tmp = strchr(str_ptr, ':'))) {
unsigned int v14; // eax str_ptr = tmp + 1;
int v15; // ecx }
int size; // [esp+Ch] [ebp-10h] while ((tmp = strchr(str_ptr, '\\'))) {
const BYTE *v17; // [esp+10h] [ebp-Ch] str_ptr = tmp + 1;
int v18; // [esp+14h] [ebp-8h] }
DWORD nNumberOfBytesToWrite; // [esp+18h] [ebp-4h] Hash(str_ptr, 3);
num_bytes = (dwLen + 4095) >> 12;
v4 = pszName; nNumberOfBytesToWrite = 4 * num_bytes + 4;
v17 = pbData; pBlk->offset = mpqapi_find_free_block(dwLen + nNumberOfBytesToWrite, &pBlk->sizealloc);
v5 = strchr(pszName, ':'); pBlk->sizefile = dwLen;
pBlk->flags = 0x80000100;
if (SetFilePointer(sghArchive, pBlk->offset, NULL, FILE_BEGIN) == (DWORD)-1)
return FALSE;
j = 0;
destsize = 0; destsize = 0;
while (v5) { sectoroffsettable = NULL;
v4 = v5 + 1; while (dwLen != 0) {
v5 = strchr(v5 + 1, ':'); for (i = 0; i < 4096; i++)
} mpq_buf[i] -= 86;
while (1) { DWORD len = dwLen;
v7 = strchr(v4, '\\'); if (dwLen >= 4096)
if (!v7) len = 4096;
break; memcpy(mpq_buf, src, len);
v4 = v7 + 1; src += len;
} len = PkwareCompress(mpq_buf, len);
Hash(v4, 3); if (j == 0) {
v8 = dwLen; nNumberOfBytesToWrite = 4 * num_bytes + 4;
v9 = pBlk; sectoroffsettable = (DWORD *)DiabloAllocPtr(nNumberOfBytesToWrite);
size = 4 * ((unsigned int)(dwLen + 4095) >> 12) + 4; memset(sectoroffsettable, 0, nNumberOfBytesToWrite);
nNumberOfBytesToWrite = 4 * ((unsigned int)(dwLen + 4095) >> 12) + 4; if (!WriteFile(sghArchive, sectoroffsettable, nNumberOfBytesToWrite, &nNumberOfBytesToWrite, 0)) {
v10 = mpqapi_find_free_block(size + dwLen, &pBlk->sizealloc); goto on_error;
v9->offset = v10; }
v9->sizefile = v8;
v9->flags = 0x80000100;
if (SetFilePointer(sghArchive, v10, NULL, FILE_BEGIN) == -1)
return 0;
pBlk = 0;
v18 = 0;
while (v8) {
v11 = 0;
do
mpq_buf[v11++] -= 86;
while (v11 < 4096);
dwLen = v8;
if (v8 >= 0x1000)
dwLen = 4096;
memcpy(mpq_buf, v17, dwLen);
v17 += dwLen;
dwLen = PkwareCompress(mpq_buf, dwLen);
if (!v18) {
nNumberOfBytesToWrite = size;
pBlk = (_BLOCKENTRY *)DiabloAllocPtr(size);
memset(pBlk, 0, nNumberOfBytesToWrite);
if (!WriteFile(sghArchive, pBlk, nNumberOfBytesToWrite, &nNumberOfBytesToWrite, 0))
goto LABEL_25;
destsize += nNumberOfBytesToWrite; destsize += nNumberOfBytesToWrite;
} }
*(&pBlk->offset + v18) = destsize; sectoroffsettable[j] = destsize;
if (!WriteFile(sghArchive, mpq_buf, dwLen, (LPDWORD)&dwLen, 0)) if (!WriteFile(sghArchive, mpq_buf, len, &len, NULL)) {
goto LABEL_25; goto on_error;
++v18; }
if (v8 <= 0x1000) j++;
v8 = 0; if (dwLen > 4096)
dwLen -= 4096;
else else
v8 -= 4096; dwLen = 0;
destsize += dwLen; destsize += len;
}
*(&pBlk->offset + v18) = destsize;
if (SetFilePointer(sghArchive, -destsize, NULL, FILE_CURRENT) == -1
|| !WriteFile(sghArchive, pBlk, nNumberOfBytesToWrite, &nNumberOfBytesToWrite, 0)
|| SetFilePointer(sghArchive, destsize - nNumberOfBytesToWrite, NULL, FILE_CURRENT) == -1) {
LABEL_25:
if (pBlk)
mem_free_dbg(pBlk);
return 0;
} }
mem_free_dbg(pBlk);
v13 = v9->sizealloc; sectoroffsettable[j] = destsize;
if (destsize < v13) { if (SetFilePointer(sghArchive, -destsize, NULL, FILE_CURRENT) == (DWORD)-1) {
v14 = v13 - destsize; goto on_error;
if (v14 >= 0x400) { }
v15 = destsize + v9->offset;
v9->sizealloc = destsize; if (!WriteFile(sghArchive, sectoroffsettable, nNumberOfBytesToWrite, &nNumberOfBytesToWrite, 0)) {
mpqapi_alloc_block(v15, v14); goto on_error;
}
if (SetFilePointer(sghArchive, destsize - nNumberOfBytesToWrite, NULL, FILE_CURRENT) == (DWORD)-1) {
goto on_error;
}
mem_free_dbg(sectoroffsettable);
if (destsize < pBlk->sizealloc) {
block_size = pBlk->sizealloc - destsize;
if (block_size >= 1024) {
pBlk->sizealloc = destsize;
mpqapi_alloc_block(pBlk->sizealloc + pBlk->offset, block_size);
} }
} }
return 1; return TRUE;
on_error:
if (sectoroffsettable)
mem_free_dbg(sectoroffsettable);
return FALSE;
} }
int mpqapi_find_free_block(int size, int *block_size) int mpqapi_find_free_block(int size, int *block_size)

Loading…
Cancel
Save