diff options
| author | Shauren <shauren.trinity@gmail.com> | 2012-02-20 19:12:05 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2012-02-20 19:12:05 +0100 |
| commit | b1e4a1b14f43aa72c750dfb0b3b652d70863c892 (patch) | |
| tree | f42c64d18953a166420e0078d4a8a5ef9790b69a /dep/StormLib/test | |
| parent | 39f96656ab1a559e7fe2f9116fdb2126352d4a2e (diff) | |
Core/Tools: Replaced libmpq with StormLib and made map extractor use it, you can now extract 4.2.2 dbcs with it (still not maps)
TODO: Update ADT structure
Diffstat (limited to 'dep/StormLib/test')
| -rw-r--r-- | dep/StormLib/test/Test.cpp | 1804 | ||||
| -rw-r--r-- | dep/StormLib/test/x86_ripped_code.asm | 1231 | ||||
| -rw-r--r-- | dep/StormLib/test/x86_starcraft_lzma.asm | 11066 |
3 files changed, 14101 insertions, 0 deletions
diff --git a/dep/StormLib/test/Test.cpp b/dep/StormLib/test/Test.cpp new file mode 100644 index 00000000000..c061b34936f --- /dev/null +++ b/dep/StormLib/test/Test.cpp @@ -0,0 +1,1804 @@ +/*****************************************************************************/ +/* StormLibTest.cpp Copyright (c) Ladislav Zezula 2003 */ +/*---------------------------------------------------------------------------*/ +/* Test module for StormLib */ +/*---------------------------------------------------------------------------*/ +/* Date Ver Who Comment */ +/* -------- ---- --- ------- */ +/* 25.03.03 1.00 Lad The first version of StormLibTest.cpp */ +/*****************************************************************************/ + +#define _CRT_SECURE_NO_DEPRECATE +#define __INCLUDE_CRYPTOGRAPHY__ +#define __STORMLIB_SELF__ // Don't use StormLib.lib +#include <stdio.h> + +#ifdef _MSC_VER +#include <crtdbg.h> +#endif + +#include "../src/StormLib.h" +#include "../src/StormCommon.h" + +#ifdef _MSC_VER +#pragma warning(disable: 4505) // 'XXX' : unreferenced local function has been removed +#endif + +//------------------------------------------------------------------------------ +// Defines + +#ifdef PLATFORM_WINDOWS +#define WORK_PATH_ROOT "E:\\Multimedia\\MPQs\\" +#endif + +#ifdef PLATFORM_LINUX +#define WORK_PATH_ROOT "/home/user/MPQs/" +#endif + +#ifdef PLATFORM_MAC +#define WORK_PATH_ROOT "/Users/sam/Downloads/" +#endif + +#ifndef LANG_CZECH +#define LANG_CZECH 0x0405 +#endif + +#define MPQ_SECTOR_SIZE 0x1000 + +#define MAKE_PATH(path) _T(WORK_PATH_ROOT) _T(path) + +// Unicode MPQ names +/* Czech */ static const wchar_t szUnicodeName1[] = {0x010C, 0x0065, 0x0073, 0x006B, 0x00FD, _T('.'), _T('m'), _T('p'), _T('q'), 0}; +/* Russian */ static const wchar_t szUnicodeName2[] = {0x0420, 0x0443, 0x0441, 0x0441, 0x043A, 0x0438, 0x0439, _T('.'), _T('m'), _T('p'), _T('q'), 0}; +/* Greece */ static const wchar_t szUnicodeName3[] = {0x03B5, 0x03BB, 0x03BB, 0x03B7, 0x03BD, 0x03B9, 0x03BA, 0x03AC, _T('.'), _T('m'), _T('p'), _T('q'), 0}; +/* Chinese */ static const wchar_t szUnicodeName4[] = {0x65E5, 0x672C, 0x8A9E, _T('.'), _T('m'), _T('p'), _T('q'), 0}; +/* Japanese */ static const wchar_t szUnicodeName5[] = {0x7B80, 0x4F53, 0x4E2D, 0x6587, _T('.'), _T('m'), _T('p'), _T('q'), 0}; +/* Arabic */ static const wchar_t szUnicodeName6[] = {0x0627, 0x0644, 0x0639, 0x0639, 0x0631, 0x0628, 0x064A, 0x0629, _T('.'), _T('m'), _T('p'), _T('q'), 0}; + +//----------------------------------------------------------------------------- +// Constants + +static const TCHAR * szWorkDir = MAKE_PATH("Work"); + +static unsigned int AddFlags[] = +{ +// Compression Encryption Fixed key Single Unit Sector CRC + 0 | 0 | 0 | 0 | 0, + 0 | MPQ_FILE_ENCRYPTED | 0 | 0 | 0, + 0 | MPQ_FILE_ENCRYPTED | MPQ_FILE_FIX_KEY | 0 | 0, + 0 | 0 | 0 | MPQ_FILE_SINGLE_UNIT | 0, + 0 | MPQ_FILE_ENCRYPTED | 0 | MPQ_FILE_SINGLE_UNIT | 0, + 0 | MPQ_FILE_ENCRYPTED | MPQ_FILE_FIX_KEY | MPQ_FILE_SINGLE_UNIT | 0, + MPQ_FILE_IMPLODE | 0 | 0 | 0 | 0, + MPQ_FILE_IMPLODE | MPQ_FILE_ENCRYPTED | 0 | 0 | 0, + MPQ_FILE_IMPLODE | MPQ_FILE_ENCRYPTED | MPQ_FILE_FIX_KEY | 0 | 0, + MPQ_FILE_IMPLODE | 0 | 0 | MPQ_FILE_SINGLE_UNIT | 0, + MPQ_FILE_IMPLODE | MPQ_FILE_ENCRYPTED | 0 | MPQ_FILE_SINGLE_UNIT | 0, + MPQ_FILE_IMPLODE | MPQ_FILE_ENCRYPTED | MPQ_FILE_FIX_KEY | MPQ_FILE_SINGLE_UNIT | 0, + MPQ_FILE_IMPLODE | 0 | 0 | 0 | MPQ_FILE_SECTOR_CRC, + MPQ_FILE_IMPLODE | MPQ_FILE_ENCRYPTED | 0 | 0 | MPQ_FILE_SECTOR_CRC, + MPQ_FILE_IMPLODE | MPQ_FILE_ENCRYPTED | MPQ_FILE_FIX_KEY | 0 | MPQ_FILE_SECTOR_CRC, + MPQ_FILE_COMPRESS | 0 | 0 | 0 | 0, + MPQ_FILE_COMPRESS | MPQ_FILE_ENCRYPTED | 0 | 0 | 0, + MPQ_FILE_COMPRESS | MPQ_FILE_ENCRYPTED | MPQ_FILE_FIX_KEY | 0 | 0, + MPQ_FILE_COMPRESS | 0 | 0 | MPQ_FILE_SINGLE_UNIT | 0, + MPQ_FILE_COMPRESS | MPQ_FILE_ENCRYPTED | 0 | MPQ_FILE_SINGLE_UNIT | 0, + MPQ_FILE_COMPRESS | MPQ_FILE_ENCRYPTED | MPQ_FILE_FIX_KEY | MPQ_FILE_SINGLE_UNIT | 0, + MPQ_FILE_COMPRESS | 0 | 0 | 0 | MPQ_FILE_SECTOR_CRC, + MPQ_FILE_COMPRESS | MPQ_FILE_ENCRYPTED | 0 | 0 | MPQ_FILE_SECTOR_CRC, + MPQ_FILE_COMPRESS | MPQ_FILE_ENCRYPTED | MPQ_FILE_FIX_KEY | 0 | MPQ_FILE_SECTOR_CRC, + 0xFFFFFFFF +}; + +//----------------------------------------------------------------------------- +// Local testing functions + +static void clreol() +{ +#ifdef PLATFORM_WINDOWS + CONSOLE_SCREEN_BUFFER_INFO ScreenInfo; + HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE); + LPTSTR szConsoleLine; + int nConsoleChars; + int i = 0; + + GetConsoleScreenBufferInfo(hConsole, &ScreenInfo); + nConsoleChars = (ScreenInfo.srWindow.Right - ScreenInfo.srWindow.Left); + if(nConsoleChars > 0) + { + szConsoleLine = new TCHAR[nConsoleChars + 3]; + if(szConsoleLine != NULL) + { + szConsoleLine[i++] = '\r'; + for(; i < nConsoleChars; i++) + szConsoleLine[i] = ' '; + szConsoleLine[i++] = '\r'; + szConsoleLine[i] = 0; + + _tprintf(szConsoleLine); + delete [] szConsoleLine; + } + } +#endif // PLATFORM_WINDOWS +} + +static void PrintfTA(const TCHAR * szFormat, const TCHAR * szStrT, const char * szStrA, int lcLocale = 0) +{ + TCHAR * szTemp; + TCHAR szBuffer[MAX_PATH]; + + // Convert ANSI string to TCHAR + for(szTemp = szBuffer; *szStrA != 0; szTemp++, szStrA++) + szTemp[0] = szStrA[0]; + szTemp[0] = 0; + + _tprintf(szFormat, szStrT, szBuffer, lcLocale); +} + +static void MergeLocalPath(TCHAR * szBuffer, const TCHAR * szPart1, const char * szPart2) +{ + // Copy directory name + while(*szPart1 != 0) + *szBuffer++ = *szPart1++; + + // Add separator + *szBuffer++ = _T('/'); + + // Copy file name + while(*szPart2 != 0) + *szBuffer++ = *szPart2++; + + // Terminate the string + *szBuffer = 0; +} + +int GetFirstDiffer(void * ptr1, void * ptr2, int nSize) +{ + char * buff1 = (char *)ptr1; + char * buff2 = (char *)ptr2; + int nDiffer; + + for(nDiffer = 0; nDiffer < nSize; nDiffer++) + { + if(*buff1++ != *buff2++) + return nDiffer; + } + return -1; +} + +static void WINAPI CompactCB(void * /* lpParam */, DWORD dwWork, ULONGLONG BytesDone, ULONGLONG TotalBytes) +{ + clreol(); + + _tprintf(_T("%u of %u "), (DWORD)BytesDone, (DWORD)TotalBytes); + switch(dwWork) + { + case CCB_CHECKING_FILES: + _tprintf(_T("Checking files in archive ...\r")); + break; + + case CCB_CHECKING_HASH_TABLE: + _tprintf(_T("Checking hash table ...\r")); + break; + + case CCB_COPYING_NON_MPQ_DATA: + _tprintf(_T("Copying non-MPQ data ...\r")); + break; + + case CCB_COMPACTING_FILES: + _tprintf(_T("Compacting archive ...\r")); + break; + + case CCB_CLOSING_ARCHIVE: + _tprintf(_T("Closing archive ...\r")); + break; + } +} + +static void GenerateRandomDataBlock(LPBYTE pbBuffer, DWORD cbBuffer) +{ + LPBYTE pbBufferEnd = pbBuffer + cbBuffer; + LPBYTE pbPtr = pbBuffer; + DWORD cbBytesToPut = 0; + BYTE ByteToPut = 0; + bool bRandomData = false; + + while(pbPtr < pbBufferEnd) + { + // If there are no bytes to put, we will generate new byte and length + if(cbBytesToPut == 0) + { + bRandomData = false; + switch(rand() % 10) + { + case 0: // A short sequence of zeros + cbBytesToPut = rand() % 0x08; + ByteToPut = 0; + break; + + case 1: // A long sequence of zeros + cbBytesToPut = rand() % 0x80; + ByteToPut = 0; + break; + + case 2: // A short sequence of non-zeros + cbBytesToPut = rand() % 0x08; + ByteToPut = (BYTE)(rand() % 0x100); + break; + + case 3: // A long sequence of non-zeros + cbBytesToPut = rand() % 0x80; + ByteToPut = (BYTE)(rand() % 0x100); + break; + + case 4: // A short random data + cbBytesToPut = rand() % 0x08; + bRandomData = true; + break; + + case 5: // A long random data + cbBytesToPut = rand() % 0x80; + bRandomData = true; + break; + + default: // A single random byte + cbBytesToPut = 1; + ByteToPut = (BYTE)(rand() % 0x100); + break; + } + } + + // Generate random byte, if needed + if(bRandomData) + ByteToPut = (BYTE)(rand() % 0x100); + + // Put next byte to the output buffer + *pbPtr++ = ByteToPut; + cbBytesToPut--; + } +} + +static bool CompareArchivedFiles(const char * szFileName, HANDLE hFile1, HANDLE hFile2, DWORD dwBlockSize) +{ + LPBYTE pbBuffer1 = NULL; + LPBYTE pbBuffer2 = NULL; + DWORD dwRead1; // Number of bytes read (Storm.dll) + DWORD dwRead2; // Number of bytes read (StormLib) + bool bResult1 = false; // Result from Storm.dll + bool bResult2 = false; // Result from StormLib + bool bResult = true; + int nDiff; + + szFileName = szFileName; + + // Allocate buffers + pbBuffer1 = new BYTE[dwBlockSize]; + pbBuffer2 = new BYTE[dwBlockSize]; + + for(;;) + { + // Read the file's content by both methods and compare the result + memset(pbBuffer1, 0, dwBlockSize); + memset(pbBuffer2, 0, dwBlockSize); + bResult1 = SFileReadFile(hFile1, pbBuffer1, dwBlockSize, &dwRead1, NULL); + bResult2 = SFileReadFile(hFile2, pbBuffer2, dwBlockSize, &dwRead2, NULL); + if(bResult1 != bResult2) + { + _tprintf(_T("Different results from SFileReadFile, Mpq1 %u, Mpq2 %u\n"), bResult1, bResult2); + bResult = false; + break; + } + + // Test the number of bytes read + if(dwRead1 != dwRead2) + { + _tprintf(_T("Different bytes read from SFileReadFile, Mpq1 %u, Mpq2 %u\n"), dwRead1, dwRead2); + bResult = false; + break; + } + + // No more bytes ==> OK + if(dwRead1 == 0) + break; + + // Test the content + if((nDiff = GetFirstDiffer(pbBuffer1, pbBuffer2, dwRead1)) != -1) + { + bResult = false; + break; + } + } + + delete [] pbBuffer2; + delete [] pbBuffer1; + return bResult; +} + +// Random read version +static bool CompareArchivedFilesRR(const char * /* szFileName */, HANDLE hFile1, HANDLE hFile2, DWORD dwBlockSize) +{ + const char * szPositions[3] = {"FILE_BEGIN ", "FILE_CURRENT", "FILE_END "}; + LPBYTE pbBuffer1 = NULL; + LPBYTE pbBuffer2 = NULL; + DWORD dwFileSize1; // File size (Storm.dll) + DWORD dwFileSize2; // File size (StormLib) + DWORD dwRead1; // Number of bytes read (Storm.dll) + DWORD dwRead2; // Number of bytes read (StormLib) + bool bResult1 = false; // Result from Storm.dll + bool bResult2 = false; // Result from StormLib + int nError = ERROR_SUCCESS; + + // Test the file size + dwFileSize1 = SFileGetFileSize(hFile1, NULL); + dwFileSize2 = SFileGetFileSize(hFile2, NULL); + if(dwFileSize1 != dwFileSize2) + { + _tprintf(_T("Different size from SFileGetFileSize (file1: %u, file2: %u)\n"), dwFileSize1, dwFileSize2); + return false; + } + + if(dwFileSize1 != 0) + { + for(int i = 0; i < 10000; i++) + { + DWORD dwRandom = rand() * rand(); + DWORD dwMoveMethod = dwRandom % 3; + DWORD dwPosition = dwRandom % dwFileSize1; + DWORD dwToRead = dwRandom % dwBlockSize; + + // Also test negative seek + if(rand() & 1) + { + int nPosition = (int)dwPosition; + dwPosition = (DWORD)(-nPosition); + } + + // Allocate buffers + pbBuffer1 = new BYTE[dwToRead]; + pbBuffer2 = new BYTE[dwToRead]; + + // Set the file pointer + _tprintf(_T("RndRead (%u): pos %8i from %s, size %u ...\r"), i, dwPosition, szPositions[dwMoveMethod], dwToRead); + dwRead1 = SFileSetFilePointer(hFile1, dwPosition, NULL, dwMoveMethod); + dwRead2 = SFileSetFilePointer(hFile2, dwPosition, NULL, dwMoveMethod); + if(dwRead1 != dwRead2) + { + _tprintf(_T("Difference returned by SFileSetFilePointer (file1: %u, file2: %u)\n"), dwRead1, dwRead2); + nError = ERROR_CAN_NOT_COMPLETE; + break; + } + + // Read the file's content by both methods and compare the result + bResult1 = SFileReadFile(hFile1, pbBuffer1, dwToRead, &dwRead1, NULL); + bResult2 = SFileReadFile(hFile2, pbBuffer2, dwToRead, &dwRead2, NULL); + if(bResult1 != bResult2) + { + _tprintf(_T("Different results from SFileReadFile (file1: %u, file2: %u)\n\n"), bResult1, bResult2); + nError = ERROR_CAN_NOT_COMPLETE; + break; + } + + // Test the number of bytes read + if(dwRead1 != dwRead2) + { + _tprintf(_T("Different bytes read from SFileReadFile (file1: %u, file2: %u)\n\n"), dwRead1, dwRead2); + nError = ERROR_CAN_NOT_COMPLETE; + break; + } + + // Test the content + if(dwRead1 != 0 && memcmp(pbBuffer1, pbBuffer2, dwRead1)) + { + _tprintf(_T("Different data content from SFileReadFile\n")); + nError = ERROR_CAN_NOT_COMPLETE; + break; + } + + delete [] pbBuffer2; + delete [] pbBuffer1; + } + } + clreol(); + return (nError == ERROR_SUCCESS) ? true : false; +} + +//----------------------------------------------------------------------------- +// Opening local file + +static int TestOpenLocalFile(const char * szFileName) +{ + HANDLE hFile; + char szRetrievedName[MAX_PATH]; + + if(SFileOpenFileEx(NULL, szFileName, SFILE_OPEN_LOCAL_FILE, &hFile)) + { + SFileGetFileName(hFile, szRetrievedName); + SFileCloseFile(hFile); + } + + return ERROR_SUCCESS; +} + +//----------------------------------------------------------------------------- +// Partial file reading + +static int TestPartFileRead(const TCHAR * szFileName) +{ + ULONGLONG ByteOffset; + ULONGLONG FileSize = 0; + TFileStream * pStream; + BYTE BigBuffer[0x7000]; + BYTE Buffer[0x100]; + int nError = ERROR_SUCCESS; + + // Open the partial file + pStream = FileStream_OpenFile(szFileName, false); + if(pStream == NULL) + nError = GetLastError(); + + // Get the size of the stream + if(nError == ERROR_SUCCESS) + { + if(!FileStream_GetSize(pStream, FileSize)) + nError = GetLastError(); + } + + // Read the last 0x7000 bytes + if(nError == ERROR_SUCCESS) + { + ByteOffset = FileSize - sizeof(BigBuffer); + if(!FileStream_Read(pStream, &ByteOffset, BigBuffer, sizeof(BigBuffer))) + nError = GetLastError(); + } + + // Read the last 0x100 bytes + if(nError == ERROR_SUCCESS) + { + ByteOffset = FileSize - sizeof(Buffer); + if(!FileStream_Read(pStream, &ByteOffset, Buffer, sizeof(Buffer))) + nError = GetLastError(); + } + + // Read 0x100 bytes from position (FileSize - 0xFF) + if(nError == ERROR_SUCCESS) + { + ByteOffset = FileSize - sizeof(Buffer) + 1; + if(!FileStream_Read(pStream, &ByteOffset, Buffer, sizeof(Buffer))) + nError = GetLastError(); + } + + FileStream_Close(pStream); + return nError; +} + +//----------------------------------------------------------------------------- +// Compare LZMA decompression + +#ifdef PLATFORM_WINDOWS +typedef void * (*ALLOC_MEMORY)(size_t); +typedef void (*FREE_MEMORY)(void *); +typedef int (GIVE_DATA)(void *); + +extern "C" int starcraft_decompress_lzma(char * pbInBuffer, int cbInBuffer, char * pbOutBuffer, int cbOutBuffer, int * pcbOutBuffer, ALLOC_MEMORY pfnAllocMemory, FREE_MEMORY pfnFreeMemory); +extern "C" int starcraft_compress_lzma(char * pbInBuffer, int cbInBuffer, int dummy1, char * pbOutBuffer, int cbOutBuffer, int dummy2, int * pcbOutBuffer, ALLOC_MEMORY pfnAllocMemory, FREE_MEMORY pfnFreeMemory, GIVE_DATA pfnGiveData); +void Compress_LZMA(char * pbOutBuffer, int * pcbOutBuffer, char * pbInBuffer, int cbInBuffer, int *, int); +int Decompress_LZMA(char * pbOutBuffer, int * pcbOutBuffer, char * pbInBuffer, int cbInBuffer); + +extern "C" void * operator_new(size_t sz) +{ + return malloc(sz); +} + +void * Memory_Allocate(size_t byte_size) +{ + return malloc(byte_size); +} + +void Memory_Free(void * address) +{ + if(address != NULL) + free(address); +} + +int GiveData(void *) +{ + return 0; +} + +static int StarcraftCompress_LZMA(char * pbOutBuffer, int * pcbOutBuffer, char * pbInBuffer, int cbInBuffer) +{ + return starcraft_compress_lzma(pbInBuffer, + cbInBuffer, + 0, + pbOutBuffer, + *pcbOutBuffer, + 0, + pcbOutBuffer, + Memory_Allocate, + Memory_Free, + GiveData); +} + +static int StarcraftDecompress_LZMA(char * pbOutBuffer, int * pcbOutBuffer, char * pbInBuffer, int cbInBuffer) +{ + return starcraft_decompress_lzma(pbInBuffer, + cbInBuffer, + pbOutBuffer, + *pcbOutBuffer, + pcbOutBuffer, + Memory_Allocate, + Memory_Free); +} + +static int CompareLzmaCompressions(int nSectorSize) +{ + LPBYTE pbCompressed1 = NULL; // Compressed by our code + LPBYTE pbCompressed2 = NULL; // Compressed by Blizzard's code + LPBYTE pbDecompressed1 = NULL; // Decompressed by our code + LPBYTE pbDecompressed2 = NULL; // Decompressed by Blizzard's code + LPBYTE pbOriginalData = NULL; + int nError = ERROR_SUCCESS; + + // Allocate buffers + // Must allocate twice blocks due to probable bug in Storm.dll. + // Storm.dll corrupts stack when uncompresses data with PKWARE DCL + // and no compression occurs. + pbDecompressed1 = new BYTE [nSectorSize]; + pbDecompressed2 = new BYTE [nSectorSize]; + pbCompressed1 = new BYTE [nSectorSize]; + pbCompressed2 = new BYTE [nSectorSize]; + pbOriginalData = new BYTE[nSectorSize]; + if(!pbDecompressed1 || !pbDecompressed2 || !pbCompressed1 || !pbCompressed2 || !pbOriginalData) + nError = ERROR_NOT_ENOUGH_MEMORY; + + if(nError == ERROR_SUCCESS) + { + for(int i = 0; i < 100000; i++) + { + int nDcmpLength1; + int nDcmpLength2; + int nCmpLength1; + int nCmpLength2; + int nDiff; + + clreol(); + _tprintf(_T("Testing compression of sector %u\r"), i + 1); + + // Generate random data sector + GenerateRandomDataBlock(pbOriginalData, nSectorSize); + + // Compress the sector by both methods + nCmpLength1 = nCmpLength2 = nSectorSize; +// Compress_LZMA((char *)pbCompressed1, &nCmpLength1, (char *)pbOriginalData, nSectorSize, 0, 0); + StarcraftCompress_LZMA((char *)pbCompressed1, &nCmpLength2, (char *)pbOriginalData, nSectorSize); + +__TryToDecompress: + + // Only test decompression when the compression actually succeeded + if(nCmpLength1 < nSectorSize) + { + // Decompress both data + nDcmpLength2 = nDcmpLength1 = nSectorSize; +// Decompress_LZMA((char *)pbDecompressed1, &nDcmpLength1, (char *)pbCompressed1, nCmpLength1); + StarcraftDecompress_LZMA((char *)pbDecompressed2, &nDcmpLength2, (char *)pbCompressed1, nCmpLength1); + + // Compare the length of the output data + if(nDcmpLength1 != nDcmpLength2) + { + _tprintf(_T("Difference in compressed blocks lengths (%u vs %u)\n"), nDcmpLength1, nDcmpLength2); + goto __TryToDecompress; + } + + // Compare the output + if((nDiff = GetFirstDiffer(pbDecompressed1, pbDecompressed2, nDcmpLength1)) != -1) + { + _tprintf(_T("Difference in decompressed blocks (offset 0x%08X)\n"), nDiff); + goto __TryToDecompress; + } + + // Check for data overflow + if(pbDecompressed1[nSectorSize] != 0xFD || pbDecompressed1[nSectorSize] != 0xFD) + { + _tprintf(_T("Damage after decompressed sector !!!\n")); + goto __TryToDecompress; + } + + // Compare the decompressed data against original data + if((nDiff = GetFirstDiffer(pbDecompressed1, pbOriginalData, nDcmpLength1)) != -1) + { + _tprintf(_T("Difference between original data and decompressed data (offset 0x%08X)\n"), nDiff); + goto __TryToDecompress; + } + } + } + } + + // Cleanup + if(pbOriginalData != NULL) + delete [] pbOriginalData; + if(pbCompressed2 != NULL) + delete [] pbCompressed2; + if(pbCompressed1 != NULL) + delete [] pbCompressed1; + if(pbDecompressed2 != NULL) + delete [] pbDecompressed2; + if(pbDecompressed1 != NULL) + delete [] pbDecompressed1; + clreol(); + return nError; +} +#endif // PLATFORM_WINDOWS + +//----------------------------------------------------------------------------- +// Compression method test + +static int TestSectorCompress(int nSectorSize) +{ + LPBYTE pbDecompressed = NULL; + LPBYTE pbCompressed = NULL; + LPBYTE pbOriginal = NULL; + int nError = ERROR_SUCCESS; + + // Allocate buffers + pbDecompressed = new BYTE[nSectorSize]; + pbCompressed = new BYTE[nSectorSize]; + pbOriginal = new BYTE[nSectorSize]; + if(!pbDecompressed || !pbCompressed || !pbOriginal) + nError = ERROR_NOT_ENOUGH_MEMORY; + + if(nError == ERROR_SUCCESS) + { + for(int i = 0; i < 100000; i++) + { + int nOriginalLength = nSectorSize % (rand() + 1); + int nCompressedLength; + int nDecompressedLength; + int nCmp = MPQ_COMPRESSION_SPARSE | MPQ_COMPRESSION_ZLIB | MPQ_COMPRESSION_BZIP2 | MPQ_COMPRESSION_PKWARE; + int nDiff; + + clreol(); + _tprintf(_T("Testing compression of sector %u\r"), i + 1); + + // Generate random data sector + GenerateRandomDataBlock(pbOriginal, nOriginalLength); + if(nOriginalLength == 0x123) + nOriginalLength = 0; + +__TryAgain: + + // Compress the sector + nCompressedLength = nOriginalLength; + SCompCompress((char *)pbCompressed, &nCompressedLength, (char *)pbOriginal, nOriginalLength, nCmp, 0, -1); +// SCompImplode((char *)pbCompressed, &nCompressedLength, (char *)pbOriginal, nOriginalLength); + + // When the method was unable to compress data, + // the compressed data must be identical to original data + if(nCompressedLength == nOriginalLength) + { + if((nDiff = GetFirstDiffer(pbCompressed, pbOriginal, nOriginalLength)) != -1) + { + _tprintf(_T("Compression error: Fail when unable to compress the data (Offset 0x%08X).\n"), nDiff); + goto __TryAgain; + } + } + + // Uncompress the sector + nDecompressedLength = nOriginalLength; + SCompDecompress((char *)pbDecompressed, &nDecompressedLength, (char *)pbCompressed, nCompressedLength); +// SCompExplode((char *)pbDecompressed, &nDecompressedLength, (char *)pbCompressed, nCompressedLength); + + // Check the decompressed length against original length + if(nDecompressedLength != nOriginalLength) + { + _tprintf(_T("Length of uncompressed data does not agree with original data length !!!\n")); + goto __TryAgain; + } + + // Check decompressed block against original block + if((nDiff = GetFirstDiffer(pbDecompressed, pbOriginal, nOriginalLength)) != -1) + { + _tprintf(_T("Decompressed sector does not agree with the original data !!! (Offset 0x%08X)\n"), nDiff); + goto __TryAgain; + } + } + } + + // Cleanup + delete [] pbOriginal; + delete [] pbCompressed; + delete [] pbDecompressed; + clreol(); + return nError; +} + +static int TestArchiveOpenAndClose(const TCHAR * szMpqName) +{ + const char * szFileName1 = "world\\maps\\AhnQiraj\\AhnQiraj_27_51_tex1.adt"; +// const char * szFileName2 = "items\\map\\mapz_deleted.cel"; + TMPQArchive * ha = NULL; + HANDLE hFile1 = NULL; +// HANDLE hFile2 = NULL; + HANDLE hMpq = NULL; + int nError = ERROR_SUCCESS; + + if(nError == ERROR_SUCCESS) + { + _tprintf(_T("Opening archive %s ...\n"), szMpqName); + if(!SFileOpenArchive(szMpqName, 0, 0, /* MPQ_OPEN_ENCRYPTED,*/ &hMpq)) + nError = GetLastError(); + ha = (TMPQArchive *)hMpq; + } +/* + // Test for TBitArray + if(nError == ERROR_SUCCESS && ha->pHetTable != NULL) + { + TBitArray * pBitArray = ha->pHetTable->pBetIndexes; + + for(ULONG i = 0; i < 0x10000; i++) + { + BYTE LoadedBits[0x20]; + BYTE SaveBits[0x40]; + unsigned int nBitPosition = (i >> 0x08); + unsigned int nBitCount = (i & 0xFF); + + memset(LoadedBits, 0, sizeof(LoadedBits)); + memcpy(SaveBits, pBitArray->Elements, sizeof(SaveBits)); + + // Load the index to the BET table + pBitArray->GetBits(nBitPosition, nBitCount, LoadedBits, sizeof(LoadedBits)); + + // Load the index to the BET table + pBitArray->SetBits(nBitPosition, nBitCount, LoadedBits, sizeof(LoadedBits)); + + // Verify the bits + if(memcmp(SaveBits, pBitArray->Elements, sizeof(SaveBits))) + assert(false); + } + } +*/ + // Verify the raw data in the archive + if(nError == ERROR_SUCCESS) + { + // Verify the archive + SFileVerifyRawData(hMpq, SFILE_VERIFY_FILE, szFileName1); + + // Try to open a file + if(!SFileOpenFileEx(hMpq, szFileName1, SFILE_OPEN_FROM_MPQ, &hFile1)) + { + nError = GetLastError(); + printf("%s - file not found in the MPQ\n", szFileName1); + } + } + + // Dummy read from the file + if(nError == ERROR_SUCCESS) + { + DWORD dwBytesRead = 0; + BYTE Buffer[0x1000]; + + SFileSetFileLocale(hFile1, 0x405); + SFileReadFile(hFile1, Buffer, sizeof(Buffer), &dwBytesRead); + } +/* + // Verify the MPQ listfile + if(nError == ERROR_SUCCESS) + { + SFileVerifyFile(hMpq, szFileName1, 0xFFFFFFFF); + if(!CompareArchivedFilesRR(szFileName1, hFile1, hFile2, 0x100000)) + nError = ERROR_CAN_NOT_COMPLETE; + } +*/ + if(hFile1 != NULL) + SFileCloseFile(hFile1); + if(hMpq != NULL) + SFileCloseArchive(hMpq); + return nError; +} + +static int TestFindFiles(const TCHAR * szMpqName) +{ + TMPQFile * hf; + HANDLE hFile; + HANDLE hMpq = NULL; + BYTE Buffer[100]; + int nError = ERROR_SUCCESS; + int nFiles = 0; + int nFound = 0; + + // Open the archive + if(nError == ERROR_SUCCESS) + { + _tprintf(_T("Opening \"%s\" for finding files ...\n"), szMpqName); + if(!SFileOpenArchive(szMpqName, 0, 0, &hMpq)) + nError = GetLastError(); + } + + // Compact the archive + if(nError == ERROR_SUCCESS) + { + SFILE_FIND_DATA sf; + HANDLE hFind; + DWORD dwExtraDataSize; + bool bFound = true; + + hFind = SFileFindFirstFile(hMpq, "*", &sf, "c:\\Tools32\\ListFiles\\ListFile.txt"); + while(hFind != NULL && bFound != false) + { + if(SFileOpenFileEx(hMpq, sf.cFileName, 0, &hFile)) + { + hf = (TMPQFile *)hFile; + SFileReadFile(hFile, Buffer, sizeof(Buffer)); + nFiles++; + + if(sf.dwFileFlags & MPQ_FILE_SECTOR_CRC) + { + dwExtraDataSize = hf->SectorOffsets[hf->dwSectorCount + 1] - hf->SectorOffsets[hf->dwSectorCount]; + if(dwExtraDataSize != 0) + nFound++; + } + + SFileCloseFile(hFile); + } + + bFound = SFileFindNextFile(hFind, &sf); + } + } + + if(hMpq != NULL) + SFileCloseArchive(hMpq); + if(nError == ERROR_SUCCESS) + _tprintf(_T("Search complete\n")); + return nError; +} + +static int TestMpqCompacting(const TCHAR * szMpqName) +{ + HANDLE hMpq = NULL; + int nError = ERROR_SUCCESS; + + // Open the archive + if(nError == ERROR_SUCCESS) + { + _tprintf(_T("Opening \"%s\" for compacting ...\n"), szMpqName); + if(!SFileOpenArchive(szMpqName, 0, 0, &hMpq)) + nError = GetLastError(); + } + + if(nError == ERROR_SUCCESS) + { + char * szFileName = "Shaders\\Effects\\shadowmap.wfx"; + + printf("Deleting file %s ...\r", szFileName); + if(!SFileRemoveFile(hMpq, szFileName)) + nError = GetLastError(); + } +/* + // Compact the archive + if(nError == ERROR_SUCCESS) + { + _tprintf(_T("Compacting archive ...\r")); + SFileSetCompactCallback(hMpq, CompactCB, NULL); + if(!SFileCompactArchive(hMpq, "c:\\Tools32\\ListFiles\\ListFile.txt")) + nError = GetLastError(); + } +*/ + if(hMpq != NULL) + SFileCloseArchive(hMpq); + if(nError == ERROR_SUCCESS) + _tprintf(_T("Compacting complete (No errors)\n")); + return nError; +} + +static int TestCreateArchive(const TCHAR * szMpqName) +{ + TFileStream * pStream; + const TCHAR * szFileName1 = MAKE_PATH("FileTest.exe"); + const TCHAR * szFileName2 = MAKE_PATH("ZeroSize.txt"); + HANDLE hMpq = NULL; // Handle of created archive + DWORD dwVerifyResult; + DWORD dwFileCount = 0; + LCID LocaleIDs[] = {0x000, 0x405, 0x406, 0x407, 0xFFFF}; + char szMpqFileName[MAX_PATH]; + int nError = ERROR_SUCCESS; + int i; + + // Create the new file + _tprintf(_T("Creating %s ...\n"), szMpqName); + pStream = FileStream_CreateFile(szMpqName); + if(pStream == NULL) + nError = GetLastError(); + + // Write some data + if(nError == ERROR_SUCCESS) + { + ULONGLONG FileSize = 0x100000; + + FileStream_SetSize(pStream, FileSize); + FileStream_Close(pStream); + } + + // Well, now create the MPQ archive + if(nError == ERROR_SUCCESS) + { + if(!SFileCreateArchive(szMpqName, + MPQ_CREATE_ARCHIVE_V4 | MPQ_CREATE_ATTRIBUTES, + 17, + &hMpq)) + { + nError = GetLastError(); + } + } + + // Add the same file multiple times + if(nError == ERROR_SUCCESS) + { + // Add FileTest.exe + for(i = 0; AddFlags[i] != 0xFFFFFFFF; i++) + { + sprintf(szMpqFileName, "FileTest_%02u.exe", i); + PrintfTA(_T("Adding %s as %s ...\n"), szFileName1, szMpqFileName); + if(SFileAddFileEx(hMpq, szFileName1, szMpqFileName, AddFlags[i], MPQ_COMPRESSION_ZLIB)) + { + dwVerifyResult = SFileVerifyFile(hMpq, szMpqFileName, MPQ_ATTRIBUTE_CRC32 | MPQ_ATTRIBUTE_MD5); + if(dwVerifyResult & (VERIFY_OPEN_ERROR | VERIFY_READ_ERROR | VERIFY_FILE_SECTOR_CRC_ERROR | VERIFY_FILE_CHECKSUM_ERROR | VERIFY_FILE_MD5_ERROR)) + printf("CRC error on \"%s\"\n", szMpqFileName); + dwFileCount++; + } + else + { + printf("Failed to add the file \"%s\".\n", szMpqFileName); + } + } + + + // Delete a file in the middle of the file table + SFileRemoveFile(hMpq, "FileTest_10.exe"); + SFileAddFileEx(hMpq, szFileName1, "FileTest_xx.exe", MPQ_FILE_COMPRESS | MPQ_FILE_ENCRYPTED, MPQ_COMPRESSION_ZLIB); + + // Try to decrement max file count + dwFileCount = SFileGetMaxFileCount(hMpq); + SFileSetMaxFileCount(hMpq, dwFileCount - 1); + + // Add ZeroSize.txt (1) + sprintf(szMpqFileName, "ZeroSize_1.txt"); + for(i = 0; LocaleIDs[i] != 0xFFFF; i++) + { + PrintfTA(_T("Adding %s as %s (locale %04x) ...\n"), szFileName2, szMpqFileName, LocaleIDs[i]); + SFileSetLocale(LocaleIDs[i]); + if(!SFileAddFileEx(hMpq, szFileName2, szMpqFileName, MPQ_FILE_COMPRESS | MPQ_FILE_ENCRYPTED, MPQ_COMPRESSION_ZLIB)) + printf("Cannot add the file\n"); + } + + // Add ZeroSize.txt (1) + sprintf(szMpqFileName, "ZeroSize_2.txt"); + for(int i = 0; LocaleIDs[i] != 0xFFFF; i++) + { + PrintfTA(_T("Adding %s as %s (locale %04x) ...\n"), szFileName2, szMpqFileName, LocaleIDs[i]); + SFileSetLocale(LocaleIDs[i]); + if(!SFileAddFileEx(hMpq, szFileName2, szMpqFileName, MPQ_FILE_COMPRESS | MPQ_FILE_ENCRYPTED, MPQ_COMPRESSION_ZLIB)) + printf("Cannot add the file\n"); + } + } + + // Test rename function + if(nError == ERROR_SUCCESS) + { + _tprintf(_T("Testing rename files ...\n")); + SFileSetLocale(LANG_NEUTRAL); + if(!SFileRenameFile(hMpq, "FileTest_08.exe", "FileTest_08a.exe")) + { + nError = GetLastError(); + _tprintf(_T("Failed to rename the file\n")); + } + + if(!SFileRenameFile(hMpq, "FileTest_08a.exe", "FileTest_08.exe")) + { + nError = GetLastError(); + _tprintf(_T("Failed to rename the file\n")); + } + + if(!SFileRenameFile(hMpq, "FileTest_10.exe", "FileTest_10a.exe")) + { + nError = GetLastError(); + _tprintf(_T("Failed to rename the file\n")); + } + + if(!SFileRenameFile(hMpq, "FileTest_10a.exe", "FileTest_10.exe")) + { + nError = GetLastError(); + _tprintf(_T("Failed to rename the file\n")); + } + + if(nError == ERROR_SUCCESS) + _tprintf(_T("Rename test succeeded.\n\n")); + else + _tprintf(_T("Rename test failed.\n\n")); + } + + // Compact the archive +// if(nError == ERROR_SUCCESS) +// SFileCompactArchive(hMpq); + + // Test changing hash table size + if(nError == ERROR_SUCCESS) + SFileSetMaxFileCount(hMpq, 0x95); + + if(hMpq != NULL) + SFileCloseArchive(hMpq); + + // Try to reopen the archive + if(SFileOpenArchive(szMpqName, 0, 0, &hMpq)) + SFileCloseArchive(hMpq); + + _tprintf(_T("\n")); + return nError; +} + +static int TestCreateArchive_PaliRoharBug(const TCHAR * szMpqName) +{ + const TCHAR * szFileName = MAKE_PATH("FileTest.exe"); + HANDLE hMpq = NULL; // Handle of created archive + DWORD dwMaxFileCount = 0; + DWORD dwMpqFlags = MPQ_FILE_ENCRYPTED | MPQ_FILE_COMPRESS; + char szMpqFileName[MAX_PATH]; + int nError = ERROR_SUCCESS; + int i; + + _tremove(szMpqName); + if(SFileCreateArchive(szMpqName, + MPQ_CREATE_ARCHIVE_V4 | MPQ_CREATE_ATTRIBUTES, + 1, + &hMpq)) + { + // Add the file there + SFileAddFileEx(hMpq, szFileName, "FileTest_base.exe", dwMpqFlags, MPQ_COMPRESSION_ZLIB); + SFileFlushArchive(hMpq); + SFileCloseArchive(hMpq); + + // Add the same file 10 times + for(i = 0; i < 10; i++) + { + if(SFileOpenArchive(szMpqName, 0, 0, &hMpq)) + { + dwMaxFileCount = SFileGetMaxFileCount(hMpq) + 1; + _tprintf(_T("Increasing max file count to %u ...\n"), dwMaxFileCount); + SFileSetMaxFileCount(hMpq, dwMaxFileCount); + + sprintf(szMpqFileName, "FileTest_%02u.exe", dwMaxFileCount); + PrintfTA(_T("Adding %s as %s\n"), szFileName, szMpqFileName); + if(!SFileAddFileEx(hMpq, szFileName, szMpqFileName, dwMpqFlags, MPQ_COMPRESSION_ZLIB)) + { + printf("Failed to add the file \"%s\".\n", szMpqFileName); + break; + } + + SFileFlushArchive(hMpq); + SFileCompactArchive(hMpq); + SFileCloseArchive(hMpq); + } + } + } + + _tprintf(_T("\n")); + return nError; +} + + +static int TestAddFilesToMpq( + const TCHAR * szMpqName, + ... + ) +{ + const TCHAR * szFileName; + const TCHAR * szSrc; + char * szTrg; + HANDLE hMpq; + va_list argList; + char szMpqFileName[MAX_PATH]; + int nError = ERROR_SUCCESS; + + if(!SFileOpenArchive(szMpqName, 0, 0, &hMpq)) + return GetLastError(); + + va_start(argList, szMpqName); + while((szFileName = va_arg(argList, const TCHAR *)) != NULL) + { + // Convert the plain name to ANSI + szSrc = GetPlainFileNameT(szFileName); + szTrg = szMpqFileName; + while(*szSrc != 0) + *szTrg++ = (char)*szSrc++; + *szTrg = 0; + + // Add the file to MPQ + if(!SFileAddFileEx(hMpq, szFileName, + szMpqFileName, + MPQ_FILE_COMPRESS, + MPQ_COMPRESSION_ZLIB)) + { + nError = GetLastError(); + printf("Failed to add the file \"%s\"\n", szFileName); + } + } + + SFileCloseArchive(hMpq); + return nError; +} + +static int TestCreateArchiveFromMemory(const TCHAR * szMpqName) +{ +#define FILE_SIZE 65535 + + HANDLE hFile; + HANDLE hMPQ; + char* data = new char [FILE_SIZE]; // random memory data + char szFileName[100]; + int i; + + // Create an mpq file for testing + if(SFileCreateArchive(szMpqName, MPQ_CREATE_ARCHIVE_V2|MPQ_CREATE_ATTRIBUTES, 0x100000, &hMPQ)) + { + for(i = 0; i < 1000; i++) + { + sprintf(szFileName, "File%03u.bin", i); + printf("Adding file %s\r", szFileName); + + if(SFileCreateFile(hMPQ, szFileName, 0, FILE_SIZE, 0, MPQ_FILE_COMPRESS, &hFile)) + { + SFileWriteFile(hFile, data, FILE_SIZE, MPQ_COMPRESSION_ZLIB); + SFileFinishFile(hFile); + } + } + } + SFileCloseArchive(hMPQ); + delete [] data; + return ERROR_SUCCESS; +} + +static int TestFileReadAndWrite( + const TCHAR * szMpqName, + const char * szFileName) +{ + LPBYTE pvFile = NULL; + HANDLE hFile = NULL; + HANDLE hMpq = NULL; + DWORD dwBytesRead; + DWORD dwFileSize = 0; + int nError = ERROR_SUCCESS; + + if(!SFileOpenArchive(szMpqName, 0, 0, &hMpq)) + { + nError = GetLastError(); + _tprintf(_T("Failed to open the archive %s (%u).\n"), szMpqName, nError); + } + + if(nError == ERROR_SUCCESS) + { + if(!SFileOpenFileEx(hMpq, szFileName, 0, &hFile)) + { + nError = GetLastError(); + printf("Failed to open the file %s (%u).\n", szFileName, nError); + } + } + + if(nError == ERROR_SUCCESS) + { + if(!SFileGetFileInfo(hFile, SFILE_INFO_FILE_SIZE, &dwFileSize, sizeof(DWORD))) + { + nError = GetLastError(); + _tprintf(_T("Failed to get the file size (%u).\n"), nError); + } + } + + if(nError == ERROR_SUCCESS) + { + pvFile = new BYTE[dwFileSize]; + if(pvFile == NULL) + { + nError = ERROR_NOT_ENOUGH_MEMORY; + printf("Failed to allocate buffer for the file (%u).\n", nError); + } + } + + if(nError == ERROR_SUCCESS) + { + if(!SFileReadFile(hFile, pvFile, dwFileSize, &dwBytesRead)) + { + nError = GetLastError(); + printf("Failed to read file (%u).\n", nError); + } + } + + if(hFile != NULL) + { + SFileCloseFile(hFile); + hFile = NULL; + } + + if(nError == ERROR_SUCCESS) + { + if(!SFileCreateFile(hMpq, szFileName, 0, dwFileSize, 0, MPQ_FILE_REPLACEEXISTING, &hFile)) + { + nError = GetLastError(); + printf("Failed to create %s in the archive (%u).\n", szFileName, nError); + } + } + + if(nError == ERROR_SUCCESS) + { + if(!SFileWriteFile(hFile, pvFile, dwFileSize, 0)) + { + nError = GetLastError(); + printf("Failed to write the data to the MPQ (%u).\n", nError); + } + } + + if(hFile != NULL) + { + if(!SFileFinishFile(hFile)) + { + nError = GetLastError(); + printf("Failed to finalize file creation (%u).\n", nError); + } + } + + if(pvFile != NULL) + delete [] pvFile; + if(hMpq != NULL) + SFileCloseArchive(hMpq); + return nError; +} + +static int TestSignatureVerify(const TCHAR * szMpqName) +{ + HANDLE hMpq; + + if(SFileOpenArchive(szMpqName, 0, 0, &hMpq)) + { + _tprintf(_T("Verifying digital signature in %s:\n"), szMpqName); + switch(SFileVerifyArchive(hMpq)) + { + case ERROR_NO_SIGNATURE: + _tprintf(_T("No digital signature present.\n")); + break; + + case ERROR_VERIFY_FAILED: + _tprintf(_T("Failed to verify signature.\n")); + break; + + case ERROR_WEAK_SIGNATURE_OK: + _tprintf(_T("Weak signature is OK.\n")); + break; + + case ERROR_WEAK_SIGNATURE_ERROR: + _tprintf(_T("Weak signature mismatch.\n")); + break; + + case ERROR_STRONG_SIGNATURE_OK: + _tprintf(_T("Strong signature is OK.\n")); + break; + + case ERROR_STRONG_SIGNATURE_ERROR: + _tprintf(_T("Strong signature mismatch.\n")); + break; + } + + SFileCloseArchive(hMpq); + _tprintf(_T("\n")); + } + + return 0; +} + + +static int TestCreateArchiveCopy(const TCHAR * szMpqName, const TCHAR * szMpqCopyName, const char * szListFile) +{ + TFileStream * pStream; + TCHAR szLocalFile[MAX_PATH]; + HANDLE hMpq1 = NULL; // Handle of existing archive + HANDLE hMpq2 = NULL; // Handle of created archive + DWORD dwHashTableSize = 0; + int nError = ERROR_SUCCESS; + + // If no listfile or an empty one, use NULL + if(szListFile == NULL || *szListFile == 0) + szListFile = NULL; + + // Create the new file + pStream = FileStream_CreateFile(szMpqCopyName); + if(pStream == NULL) + nError = GetLastError(); + + // Write some data + if(nError == ERROR_SUCCESS) + { + ULONGLONG FileSize = 0x100000; + + FileStream_SetSize(pStream, FileSize); + FileStream_Close(pStream); + } + + // Open the existing MPQ archive + if(nError == ERROR_SUCCESS) + { + _tprintf(_T("Opening %s ...\n"), szMpqName); + if(!SFileOpenArchive(szMpqName, 0, 0, &hMpq1)) + nError = GetLastError(); + } + + // Well, now create the MPQ archive + if(nError == ERROR_SUCCESS) + { + _tprintf(_T("Creating %s ...\n"), szMpqCopyName); + SFileGetFileInfo(hMpq1, SFILE_INFO_HASH_TABLE_SIZE, &dwHashTableSize, 4); + if(!SFileCreateArchive(szMpqCopyName, 0, dwHashTableSize, &hMpq2)) + nError = GetLastError(); + } + + // Copy all files from one archive to another + if(nError == ERROR_SUCCESS) + { + SFILE_FIND_DATA sf; + HANDLE hFind = SFileFindFirstFile(hMpq1, "*", &sf, szListFile); + bool bResult = true; + + _tprintf(_T("Copying files ...\n")); + + if(hFind != NULL) + { + while(bResult) + { + if(strcmp(sf.cFileName, LISTFILE_NAME) && strcmp(sf.cFileName, ATTRIBUTES_NAME)) + { + SFileSetLocale(sf.lcLocale); + + // Create the local file name + MergeLocalPath(szLocalFile, szWorkDir, sf.szPlainName); + if(SFileExtractFile(hMpq1, sf.cFileName, szLocalFile)) + { + printf("Extracting %s ... OK\n", sf.cFileName); + if(!SFileAddFile(hMpq2, szLocalFile, sf.cFileName, sf.dwFileFlags)) + { + nError = GetLastError(); + printf("Adding %s ... Failed\n\n", sf.cFileName); + _tremove(szLocalFile); + break; + } + else + { + printf("Adding %s ... OK\n", sf.cFileName); + } + } + else + { + printf("Extracting %s ... Failed\n", sf.cFileName); + } + + // Delete the added file + _tremove(szLocalFile); + } + + // Find the next file + bResult = SFileFindNextFile(hFind, &sf); + } + + // Close the search handle + SFileFindClose(hFind); + printf("\n"); + } + } + + // Close both archives + if(hMpq2 != NULL) + SFileCloseArchive(hMpq2); + if(hMpq1 != NULL) + SFileCloseArchive(hMpq1); + return nError; +} + +static int TestCompareTwoArchives( + const TCHAR * szMpqName1, + const TCHAR * szMpqName2, + const char * szListFile, + DWORD dwBlockSize) +{ + TMPQArchive * ha1 = NULL; + TMPQArchive * ha2 = NULL; + LPBYTE pbBuffer1 = NULL; + LPBYTE pbBuffer2 = NULL; + HANDLE hMpq1 = NULL; // Handle of the first archive + HANDLE hMpq2 = NULL; // Handle of the second archive + HANDLE hFile1 = NULL; + HANDLE hFile2 = NULL; + int nError = ERROR_SUCCESS; + + // If no listfile or an empty one, use NULL + if(szListFile == NULL || *szListFile == 0) + szListFile = NULL; + + // Allocate both buffers + pbBuffer1 = new BYTE[dwBlockSize]; + pbBuffer2 = new BYTE[dwBlockSize]; + if(pbBuffer1 == NULL || pbBuffer2 == NULL) + nError = ERROR_NOT_ENOUGH_MEMORY; + + _tprintf(_T("=============== Comparing MPQ archives ===============\n")); + + // Open the first MPQ archive + if(nError == ERROR_SUCCESS && szMpqName1 != NULL) + { + _tprintf(_T("Opening %s ...\n"), szMpqName1); + if(!SFileOpenArchive(szMpqName1, 0, 0, &hMpq1)) + nError = GetLastError(); + ha1 = (TMPQArchive *)hMpq1; + } + + // Open the second MPQ archive + if(nError == ERROR_SUCCESS && szMpqName2 != NULL) + { + _tprintf(_T("Opening %s ...\n"), szMpqName2); + if(!SFileOpenArchive(szMpqName2, 0, 0, &hMpq2)) + nError = GetLastError(); + ha2 = (TMPQArchive *)hMpq2; + } + + // Compare the header + if(nError == ERROR_SUCCESS && (ha1 != NULL && ha2 != NULL)) + { + if(ha1->pHeader->dwHeaderSize != ha2->pHeader->dwHeaderSize) + printf(" - Header size is different\n"); + if(ha1->pHeader->wFormatVersion != ha2->pHeader->wFormatVersion) + printf(" - Format version is different\n"); + if(ha1->pHeader->wSectorSize != ha2->pHeader->wSectorSize) + printf(" - Sector size is different\n"); + if(ha1->pHeader->HetTableSize64 != ha2->pHeader->HetTableSize64) + printf(" - HET table size is different\n"); + if(ha1->pHeader->BetTableSize64 != ha2->pHeader->BetTableSize64) + printf(" - BET table size is different\n"); + if(ha1->pHeader->dwHashTableSize != ha2->pHeader->dwHashTableSize) + printf(" - Hash table size is different\n"); + if(ha1->pHeader->dwBlockTableSize != ha2->pHeader->dwBlockTableSize) + printf(" - Block table size is different\n"); + } + + // Find all files in the first archive and compare them + if(nError == ERROR_SUCCESS) + { + SFILE_FIND_DATA sf; + HANDLE hFind = SFileFindFirstFile(hMpq1, "*", &sf, szListFile); + DWORD dwSearchScope1 = SFILE_OPEN_FROM_MPQ; + DWORD dwSearchScope2 = SFILE_OPEN_FROM_MPQ; + bool bResult = true; + + if(hMpq1 == NULL) + dwSearchScope1 = SFILE_OPEN_LOCAL_FILE; + if(hMpq2 == NULL) + dwSearchScope2 = SFILE_OPEN_LOCAL_FILE; + + while(hFind != NULL && bResult == true) + { + printf("%s\n", sf.cFileName); + SFileSetLocale(sf.lcLocale); + + // Open the first file + if(!SFileOpenFileEx(hMpq1, sf.cFileName, dwSearchScope1, &hFile1)) + { + printf("Failed to open the file %s in the first archive\n", sf.cFileName); + continue; + } + + if(!SFileOpenFileEx(hMpq2, sf.cFileName, dwSearchScope2, &hFile2)) + { + printf("Failed to open the file %s in the second archive\n", sf.cFileName); + continue; + } + + if(dwSearchScope1 == SFILE_OPEN_FROM_MPQ && dwSearchScope2 == SFILE_OPEN_FROM_MPQ) + { + TMPQFile * hf1 = (TMPQFile *)hFile1; + TMPQFile * hf2 = (TMPQFile *)hFile2; + + // Compare the file sizes + if(hf1->pFileEntry->dwFileSize != hf2->pFileEntry->dwFileSize) + printf(" - %s different size (%u x %u)\n", sf.cFileName, hf1->pFileEntry->dwFileSize, hf2->pFileEntry->dwFileSize); + + if(hf1->pFileEntry->dwFlags != hf2->pFileEntry->dwFlags) + printf(" - %s different flags (%08X x %08X)\n", sf.cFileName, hf1->pFileEntry->dwFlags, hf2->pFileEntry->dwFlags); + } + + if(!CompareArchivedFiles(sf.cFileName, hFile1, hFile2, 0x1001)) + printf(" - %s different content\n", sf.cFileName); + + if(!CompareArchivedFilesRR(sf.cFileName, hFile1, hFile2, 0x100000)) + printf(" - %s different content\n", sf.cFileName); + + // Close both files + SFileCloseFile(hFile2); + SFileCloseFile(hFile1); + hFile2 = hFile1 = NULL; + + // Find the next file + bResult = SFileFindNextFile(hFind, &sf); + } + + // Close all handles + if(hFile2 != NULL) + SFileCloseFile(hFile2); + if(hFile1 != NULL) + SFileCloseFile(hFile1); + if(hFind != NULL) + SFileFindClose(hFind); + } + + // Close both archives + clreol(); + printf("================ MPQ compare complete ================\n"); + if(hMpq2 != NULL) + SFileCloseArchive(hMpq2); + if(hMpq1 != NULL) + SFileCloseArchive(hMpq1); + if(pbBuffer2 != NULL) + delete [] pbBuffer2; + if(pbBuffer1 != NULL) + delete [] pbBuffer1; + return nError; +} + +static int TestOpenPatchedArchive(const TCHAR * szMpqName, ...) +{ + TFileStream * pStream; + HANDLE hFile = NULL; + HANDLE hMpq = NULL; + va_list argList; + const char * szFileName = "World\\Minimaps\\Azeroth\\noLiquid_map20_44.blp"; + TCHAR szLocFileName[MAX_PATH]; + LPBYTE pbFullFile = NULL; + DWORD dwFileSize; + int nError = ERROR_SUCCESS; + + // Open the primary MPQ + _tprintf(_T("Opening %s ...\n"), szMpqName); + if(!SFileOpenArchive(szMpqName, 0, MPQ_OPEN_READ_ONLY, &hMpq)) + { + nError = GetLastError(); + _tprintf(_T("Failed to open the archive %s ...\n"), szMpqName); + } + + // Add all patches + if(nError == ERROR_SUCCESS) + { + va_start(argList, szMpqName); + while((szMpqName = va_arg(argList, const TCHAR *)) != NULL) + { + _tprintf(_T("Adding patch %s ...\n"), szMpqName); + if(!SFileOpenPatchArchive(hMpq, szMpqName, NULL, 0)) + { + nError = GetLastError(); + printf("Failed to add patch %s ...\n", szMpqName); + } + } + va_end(argList); + } + + // Now search all files + if(nError == ERROR_SUCCESS) + { + SFILE_FIND_DATA sf; + HANDLE hFind; + bool bResult = true; + + hFind = SFileFindFirstFile(hMpq, "World\\Minimaps\\Azeroth\\noLiquid_map20_44.*", &sf, NULL); + while(hFind && bResult) + { + printf("%s\n", sf.cFileName); + bResult = SFileFindNextFile(hFind, &sf); + } + } + + // Now try to open patched version of a file + if(nError == ERROR_SUCCESS) + { + SFileExtractFile(hMpq, szFileName, _T("E:\\noLiquid_map20_44.blp")); + } + + // Now try to open patched version of "Achievement.dbc" + if(nError == ERROR_SUCCESS) + { + printf("Opening patched file \"%s\" ...\n", szFileName); + SFileVerifyFile(hMpq, szFileName, SFILE_VERIFY_RAW_MD5); + if(!SFileOpenFileEx(hMpq, szFileName, SFILE_OPEN_PATCHED_FILE, &hFile)) + { + nError = GetLastError(); + printf("Failed to open patched file \"%s\"\n", szFileName); + } + } + + // Verify of the patched version is correct + if(nError == ERROR_SUCCESS) + { + TCHAR * szPatchChain = NULL; + DWORD cbPatchChain = 0; + + // Get the patch chain + SFileGetFileInfo(hFile, SFILE_INFO_PATCH_CHAIN, szPatchChain, cbPatchChain, &cbPatchChain); + szPatchChain = (TCHAR *)(new BYTE[cbPatchChain]); + SFileGetFileInfo(hFile, SFILE_INFO_PATCH_CHAIN, szPatchChain, cbPatchChain, &cbPatchChain); + delete [] szPatchChain; + + // Get the size of the full patched file + dwFileSize = SFileGetFileSize(hFile, NULL); + if(dwFileSize != 0) + { + DWORD dwBytesRead = 0; + BYTE TempData[0x100]; + + SFileReadFile(hFile, TempData, sizeof(TempData), &dwBytesRead); + SFileSetFilePointer(hFile, 0, NULL, FILE_BEGIN); + + // Allocate space for the full file + pbFullFile = new BYTE[dwFileSize]; + if(pbFullFile != NULL) + { + if(!SFileReadFile(hFile, pbFullFile, dwFileSize)) + { + nError = GetLastError(); + printf("Failed to read full patched file data \"%s\"\n", szFileName); + } + + if(nError == ERROR_SUCCESS) + { + MergeLocalPath(szLocFileName, MAKE_PATH("Work//"), GetPlainFileNameA(szFileName)); + pStream = FileStream_CreateFile(szLocFileName); + if(pStream != NULL) + { + FileStream_Write(pStream, NULL, pbFullFile, dwFileSize); + FileStream_Close(pStream); + } + } + + delete [] pbFullFile; + } + } + } + + // Close handles + if(hFile != NULL) + SFileCloseFile(hFile); + if(hMpq != NULL) + SFileCloseArchive(hMpq); + return nError; +} + +//----------------------------------------------------------------------------- +// Main +// + +int main(void) +{ + int nError = ERROR_SUCCESS; + +#if defined(_MSC_VER) && defined(_DEBUG) + _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); +#endif // defined(_MSC_VER) && defined(_DEBUG) + +// FileStream_OpenEncrypted(_T("e:\\Multimedia\\MPQs\\2010 - Starcraft II\\Installer UI 2 deDE.MPQE")); + + // Mix the random number generator +// srand(GetTickCount()); + + // Test structure sizes +// if(nError == ERROR_SUCCESS) +// nError = TestStructureSizes(); + +// if(nError == ERROR_SUCCESS) +// nError = TestOpenLocalFile("C:\\autoexec.bat"); + + // Test reading partial file +// if(nError == ERROR_SUCCESS) +// nError = TestPartFileRead(MAKE_PATH("2009 - PartialMPQs/patch.MPQ.part")); + + // Test LZMA compression method against the code ripped from Starcraft II +// if(nError == ERROR_SUCCESS) +// nError = CompareLzmaCompressions(MPQ_SECTOR_SIZE); + + // Test compression methods +// if(nError == ERROR_SUCCESS) +// nError = TestSectorCompress(MPQ_SECTOR_SIZE); + + // Test the archive open and close + if(nError == ERROR_SUCCESS) + nError = TestArchiveOpenAndClose(MAKE_PATH("2011 - WoW/15050/world.MPQ")); +// nError = TestArchiveOpenAndClose(MAKE_PATH("2011 - WoW BETA/wow-update-13202.MPQ")); +// nError = TestArchiveOpenAndClose(MAKE_PATH("2002 - Warcraft III/ProtectedMap_HashTable_FakeValid.w3x")); +// nError = TestArchiveOpenAndClose(MAKE_PATH("2010 - Starcraft II/Installer Tome 1 enGB.MPQE")); +// nError = TestArchiveOpenAndClose(MAKE_PATH("1997 - Diablo I/DIABDAT_orig.MPQ")); +// nError = TestArchiveOpenAndClose(MAKE_PATH("2004 - World of Warcraft/SoundCache-enUS.MPQ")); +// nError = TestArchiveOpenAndClose(MAKE_PATH("smpq.mpq ")); + +// if(nError == ERROR_SUCCESS) +// nError = TestFindFiles(MAKE_PATH("2002 - Warcraft III/HumanEd.mpq")); + + // Create a big MPQ archive +// if(nError == ERROR_SUCCESS) +// nError = TestCreateArchive_PaliRoharBug(MAKE_PATH("Test.mpq")); +// nError = TestCreateArchive(MAKE_PATH("Test.mpq")); +// nError = TestCreateArchive((const TCHAR*)szUnicodeName1); +// nError = TestCreateArchive((const TCHAR*)szUnicodeName2); +// nError = TestCreateArchive((const TCHAR*)szUnicodeName3); +// nError = TestCreateArchive((const TCHAR*)szUnicodeName4); +// nError = TestCreateArchive((const TCHAR*)szUnicodeName5); +// nError = TestCreateArchive((const TCHAR*)szUnicodeName6); + +// if(nError == ERROR_SUCCESS) +// nError = TestAddFilesToMpq(MAKE_PATH("wow-update-13202.MPQ"), +// "c:\\Tools32\\Arj32.exe", +// "c:\\Tools32\\autoruns.chm", +// "c:\\Tools32\\CPUEater.exe", +// "c:\\Tools32\\dumpbin.exe", +// "c:\\Tools32\\editbin.exe", +// "c:\\Tools32\\fsg.ini", +// "c:\\Tools32\\hiew8.ini", +// "c:\\Tools32\\ida.bat", +// "c:\\Tools32\\mp3.ini", +// NULL); + +// if(nError == ERROR_SUCCESS) +// nError = TestCreateArchiveFromMemory(MAKE_PATH("Test-leak.mpq")); + +// if(nError == ERROR_SUCCESS) +// nError = TestFileReadAndWrite(MAKE_PATH("2002 - Warcraft III/(10)DustwallowKeys.w3m"), "war3map.j"); + + // Verify the archive signature +// if(nError == ERROR_SUCCESS) +// nError = TestSignatureVerify(MAKE_PATH("1998 - Starcraft/BW-1152.exe")); +// nError = TestSignatureVerify(MAKE_PATH("2002 - Warcraft III/(10)DustwallowKeys.w3m")); +// nError = TestSignatureVerify(MAKE_PATH("2002 - Warcraft III/War3TFT_121b_English.exe")); +// nError = TestSignatureVerify(MAKE_PATH("2004 - World of Warcraft/WoW-2.3.3.7799-to-2.4.0.8089-enUS-patch.exe")); +// nError = TestSignatureVerify(MAKE_PATH("2004 - World of Warcraft/standalone.MPQ")); + + // Compact the archive +// if(nError == ERROR_SUCCESS) +// nError = TestMpqCompacting(MAKE_PATH("wow-update-base-14333.MPQ")); + + // Create copy of the archive, appending some bytes before the MPQ header +// if(nError == ERROR_SUCCESS) +// nError = TestCreateArchiveCopy(MAKE_PATH("PartialMPQs/interface.MPQ.part"), MAKE_PATH("PartialMPQs/interface-copy.MPQ.part"), NULL); +/* + if(nError == ERROR_SUCCESS) + { + nError = TestCompareTwoArchives(MAKE_PATH("2011 - WoW-Cataclysm/wow-update-13189.MPQ"), + MAKE_PATH("wow-update-13189.MPQ"), + NULL, + 0x1001); + } +*/ + + if(nError == ERROR_SUCCESS) + { + nError = TestOpenPatchedArchive(MAKE_PATH("2004 - Wow 3.x/lichking.MPQ"), + MAKE_PATH("2011 - WoW 4.x/wow-update-13287.MPQ"), + NULL); +/* + nError = TestOpenPatchedArchive(MAKE_PATH("2011 - WoW 4.x/locale-enGB.MPQ"), + MAKE_PATH("2011 - WoW 4.x/wow-update-13164.MPQ"), + MAKE_PATH("2011 - WoW 4.x/wow-update-13205.MPQ"), + MAKE_PATH("2011 - WoW 4.x/wow-update-13287.MPQ"), + MAKE_PATH("2011 - WoW 4.x/wow-update-13329.MPQ"), + MAKE_PATH("2011 - WoW 4.x/wow-update-13596.MPQ"), + MAKE_PATH("2011 - WoW 4.x/wow-update-13623.MPQ"), + MAKE_PATH("2011 - WoW 4.x/wow-update-enGB-13914.MPQ"), + MAKE_PATH("2011 - WoW 4.x/wow-update-enGB-14007.MPQ"), + MAKE_PATH("2011 - WoW 4.x/wow-update-enGB-14333.MPQ"), + MAKE_PATH("2011 - WoW 4.x/wow-update-enGB-14480.MPQ"), + NULL); +*/ + } + + // Remove the working directory + clreol(); + if(nError != ERROR_SUCCESS) + printf("One or more errors occurred when testing StormLib\n"); + + printf("Work complete.\n"); + return nError; +} diff --git a/dep/StormLib/test/x86_ripped_code.asm b/dep/StormLib/test/x86_ripped_code.asm new file mode 100644 index 00000000000..4b4be328a6c --- /dev/null +++ b/dep/StormLib/test/x86_ripped_code.asm @@ -0,0 +1,1231 @@ +.686P +.MODEL FLAT +ASSUME FS: NOTHING +.CODE + +extrn _memset:PROC +extrn _memcpy:PROC +extrn _memmove:PROC + +;------------------------------------------------------------------------------ +; Structures +; + +;------------------------------------------------------------------------------ +; Functions +; + +_aullrem proc near ; CODE XREF: sub_6CC140+3Ap + ; sub_6CC1E0+57p ... + +DividendLo = dword ptr 8 +DividendHi = dword ptr 0Ch +DivisorLo = dword ptr 10h +DivisorHi = dword ptr 14h + + push ebx + mov eax, [esp+DivisorHi] + or eax, eax + jnz short loc_8F8FE1 + mov ecx, [esp+DivisorLo] + mov eax, [esp+DividendHi] + xor edx, edx + div ecx + mov eax, [esp+DividendLo] + div ecx + mov eax, edx + xor edx, edx + jmp short loc_8F9031 +; --------------------------------------------------------------------------- + +loc_8F8FE1: ; CODE XREF: _aullrem+7j + mov ecx, eax + mov ebx, [esp+DivisorLo] + mov edx, [esp+DividendHi] + mov eax, [esp+DividendLo] + +loc_8F8FEF: ; CODE XREF: _aullrem+39j + shr ecx, 1 + rcr ebx, 1 + shr edx, 1 + rcr eax, 1 + or ecx, ecx + jnz short loc_8F8FEF + div ebx + mov ecx, eax + mul [esp+DivisorHi] + xchg eax, ecx + mul [esp+DivisorLo] + add edx, ecx + jb short loc_8F901A + cmp edx, [esp+DividendHi] + ja short loc_8F901A + jb short loc_8F9022 + cmp eax, [esp+DividendLo] + jbe short loc_8F9022 + +loc_8F901A: ; CODE XREF: _aullrem+4Aj + ; _aullrem+50j + sub eax, [esp+DivisorLo] + sbb edx, [esp+DivisorHi] + +loc_8F9022: ; CODE XREF: _aullrem+52j + ; _aullrem+58j + sub eax, [esp+DividendLo] + sbb edx, [esp+DividendHi] + neg edx + neg eax + sbb edx, 0 + +loc_8F9031: ; CODE XREF: _aullrem+1Fj + pop ebx + retn 10h +_aullrem endp + +_aullshr proc near ; CODE XREF: sub_40E2B6+1ECp + ; sub_40E2B6+240p ... + cmp cl, 40h + jnb short loc_414BDA + cmp cl, 20h + jnb short loc_414BD0 + shrd eax, edx, cl + shr edx, cl + retn +; --------------------------------------------------------------------------- + +loc_414BD0: ; CODE XREF: _aullshr+8j + mov eax, edx + xor edx, edx + and cl, 1Fh + shr eax, cl + retn +; --------------------------------------------------------------------------- + +loc_414BDA: ; CODE XREF: _aullshr+3j + xor eax, eax + xor edx, edx + retn +_aullshr endp + + +; =============== S U B R O U T I N E ======================================= + +; Attributes: bp-based frame + +SFileDecryptMpqHeader proc near ; CODE XREF: sub_6D00E0+AEp + ; sub_6D00E0+D3p + +EncryptedDataAligned= dword ptr -88h +var_48 = dword ptr -48h +DecryptBuffer = dword ptr -44h +var_40 = dword ptr -40h +var_3C = dword ptr -3Ch +var_38 = dword ptr -38h +var_34 = dword ptr -34h +var_30 = dword ptr -30h +var_2C = dword ptr -2Ch +var_28 = dword ptr -28h +var_24 = dword ptr -24h +var_20 = dword ptr -20h +var_1C = dword ptr -1Ch +var_18 = dword ptr -18h +var_14 = dword ptr -14h +var_10 = dword ptr -10h +var_0C = dword ptr -0Ch +var_8 = dword ptr -8 +var_4 = dword ptr -4 +arg_FFFFFFF8 = dword ptr 0 +arg_FFFFFFFC = dword ptr 4 +arg_0 = dword ptr 8 + + push ebp + mov ebp, esp + sub esp, 88h + mov eax, [ecx+8] + mov edx, [ecx+14h] + push ebx + mov ebx, [ecx+10h] + mov [ebp+var_0C], eax + mov eax, [ebp+arg_0] + push esi + push edi + mov edi, [ecx+0Ch] + mov [ebp+DecryptBuffer], ecx + mov [ebp+var_10], edx + test al, 3 + jz short loc_6C9F03 + mov ecx, [eax] + mov [ebp+EncryptedDataAligned], ecx + mov ecx, [eax+4] + mov [ebp+EncryptedDataAligned+4], ecx + mov ecx, [eax+8] + mov [ebp+EncryptedDataAligned+8], ecx + mov ecx, [eax+0Ch] + mov [ebp+EncryptedDataAligned+0Ch], ecx + mov ecx, [eax+10h] + mov [ebp+EncryptedDataAligned+10h], ecx + mov ecx, [eax+14h] + mov [ebp+EncryptedDataAligned+14h], ecx + mov ecx, [eax+18h] + mov [ebp+EncryptedDataAligned+18h], ecx + mov ecx, [eax+1Ch] + mov [ebp+EncryptedDataAligned+1Ch], ecx + mov ecx, [eax+20h] + mov [ebp+EncryptedDataAligned+20h], ecx + mov ecx, [eax+24h] + mov [ebp+EncryptedDataAligned+24h], ecx + mov ecx, [eax+28h] + mov [ebp+EncryptedDataAligned+28h], ecx + mov ecx, [eax+2Ch] + mov [ebp+EncryptedDataAligned+2Ch], ecx + mov ecx, [eax+30h] + mov [ebp+EncryptedDataAligned+30h], ecx + mov ecx, [eax+34h] + mov [ebp+EncryptedDataAligned+34h], ecx + mov ecx, [eax+38h] + mov eax, [eax+3Ch] + mov [ebp+EncryptedDataAligned+3Ch], eax + mov [ebp+EncryptedDataAligned+38h], ecx + lea eax, [ebp+EncryptedDataAligned] + +loc_6C9F03: ; CODE XREF: SFileDecryptMpqHeader+26j + mov ecx, [eax] + mov [ebp+var_30], ecx + mov esi, edi + not esi + and esi, edx + mov edx, ebx + and edx, edi + or esi, edx + add esi, ecx + mov ecx, [ebp+var_0C] + lea edx, [esi+ecx-28955B88h] + mov ecx, [eax+4] + rol edx, 7 + add edx, edi + mov [ebp+var_2C], ecx + mov ecx, edx + not ecx + and ecx, ebx + mov esi, edi + and esi, edx + or ecx, esi + add ecx, [ebp+var_2C] + mov esi, [ebp+var_10] + lea esi, [ecx+esi-173848AAh] + mov ecx, [eax+8] + mov [ebp+var_40], ecx + rol esi, 0Ch + add esi, edx + mov ecx, esi + not ecx + and ecx, edi + mov edi, esi + and edi, edx + or ecx, edi + add ecx, [ebp+var_40] + lea edi, [ecx+ebx+242070DBh] + mov ecx, [eax+0Ch] + ror edi, 0Fh + add edi, esi + mov [ebp+var_1C], ecx + mov ebx, edi + not ebx + and ebx, edx + mov ecx, esi + and ecx, edi + or ebx, ecx + add ebx, [ebp+var_1C] + mov ecx, [ebp+DecryptBuffer] + mov ecx, [ecx+0Ch] + lea ecx, [ebx+ecx-3E423112h] + ror ecx, 0Ah + add ecx, edi + mov [ebp+var_4], edi + and edi, ecx + mov ebx, ecx + not ebx + and ebx, esi + or ebx, edi + mov edi, [eax+10h] + add ebx, edi + lea edx, [ebx+edx-0A83F051h] + rol edx, 7 + add edx, ecx + mov [ebp+arg_0], edx + not edx + and edx, [ebp+var_4] + mov ebx, ecx + and ebx, [ebp+arg_0] + mov [ebp+var_10], edi + mov edi, [eax+14h] + or edx, ebx + add edx, edi + lea esi, [edx+esi+4787C62Ah] + mov edx, [eax+18h] + mov [ebp+var_34], edi + mov edi, [ebp+arg_0] + rol esi, 0Ch + add esi, edi + mov [ebp+var_20], edx + mov edx, esi + not edx + and edx, ecx + mov ebx, esi + and ebx, edi + or edx, ebx + add edx, [ebp+var_20] + mov ebx, [ebp+var_4] + lea edx, [edx+ebx-57CFB9EDh] + ror edx, 0Fh + add edx, esi + mov ebx, edx + not ebx + and ebx, edi + mov edi, esi + and edi, edx + or ebx, edi + mov edi, [eax+1Ch] + add ebx, edi + lea ecx, [ebx+ecx-2B96AFFh] + ror ecx, 0Ah + add ecx, edx + mov [ebp+var_3C], edi + mov edi, [eax+20h] + mov [ebp+var_14], edi + mov edi, ecx + not edi + and edi, esi + mov ebx, edx + and ebx, ecx + or edi, ebx + add edi, [ebp+var_14] + mov ebx, [ebp+arg_0] + lea edi, [edi+ebx+698098D8h] + mov [ebp+var_8], ecx + rol edi, 7 + add edi, ecx + and ecx, edi + mov ebx, edi + not ebx + and ebx, edx + or ebx, ecx + mov ecx, [eax+24h] + add ebx, ecx + mov [ebp+var_0C], ecx + mov ecx, [eax+28h] + lea esi, [ebx+esi-74BB0851h] + mov [ebp+var_24], ecx + rol esi, 0Ch + add esi, edi + mov ecx, esi + not ecx + and ecx, [ebp+var_8] + mov ebx, esi + and ebx, edi + or ecx, ebx + add ecx, [ebp+var_24] + mov ebx, esi + lea edx, [ecx+edx-0A44Fh] + mov ecx, [eax+2Ch] + ror edx, 0Fh + add edx, esi + mov [ebp+var_18], ecx + and ebx, edx + mov ecx, edx + not ecx + and ecx, edi + or ecx, ebx + add ecx, [ebp+var_18] + mov ebx, [ebp+var_8] + lea ecx, [ecx+ebx-76A32842h] + ror ecx, 0Ah + add ecx, edx + mov ebx, ecx + not ebx + mov [ebp+var_4], edx + and edx, ecx + and ebx, esi + or ebx, edx + mov edx, [eax+30h] + add ebx, edx + mov [ebp+var_38], edx + lea edi, [ebx+edi+6B901122h] + mov edx, [eax+34h] + rol edi, 7 + add edi, ecx + mov [ebp+arg_0], edi + not edi + and edi, [ebp+var_4] + mov ebx, ecx + and ebx, [ebp+arg_0] + mov [ebp+var_8], edx + or edi, ebx + add edi, edx + mov edx, [eax+38h] + mov eax, [eax+3Ch] + lea esi, [edi+esi-2678E6Dh] + rol esi, 0Ch + add esi, [ebp+arg_0] + mov [ebp+var_28], edx + mov edi, esi + not edi + mov edx, edi + and edx, ecx + mov ebx, esi + and ebx, [ebp+arg_0] + or edx, ebx + add edx, [ebp+var_28] + mov ebx, [ebp+var_4] + lea edx, [edx+ebx-5986BC72h] + mov [ebp+var_4], eax + ror edx, 0Fh + add edx, esi + mov ebx, edx + not ebx + mov [ebp+var_48], ebx + and ebx, [ebp+arg_0] + mov eax, esi + and eax, edx + or ebx, eax + add ebx, [ebp+var_4] + and edi, edx + lea ecx, [ebx+ecx+49B40821h] + ror ecx, 0Ah + add ecx, edx + mov eax, esi + and eax, ecx + or edi, eax + add edi, [ebp+var_2C] + mov eax, [ebp+arg_0] + lea edi, [edi+eax-9E1DA9Eh] + mov eax, [ebp+var_48] + and eax, ecx + rol edi, 5 + add edi, ecx + mov ebx, edx + and ebx, edi + or eax, ebx + add eax, [ebp+var_20] + lea esi, [eax+esi-3FBF4CC0h] + rol esi, 9 + add esi, edi + mov eax, ecx + not eax + and eax, edi + mov ebx, esi + and ebx, ecx + or eax, ebx + add eax, [ebp+var_18] + lea edx, [eax+edx+265E5A51h] + rol edx, 0Eh + add edx, esi + mov eax, edi + not eax + and eax, esi + mov ebx, edx + and ebx, edi + or eax, ebx + add eax, [ebp+var_30] + lea ecx, [eax+ecx-16493856h] + ror ecx, 0Ch + mov eax, esi + add ecx, edx + not eax + and eax, edx + mov ebx, esi + and ebx, ecx + or eax, ebx + add eax, [ebp+var_34] + lea edi, [eax+edi-29D0EFA3h] + rol edi, 5 + add edi, ecx + mov [ebp+arg_0], edi + mov eax, edx + not eax + and eax, ecx + mov edi, edx + and edi, [ebp+arg_0] + or eax, edi + add eax, [ebp+var_24] + mov edi, ecx + lea esi, [eax+esi+2441453h] + mov eax, [ebp+arg_0] + not edi + and edi, eax + rol esi, 9 + add esi, eax + not eax + and eax, esi + mov ebx, esi + and ebx, ecx + or edi, ebx + add edi, [ebp+var_4] + lea edx, [edi+edx-275E197Fh] + rol edx, 0Eh + add edx, esi + mov edi, edx + and edi, [ebp+arg_0] + or eax, edi + add eax, [ebp+var_10] + mov edi, esi + lea ecx, [eax+ecx-182C0438h] + ror ecx, 0Ch + add ecx, edx + and edi, ecx + mov eax, esi + not eax + and eax, edx + or eax, edi + add eax, [ebp+var_0C] + mov edi, [ebp+arg_0] + lea eax, [eax+edi+21E1CDE6h] + rol eax, 5 + add eax, ecx + mov [ebp+arg_0], eax + mov eax, edx + not eax + and eax, ecx + mov edi, edx + and edi, [ebp+arg_0] + or eax, edi + add eax, [ebp+var_28] + mov edi, ecx + lea esi, [eax+esi-3CC8F82Ah] + mov eax, [ebp+arg_0] + rol esi, 9 + add esi, eax + not edi + and edi, eax + mov ebx, esi + and ebx, ecx + or edi, ebx + add edi, [ebp+var_1C] + not eax + lea edx, [edi+edx-0B2AF279h] + rol edx, 0Eh + add edx, esi + and eax, esi + mov edi, edx + and edi, [ebp+arg_0] + or eax, edi + add eax, [ebp+var_14] + lea ecx, [eax+ecx+455A14EDh] + ror ecx, 0Ch + add ecx, edx + mov eax, esi + not eax + and eax, edx + mov edi, esi + and edi, ecx + or eax, edi + add eax, [ebp+var_8] + mov edi, [ebp+arg_0] + lea eax, [eax+edi-561C16FBh] + rol eax, 5 + add eax, ecx + mov [ebp+arg_0], eax + mov eax, edx + not eax + and eax, ecx + mov edi, edx + and edi, [ebp+arg_0] + or eax, edi + add eax, [ebp+var_40] + mov edi, ecx + lea esi, [eax+esi-3105C08h] + mov eax, [ebp+arg_0] + not edi + and edi, eax + rol esi, 9 + add esi, eax + mov ebx, esi + and ebx, ecx + or edi, ebx + add edi, [ebp+var_3C] + not eax + lea edx, [edi+edx+676F02D9h] + and eax, esi + rol edx, 0Eh + add edx, esi + mov edi, edx + and edi, [ebp+arg_0] + or eax, edi + add eax, [ebp+var_38] + mov edi, [ebp+arg_0] + lea ecx, [eax+ecx-72D5B376h] + ror ecx, 0Ch + add ecx, edx + mov eax, esi + xor eax, edx + xor eax, ecx + add eax, [ebp+var_34] + lea eax, [eax+edi-5C6BEh] + rol eax, 4 + add eax, ecx + mov edi, edx + xor edi, ecx + xor edi, eax + add edi, [ebp+var_14] + lea esi, [edi+esi-788E097Fh] + rol esi, 0Bh + add esi, eax + mov edi, esi + xor edi, ecx + xor edi, eax + add edi, [ebp+var_18] + lea edx, [edi+edx+6D9D6122h] + rol edx, 10h + add edx, esi + mov edi, esi + xor edi, edx + mov ebx, edi + xor ebx, eax + add ebx, [ebp+var_28] + lea ecx, [ebx+ecx-21AC7F4h] + ror ecx, 9 + add ecx, edx + xor edi, ecx + add edi, [ebp+var_2C] + lea eax, [edi+eax-5B4115BCh] + rol eax, 4 + mov edi, edx + add eax, ecx + xor edi, ecx + xor edi, eax + add edi, [ebp+var_10] + lea esi, [edi+esi+4BDECFA9h] + rol esi, 0Bh + add esi, eax + mov edi, esi + xor edi, ecx + xor edi, eax + add edi, [ebp+var_3C] + lea edx, [edi+edx-944B4A0h] + rol edx, 10h + add edx, esi + mov edi, esi + xor edi, edx + mov ebx, edi + xor ebx, eax + add ebx, [ebp+var_24] + lea ecx, [ebx+ecx-41404390h] + ror ecx, 9 + add ecx, edx + xor edi, ecx + add edi, [ebp+var_8] + lea eax, [edi+eax+289B7EC6h] + rol eax, 4 + add eax, ecx + mov edi, edx + xor edi, ecx + xor edi, eax + add edi, [ebp+var_30] + lea esi, [edi+esi-155ED806h] + rol esi, 0Bh + add esi, eax + mov edi, esi + xor edi, ecx + xor edi, eax + add edi, [ebp+var_1C] + lea edi, [edi+edx-2B10CF7Bh] + rol edi, 10h + add edi, esi + mov edx, esi + xor edx, edi + mov ebx, edx + xor ebx, eax + add ebx, [ebp+var_20] + lea ecx, [ebx+ecx+4881D05h] + ror ecx, 9 + add ecx, edi + xor edx, ecx + add edx, [ebp+var_0C] + lea eax, [edx+eax-262B2FC7h] + rol eax, 4 + add eax, ecx + mov edx, edi + xor edx, ecx + xor edx, eax + add edx, [ebp+var_38] + lea edx, [edx+esi-1924661Bh] + rol edx, 0Bh + add edx, eax + mov esi, edx + xor esi, ecx + xor esi, eax + add esi, [ebp+var_4] + mov ebx, edx + lea esi, [esi+edi+1FA27CF8h] + mov edi, [ebp+var_40] + rol esi, 10h + add esi, edx + xor ebx, esi + xor ebx, eax + add ebx, edi + lea ecx, [ebx+ecx-3B53A99Bh] + ror ecx, 9 + add ecx, esi + mov ebx, edx + not ebx + or ebx, ecx + xor ebx, esi + add ebx, [ebp+var_30] + lea eax, [ebx+eax-0BD6DDBCh] + rol eax, 6 + add eax, ecx + mov ebx, esi + not ebx + or ebx, eax + xor ebx, ecx + add ebx, [ebp+var_3C] + lea edx, [ebx+edx+432AFF97h] + rol edx, 0Ah + add edx, eax + mov ebx, ecx + not ebx + or ebx, edx + xor ebx, eax + add ebx, [ebp+var_28] + lea esi, [ebx+esi-546BDC59h] + rol esi, 0Fh + add esi, edx + mov ebx, eax + not ebx + or ebx, esi + xor ebx, edx + add ebx, [ebp+var_34] + lea ecx, [ebx+ecx-36C5FC7h] + ror ecx, 0Bh + add ecx, esi + mov ebx, edx + not ebx + or ebx, ecx + xor ebx, esi + add ebx, [ebp+var_38] + lea eax, [ebx+eax+655B59C3h] + rol eax, 6 + add eax, ecx + mov ebx, esi + not ebx + or ebx, eax + xor ebx, ecx + add ebx, [ebp+var_1C] + lea edx, [ebx+edx-70F3336Eh] + rol edx, 0Ah + add edx, eax + mov ebx, ecx + not ebx + or ebx, edx + xor ebx, eax + add ebx, [ebp+var_24] + lea esi, [ebx+esi-100B83h] + rol esi, 0Fh + add esi, edx + mov ebx, eax + not ebx + or ebx, esi + xor ebx, edx + add ebx, [ebp+var_2C] + lea ecx, [ebx+ecx-7A7BA22Fh] + ror ecx, 0Bh + add ecx, esi + mov ebx, edx + not ebx + or ebx, ecx + xor ebx, esi + add ebx, [ebp+var_14] + lea eax, [ebx+eax+6FA87E4Fh] + rol eax, 6 + add eax, ecx + mov ebx, esi + not ebx + or ebx, eax + xor ebx, ecx + add ebx, [ebp+var_4] + lea edx, [ebx+edx-1D31920h] + rol edx, 0Ah + add edx, eax + mov ebx, ecx + not ebx + or ebx, edx + xor ebx, eax + add ebx, [ebp+var_20] + lea esi, [ebx+esi-5CFEBCECh] + rol esi, 0Fh + mov ebx, eax + add esi, edx + not ebx + or ebx, esi + xor ebx, edx + add ebx, [ebp+var_8] + lea ecx, [ebx+ecx+4E0811A1h] + ror ecx, 0Bh + add ecx, esi + mov ebx, edx + not ebx + or ebx, ecx + xor ebx, esi + add ebx, [ebp+var_10] + lea eax, [ebx+eax-8AC817Eh] + rol eax, 6 + add eax, ecx + mov ebx, esi + not ebx + or ebx, eax + xor ebx, ecx + add ebx, [ebp+var_18] + lea edx, [ebx+edx-42C50DCBh] + rol edx, 0Ah + add edx, eax + mov ebx, ecx + not ebx + or ebx, edx + xor ebx, eax + add ebx, edi + lea esi, [ebx+esi+2AD7D2BBh] + mov edi, eax + not edi + rol esi, 0Fh + add esi, edx + or edi, esi + xor edi, edx + add edi, [ebp+var_0C] + lea edi, [edi+ecx-14792C6Fh] + mov ecx, [ebp+DecryptBuffer] + mov ebx, [ecx+8] + add ebx, eax + mov eax, [ecx+10h] + ror edi, 0Bh + add edi, [ecx+0Ch] + add eax, esi + add edi, esi + mov [ecx+10h], eax + mov eax, [ecx+14h] + mov [ecx+0Ch], edi + pop edi + add eax, edx + pop esi + mov [ecx+8], ebx + mov [ecx+14h], eax + pop ebx + mov esp, ebp + pop ebp + retn 4 +SFileDecryptMpqHeader endp + +; --------------------------------------------------------------------------- + +; --------------------------------------------------------------------------- + +sub_6D00E0 proc near ; CODE XREF: sub_6D0210+59p + ; sub_6D0210+66p ... + +var_10 = dword ptr -10h +pbMpqHeader = dword ptr -4 +pMpqHeader = dword ptr 8 +dwSize = dword ptr 0Ch + + push ebp + mov ebp, esp + push ecx + mov eax, [ebp+pMpqHeader] ; EAX = MPQ Header + push ebx + mov ebx, [ebp+dwSize] ; EBX - size of MPQ Header + push esi + push edi + mov esi, ecx ; ESI - decryption buffer (6 DWORDs) + mov edi, [esi] + shr edi, 3 + and edi, 3Fh + mov [ebp+pbMpqHeader], eax + lea ecx, ds:0[ebx*8] ; ECX = sizeof header * 8 + test ebx, ebx + jbe loc_6D01F8 + add [esi], ecx + mov edx, ebx ; EDX = size of header + shr edx, 1Dh + add [esi+4], edx + mov edx, [esi+4] + cmp [esi], ecx + jnb short loc_6D011E + inc edx + mov [esi+4], edx + +loc_6D011E: ; CODE XREF: sub_6D00E0+38j + test edi, edi + jz short loc_6D0196 + lea eax, [edi+ebx] + cmp eax, 40h + jbe short loc_6D0136 + mov eax, 40h + sub eax, edi + mov [ebp+dwSize], eax + jmp short loc_6D013B +; --------------------------------------------------------------------------- + +loc_6D0136: ; CODE XREF: sub_6D00E0+48j + mov [ebp+dwSize], ebx + mov eax, ebx + +loc_6D013B: ; CODE XREF: sub_6D00E0+54j + mov edx, [ebp+pMpqHeader] + add edx, eax + lea ecx, [edi+esi+18h] + mov [ebp+pbMpqHeader], edx + cmp ecx, edx + jnb short loc_6D0163 + lea edx, [ecx+eax] + mov ecx, [ebp+pMpqHeader] + cmp edx, ecx + jbe short loc_6D0166 + push eax + push ecx + lea eax, [edi+esi+18h] + push eax + call _memmove + jmp short loc_6D0172 +; --------------------------------------------------------------------------- + +loc_6D0163: ; CODE XREF: sub_6D00E0+69j + mov ecx, [ebp+pMpqHeader] + +loc_6D0166: ; CODE XREF: sub_6D00E0+73j + push eax + push ecx + lea eax, [edi+esi+18h] + push eax + call _memcpy + +loc_6D0172: ; CODE XREF: sub_6D00E0+81j + mov eax, [ebp+dwSize] + lea ecx, [eax+edi] + add esp, 0Ch + cmp ecx, 40h + jl short loc_6D01F8 + mov edx, [ebp+pbMpqHeader] + sub ebx, eax + lea eax, [esi+18h] + push eax + mov ecx, esi + mov [ebp+pbMpqHeader], edx + call SFileDecryptMpqHeader + mov eax, [ebp+pbMpqHeader] + +loc_6D0196: ; CODE XREF: sub_6D00E0+40j + cmp ebx, 40h + jl short loc_6D01C4 + mov edi, ebx + shr edi, 6 + mov ecx, edi + neg ecx + shl ecx, 6 + add ebx, ecx + lea esp, [esp+0] + +loc_6D01B0: ; CODE XREF: sub_6D00E0+E2j + push eax + mov ecx, esi + call SFileDecryptMpqHeader + add [ebp+pbMpqHeader], 40h + sub edi, 1 + mov eax, [ebp+pbMpqHeader] + jnz short loc_6D01B0 + +loc_6D01C4: ; CODE XREF: sub_6D00E0+B9j + test ebx, ebx + jz short loc_6D01F8 + add esi, 18h + lea edx, [ebx+eax] + cmp esi, edx + jnb short loc_6D01ED + lea ecx, [esi+ebx] + cmp ecx, eax + jbe short loc_6D01ED + push ebx + push eax + push esi + call _memmove + add esp, 0Ch + pop edi + pop esi + pop ebx + mov esp, ebp + pop ebp + retn 8 +; --------------------------------------------------------------------------- + +loc_6D01ED: ; CODE XREF: sub_6D00E0+F0j + ; sub_6D00E0+F7j + push ebx + push eax + push esi + call _memcpy + add esp, 0Ch + +loc_6D01F8: ; CODE XREF: sub_6D00E0+23j + ; sub_6D00E0+9Ej ... + pop edi + pop esi + pop ebx + mov esp, ebp + pop ebp + retn 8 +sub_6D00E0 endp + +aA_1: ; DATA XREF: sub_6249D0+68o + ; sub_6D0210+4Fo ... + dw 80h, 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + db 0 + +sub_6D0210 proc near ; CODE XREF: SFileVerifyMpqHeaderMD5+42p + ; sub_6D2D60+A9p ... + +var_8 = byte ptr -8 +var_6 = byte ptr -6 +var_5 = byte ptr -5 +var_4 = byte ptr -4 +var_3 = byte ptr -3 +var_2 = byte ptr -2 +var_1 = byte ptr -1 +arg_0 = dword ptr 8 + + push ebp + mov ebp, esp + sub esp, 8 + push esi + mov esi, ecx ; Source address + mov eax, [esi] + mov ecx, eax + shr ecx, 8 + mov [ebp-7], cl + mov ecx, eax + shr ecx, 18h + mov [ebp+var_5], cl + mov ecx, [esi+4] + mov edx, eax + shr edx, 10h + mov [ebp+var_6], dl + mov edx, ecx + mov [ebp+var_4], cl + shr edx, 8 + mov [ebp+var_3], dl + mov edx, ecx + shr ecx, 18h + mov [ebp+var_1], cl + mov [ebp+var_8], al + shr eax, 3 + mov ecx, 0FFFFFFF7h + sub ecx, eax + and ecx, 3Fh + push edi + inc ecx + push ecx + shr edx, 10h + push offset aA_1 ; "" + mov ecx, esi + mov [ebp+var_2], dl + call sub_6D00E0 + push 8 + lea edx, [ebp+var_8] + push edx + mov ecx, esi + call sub_6D00E0 + mov edi, [ebp+arg_0] + xor eax, eax + +loc_6D0280: ; CODE XREF: sub_6D0210+8Ej + mov ecx, eax + and ecx, 3 + add ecx, ecx + mov edx, eax + sar edx, 2 + mov edx, [esi+edx*4+8] + add ecx, ecx + add ecx, ecx + shr edx, cl + inc eax + cmp eax, 10h + mov [eax+edi-1], dl + jl short loc_6D0280 + pop edi + pop esi + mov esp, ebp + pop ebp + retn 4 +sub_6D0210 endp + + +sub_6CEBE0 proc near ; CODE XREF: sub_4A72D0+49p + ; SFileVerifyMpqHeaderMD5+51p ... + +var_4 = dword ptr -4 +arg_0 = dword ptr 8 + + push ebp + mov ebp, esp + mov edx, [ebp+arg_0] + mov eax, 10h + push esi + lea esp, [esp+0] + +loc_6CEBF0: ; CODE XREF: sub_6CEBE0+22j + mov esi, [ecx] + cmp esi, [edx] + jnz short loc_6CEC14 + sub eax, 4 + add edx, 4 + add ecx, 4 + cmp eax, 4 + jnb short loc_6CEBF0 + xor eax, eax + xor edx, edx + test eax, eax + setz dl + mov al, dl + pop esi + pop ebp + retn 4 +; --------------------------------------------------------------------------- + +loc_6CEC14: ; CODE XREF: sub_6CEBE0+14j + movzx eax, byte ptr [ecx] + movzx esi, byte ptr [edx] + sub eax, esi + jnz short loc_6CEC40 + movzx eax, byte ptr [ecx+1] + movzx esi, byte ptr [edx+1] + sub eax, esi + jnz short loc_6CEC40 + movzx eax, byte ptr [ecx+2] + movzx esi, byte ptr [edx+2] + sub eax, esi + jnz short loc_6CEC40 + movzx eax, byte ptr [ecx+3] + movzx ecx, byte ptr [edx+3] + sub eax, ecx + +loc_6CEC40: ; CODE XREF: sub_6CEBE0+3Cj + ; sub_6CEBE0+48j ... + sar eax, 1Fh + or eax, 1 + xor edx, edx + test eax, eax + setz dl + mov al, dl + pop esi + pop ebp + retn 4 +sub_6CEBE0 endp + +SFileVerifyMpqHeaderMD5 proc near ; CODE XREF: SFileVerifyMpqHeader+6Bp + +var_68 = dword ptr -68h +var_64 = dword ptr -64h +var_60 = dword ptr -60h +var_5C = dword ptr -5Ch +var_58 = dword ptr -58h +var_54 = dword ptr -54h +var_10 = dword ptr -10h + + push ebp + mov ebp, esp + sub esp, 68h + push esi + mov esi, eax ; ESI = pointer to MPQ Header + xor eax, eax + push 0C0h + push esi + lea ecx, [ebp+var_68] + mov [ebp+var_64], eax + mov [ebp+var_68], eax + mov [ebp+var_60], 67452301h + mov [ebp+var_5C], 0EFCDAB89h + mov [ebp+var_58], 98BADCFEh + mov [ebp+var_54], 10325476h + call sub_6D00E0 + lea eax, [ebp+var_10] + push eax + lea ecx, [ebp+var_68] + call sub_6D0210 + add esi, 0C0h + push esi + lea ecx, [ebp+var_10] + call sub_6CEBE0 + pop esi + mov esp, ebp + pop ebp + retn +SFileVerifyMpqHeaderMD5 endp + + +_wow_SFileVerifyMpqHeaderMD5 proc + push ebp + mov ebp, esp + mov eax, [ebp+8] + call SFileVerifyMpqHeaderMD5 + mov esp, ebp + pop ebp + retn +_wow_SFileVerifyMpqHeaderMD5 endp + +END diff --git a/dep/StormLib/test/x86_starcraft_lzma.asm b/dep/StormLib/test/x86_starcraft_lzma.asm new file mode 100644 index 00000000000..bb13200b432 --- /dev/null +++ b/dep/StormLib/test/x86_starcraft_lzma.asm @@ -0,0 +1,11066 @@ +; +; LZMA compression code ripped from Starctaft II BEta +; Used while StormLib's LZMA implementation was tested against Starcraft compression +; Not used in StormLib. +; + +.686P +.MODEL FLAT +ASSUME FS: NOTHING + +.DATA + +;--------------------------------------------------------------------------- +; Data + +byte_4CB248 db 0, 0Bh, 0Bh, 0Bh ; indirect table for switch statement + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 1, 2, 3, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 4, 5, 6, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 7, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 8, 9, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Bh, 0Bh, 0Bh, 0Bh + db 0Ah + align 10h + +dword_544960 dd 0BB40E64Eh ; DATA XREF: sub_401C72+B +dword_553598 dd ? ; DATA XREF: sub_4CB8A0+9 + +off_50CD3C dd offset sub_4A0605 ; DATA XREF: sub_4A05F7+1o + ; .data:off_52A004o ... +dword_50CD40 dd 0E06D7363h ; DATA XREF: _CxxThrowException(x,x)+Eo + dd 1 + dd 0 + dd 0 + dd 3 + dd 19930520h + dd 0 + dd 0 + +; --------------------------------------------------------------------------- + +off_546E20 dd offset sub_4CDD70 ; DATA XREF: sub_4D0270:loc_4D0324o +off_546E24 dd offset sub_4CDD90 ; DATA XREF: sub_4CF810+53r +off_546E28 dd offset off_50CD3C ; DATA XREF: .rdata:off_51B888o + dd 0 + db '.?AUISequentialInStream@@',0 + db 0 + db 0 +off_546E4C dd offset off_50CD3C ; DATA XREF: .rdata:off_51B8C0o + dd 0 + db '.?AUISequentialOutStream@@',0 + db 0 +off_546E70 dd offset off_50CD3C ; DATA XREF: .rdata:off_51B8F8o + dd 0 + db '.?AUICompressCoder@@',0 + db 0 + db 0 + db 0 +off_546E90 dd offset off_50CD3C ; DATA XREF: .rdata:off_51B944o + dd 0 + db '.?AUICompressSetOutStream@@',0 +off_546EB4 dd offset off_50CD3C ; DATA XREF: .rdata:0051B96Co + dd 0 + db '.?AUICompressSetCoderProperties@@',0 + db 0 + db 0 +off_546EE0 dd offset off_50CD3C ; DATA XREF: .rdata:0051B9B8o + dd 0 + db '.?AUICompressWriteCoderProperties@@',0 + dd offset off_50CD3C + dd 0 + db '.?AUCSystemException@@',0 + db 0 + dd offset off_50CD3C + dd 0 + db '.?AUCOutBufferException@@',0 + db 0 + db 0 +off_546F50 dd offset off_50CD3C ; DATA XREF: .rdata:0051BA04o + dd 0 + db '.?AVCInStreamMemory@@',0 + db 0 + db 0 +off_546F70 dd offset off_50CD3C ; DATA XREF: .rdata:off_51BA4Co + dd 0 + db '.?AVCMyUnknownImp@@',0 +off_546F8C dd offset off_50CD3C ; DATA XREF: .rdata:0051BAA8o + dd 0 + db '.?AVCOutStreamMemory@@',0 + db 0 +off_546FAC dd offset off_50CD3C ; DATA XREF: .rdata:0051BAFCo + dd 0 + db '.?AVCEncoder@NLZMA@NCompress@@',0 + db 0 +off_546FD4 dd offset off_50CD3C ; DATA XREF: .rdata:off_51BBECo + dd 0 + db '.?AVCBaseState@NLZMA@NCompress@@',0 + db 0 + db 0 + db 0 + +; --------------------------------------------------------------------------- + +dword_51B960 dd 0 ; DATA XREF: .rdata:00517A64o + dd 0 + dd 0 + dd offset off_546EB4 + dd 0 ; offset dword_51B974 + +dword_51B9AC dd 0 ; DATA XREF: .rdata:00517A78o + dd 0 + dd 0 + dd offset off_546EE0 + dd 0 ;offset dword_51B9C0 + +dword_51B9F8 dd 0 ; DATA XREF: .rdata:00517A8Co + dd 0 + dd 0 + dd offset off_546F50 + dd 0 ; offset dword_51BA0C + +dword_51BA9C dd 0 ; DATA XREF: .rdata:00517AA0o + dd 0 + dd 0 + dd offset off_546F8C + dd 0 ; offset dword_51BAB0 + +dword_51BAF0 dd 0 ; DATA XREF: .rdata:00517AF8o + dd 0 + dd 0 + dd offset off_546FAC + dd 0 ; offset dword_51BB04 + +dword_51BC58 dd 0 ; DATA XREF: .rdata:00517AE0o + dd 4 + dd 0 + dd offset off_546FAC + dd 0 ; offset dword_51BB04 + +dword_51BC6C dd 0 ; DATA XREF: .rdata:00517ACCo + dd 8 + dd 0 + dd offset off_546FAC + dd 0 ; offset dword_51BB04 + +dword_51BC80 dd 0 ; DATA XREF: .rdata:00517AB8o + dd 0Ch + dd 0 + dd offset off_546FAC + dd 0 ; offset dword_51BB04 + +; --------------------------------------------------------------------------- + +dword_512730 dd 0 ; DATA XREF: sub_48DB4D+B9o +dword_512734 dd 0 ; DATA XREF: CCmdTarget::GetInterface(void const *)+2Dr +dword_512738 dd 0C0h ; DATA XREF: CCmdTarget::GetInterface(void const *)+38r +dword_51273C dd 46000000h ; DATA XREF: CCmdTarget::GetInterface(void const *)+43r + +dword_5535A0 dd ? ; DATA XREF: sub_4CF900:loc_4CF94Co +dword_5535A4 dd ? ; DATA XREF: .text:004DAF37w +dword_5535A8 dd ? ; DATA XREF: .text:004DAF3Cw +dword_5535AC dd ? ; DATA XREF: .text:004DAF41w + +dword_5535B0 dd ? ; DATA XREF: sub_4CF900+5Eo +dword_5535B4 dd ? ; DATA XREF: .text:004DAF17w +dword_5535B8 dd ? ; DATA XREF: .text:004DAF1Cw +dword_5535BC dd ? ; DATA XREF: .text:004DAF21w + +dword_5535C0 dd ? ; DATA XREF: sub_4CF900:loc_4CF98Fo +dword_5535C4 dd ? ; DATA XREF: .text:004DAEF7w +dword_5535C8 dd ? ; DATA XREF: .text:004DAEFCw +dword_5535CC dd ? ; DATA XREF: .text:004DAF01w + + +dword_526DD0 dd 0 ; DATA XREF: .text:loc_4CF6CBo + dd 0 + dd 0 + dd 0 ; offset dword_526DE0 + +kLiteralNextStates db 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 4, 5 +kMatchNextStates db 7, 7, 7, 7, 7, 7, 7, 0Ah, 0Ah, 0Ah, 0Ah, 0Ah +kRepNextStates db 8, 8, 8, 8, 8, 8, 8, 0Bh, 0Bh, 0Bh, 0Bh, 0Bh +kShortRepNextStates db 9, 9, 9, 9, 9, 9, 9, 0Bh, 0Bh, 0Bh, 0Bh, 0Bh + +dword_550998 dd 200h dup(?) +dword_551198 dd 800h dup(?) +dword_553198 dd 100h dup(?) + +ICompressSetOutStream_vftable dd offset __purecall ; DATA XREF: NCompress_NLZMA_CEncoder_CEncoder+2o + dd offset __purecall + dd offset __purecall + dd offset __purecall + dd offset __purecall + dd offset dword_51B960 +ICompressSetCoderProperties_vftable dd offset __purecall ; DATA XREF: NCompress_NLZMA_CEncoder_CEncoder+9o + dd offset __purecall + dd offset __purecall + dd offset __purecall + dd offset dword_51B9AC +ICompressWriteCoderProperties_vftable dd offset __purecall ; DATA XREF: NCompress_NLZMA_CEncoder_CEncoder+10o + dd offset __purecall + dd offset __purecall + dd offset __purecall + dd offset dword_51B9F8 +off_517A90 dd offset Interface1_QueryInterface + dd offset Interface1_AddRef + dd offset Interface1_Release + dd offset sub_4CCB20 + dd offset dword_51BA9C +off_517AA4 dd offset Interface1_QueryInterface ; DATA XREF: sub_4CF610+Eo + dd offset Interface1_AddRef + dd offset Interface2_Release + dd offset sub_4CCB90 + dd offset sub_4CF590 + dd offset dword_51BC80 +NCompress_NLZMA_CEncoder_vftable_ICompressWriteCoderProperties dd offset sub_4CFA50 ; DATA XREF: sub_4CF810+3Do + dd offset sub_4CFA10 + dd offset sub_4CFA70 + dd offset sub_4CDDB0 + dd offset dword_51BC6C +NCompress_NLZMA_CEncoder_vftable_ICompressSetCoderProperties dd offset ICompressSetCoderProperties_QueryInterface ; DATA XREF: sub_4CF810+36o + dd offset ICompressSetCoderProperties_AddRef + dd offset ICompressSetCoderProperties_Release + dd offset ICompressSetCoderProperties_SetCoderProperties + dd offset dword_51BC58 +NCompress_NLZMA_CEncoder_vftable_ICompressSetOutStream dd offset sub_4CFA20 ; DATA XREF: sub_4CF810+2Fo + dd offset sub_4CFA80 + dd offset sub_4CFA40 + dd offset sub_4CFA90 + dd offset sub_4CDE70 + dd offset dword_51BAF0 +NCompress_NLZMA_CEncoder_vftable dd offset sub_4CF900 ; DATA XREF: sub_4CF810+29o + dd offset sub_4CF9D0 + dd offset sub_4CF9E0 + dd offset CEncoder_Code + dd offset sub_4D0250 + +.CODE + +extrn _operator_new:PROC +extrn __allshr: PROC +extrn _free: PROC +extrn _memcmp: PROC +extrn _memcpy: PROC +extrn _memset: PROC +extrn ___report_gsfailure: PROC +extrn __purecall: PROC +VirtualAlloc PROTO STDCALL :DWORD,:DWORD,:DWORD,:DWORD +VirtualFree PROTO STDCALL :DWORD,:DWORD,:DWORD + +; --------------------------------------------------------------------------- + +; void __cdecl j__free(void *Memory) +; 004843B8 +j__free proc near ; CODE XREF: sub_401048+16p + ; .text:004010CFp ... + jmp _free +j__free endp + + +; --------------------------------------------------------------------------- + +; int __cdecl unknown_libname_324(void *Buf1, void *Buf2) +unknown_libname_324 proc near +; sub_48B7BA + +Buf1 = dword ptr 4 +Buf2 = dword ptr 8 + + push 10h ; Size + push [esp+4+Buf2] ; Buf2 + push [esp+8+Buf1] ; Buf1 + call _memcmp + add esp, 0Ch + neg eax + sbb eax, eax + inc eax + retn +unknown_libname_324 endp + +; --------------------------------------------------------------------------- + +sub_4A05F7 proc near ; CODE XREF: sub_4A0605+3p + push ecx + mov dword ptr [ecx], offset off_50CD3C + call sub_4A98B8 + pop ecx + retn +sub_4A05F7 endp + +; --------------------------------------------------------------------------- + +; int __thiscall sub_4A0605(void *Memory, char) +sub_4A0605 proc near ; DATA XREF: .rdata:off_50CD3Co + +arg_0 = byte ptr 4 + + push esi + mov esi, ecx + call sub_4A05F7 + test [esp+4+arg_0], 1 + jz short loc_4A061B + push esi ; Memory + call j__free + pop ecx + +loc_4A061B: ; CODE XREF: sub_4A0605+Dj + mov eax, esi + pop esi + retn 4 +sub_4A0605 endp + +; --------------------------------------------------------------------------- + +sub_4A0686 proc near ; CODE XREF: sub_401C72+49p + ; sub_40222F+15Cp ... + cmp ecx, dword_544960 + jnz short loc_4A0690 + retn +loc_4A0690: ; CODE XREF: sub_4A0686+6j + jmp ___report_gsfailure +sub_4A0686 endp + +; --------------------------------------------------------------------------- + +sub_4A98B8 proc near ; CODE XREF: sub_4A05F7+7p + + int 3 + retn +sub_4A98B8 endp + +; =============== S U B R O U T I N E ======================================= + + +sub_4CAEC0 proc near ; CODE XREF: CEncoder_GetOptimum+514p + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 +arg_8 = dword ptr 0Ch + + push esi + push edi + mov edi, [esp+8+arg_4] + lea eax, [edi-2] + cmp eax, 4 + mov esi, ecx + jb short loc_4CAED5 + mov eax, 3 + +loc_4CAED5: ; CODE XREF: sub_4CAEC0+Ej + mov edx, [esp+8+arg_0] + cmp edx, 80h + jnb short loc_4CAEEF + shl eax, 7 + add eax, edx + mov ecx, [esi+eax*4+33314h] + jmp short loc_4CAF25 +; --------------------------------------------------------------------------- + +loc_4CAEEF: ; CODE XREF: sub_4CAEC0+1Fj + mov ecx, 7FFFFh + sub ecx, edx + sar ecx, 1Fh + push ebx + and ecx, 0Ch + add ecx, 6 + mov ebx, edx + shr ebx, cl + shl eax, 5 + add eax, ecx + and edx, 0Fh + movzx ebx, byte ptr dword_551198[ebx] + lea eax, [ebx+eax*2] + mov ecx, [esi+eax*4+32F14h] + add ecx, [esi+edx*4+33B14h] + pop ebx + +loc_4CAF25: ; CODE XREF: sub_4CAEC0+2Dj + mov edx, [esp+8+arg_8] + imul edx, 110h + add edx, edi + mov eax, [esi+edx*4+295B8h] + pop edi + add eax, ecx + pop esi + retn 0Ch +sub_4CAEC0 endp + +; --------------------------------------------------------------------------- + align 10h + +loc_4CAF40: ; CODE XREF: .text:004DAED5j + push ecx + push ebx + push ebp + push esi + mov ebp, 2 + mov bl, 2 + push edi + mov byte ptr dword_551198, 0 + mov byte ptr dword_551198+1, 1 + mov [esp+10h], bl + mov edi, ebp + +loc_4CAF60: ; CODE XREF: .text:004CAF96j + mov ecx, edi + shr ecx, 1 + sub ecx, 1 + mov esi, 1 + shl esi, cl + test esi, esi + jbe short loc_4CAF89 + mov ecx, [esp+10h] + push esi + lea eax, dword_551198[ebp] + push ecx + push eax + call _memset + add esp, 0Ch + add ebp, esi + +loc_4CAF89: ; CODE XREF: .text:004CAF70j + add bl, 1 + add edi, 1 + cmp bl, 1Ah + mov [esp+10h], bl + jb short loc_4CAF60 + pop edi + pop esi + pop ebp + pop ebx + pop ecx + retn +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CAFA0 proc near ; CODE XREF: sub_4CAFC0+90p + +arg_0 = dword ptr 4 + + mov eax, [esp+arg_0] + lea ecx, [eax-61h] + cmp cx, 19h + ja short locret_4CAFB2 + add eax, 0FFE0h + +locret_4CAFB2: ; CODE XREF: sub_4CAFA0+Bj + retn +sub_4CAFA0 endp + +; --------------------------------------------------------------------------- + align 10h + +; =============== S U B R O U T I N E ======================================= + +sub_4CAFC0 proc near ; CODE XREF: ICompressSetCoderProperties_SetCoderProperties+A5p + movzx ecx, word ptr [eax] + lea edx, [ecx-61h] + cmp dx, 19h + ja short loc_4CAFD2 + add ecx, 0FFE0h + +loc_4CAFD2: ; CODE XREF: sub_4CAFC0+Aj + add eax, 2 + cmp cx, 48h + jnz short loc_4CB01B + movzx ecx, word ptr [eax] + lea edx, [ecx-61h] + cmp dx, 19h + ja short loc_4CAFED + add ecx, 0FFE0h + +loc_4CAFED: ; CODE XREF: sub_4CAFC0+25j + add eax, 2 + cmp cx, 43h + jz short loc_4CAFF9 + +loc_4CAFF6: ; CODE XREF: sub_4CAFC0+44j + ; sub_4CAFC0+4Bj ... + xor eax, eax + retn +; --------------------------------------------------------------------------- + +loc_4CAFF9: ; CODE XREF: sub_4CAFC0+34j + movzx ecx, word ptr [eax] + sub ecx, 30h + lea edx, [ecx-4] + test edx, edx + ja short loc_4CAFF6 + cmp word ptr [eax+2], 0 + jnz short loc_4CAFF6 + mov dword ptr [ebx], 0 + mov [edi], ecx + mov eax, 1 + retn +; --------------------------------------------------------------------------- + +loc_4CB01B: ; CODE XREF: sub_4CAFC0+19j + cmp cx, 42h + jnz short loc_4CAFF6 + movzx ecx, word ptr [eax] + lea edx, [ecx-61h] + cmp dx, 19h + ja short loc_4CB033 + add ecx, 0FFE0h + +loc_4CB033: ; CODE XREF: sub_4CAFC0+6Bj + add eax, 2 + cmp cx, 54h + jnz short loc_4CAFF6 + push esi + movzx esi, word ptr [eax] + sub esi, 30h + lea ecx, [esi-2] + cmp ecx, 2 + ja short loc_4CB06C + movzx eax, word ptr [eax+2] + push eax + call sub_4CAFA0 + add esp, 4 + test ax, ax + jnz short loc_4CB06C + mov dword ptr [ebx], 1 + mov [edi], esi + mov eax, 1 + pop esi + retn +; --------------------------------------------------------------------------- + +loc_4CB06C: ; CODE XREF: sub_4CAFC0+89j + ; sub_4CAFC0+9Bj + xor eax, eax + pop esi + retn +sub_4CAFC0 endp + + +ICompressSetCoderProperties_SetCoderProperties proc near ; DATA XREF: .rdata:00517ADCo + +var_4 = dword ptr -4 +pThis = dword ptr 4 +propIDs = dword ptr 8 +properties = dword ptr 0Ch +numProperties = dword ptr 10h + + push ecx + push ebx + push ebp + xor edx, edx + cmp [esp+0Ch+numProperties], edx + push esi + push edi + mov [esp+14h+var_4], edx + jbe loc_4CB20D + mov esi, [esp+14h+properties] + mov ebp, [esp+14h+pThis] + lea ecx, [ecx+0] + +loc_4CB090: ; CODE XREF: sub_4CB070+197j + mov eax, [esp+14h+propIDs] + mov eax, [eax+edx*4] + add eax, 0FFFFFC00h + cmp eax, 90h ; switch 145 cases + ja loc_4CB131 ; default + ; jumptable 004CB0AE cases 1-63,67-79,83-111,113-127,130-143 + movzx ecx, ds:byte_4CB248[eax] + jmp ds:off_4CB218[ecx*4] ; switch jump + +loc_4CB0B5: ; DATA XREF: .text:off_4CB218o + cmp word ptr [esi], 13h ; jumptable 004CB0AE case 80 + jnz short loc_4CB131 ; default + ; jumptable 004CB0AE cases 1-63,67-79,83-111,113-127,130-143 + mov eax, [esi+8] + lea ecx, [eax-5] + cmp ecx, 10Ch + ja short loc_4CB131 ; default + ; jumptable 004CB0AE cases 1-63,67-79,83-111,113-127,130-143 + mov [ebp+32EF0h], eax + jmp loc_4CB1F9 +; --------------------------------------------------------------------------- + +loc_4CB0D4: ; CODE XREF: sub_4CB070+3Ej + ; DATA XREF: .text:off_4CB218o + cmp word ptr [esi], 13h ; jumptable 004CB0AE case 82 + jnz short loc_4CB131 ; default + ; jumptable 004CB0AE cases 1-63,67-79,83-111,113-127,130-143 + mov eax, [esi+8] + mov [ebp+33B88h], eax + jmp loc_4CB1F9 +; --------------------------------------------------------------------------- + +loc_4CB0E8: ; CODE XREF: sub_4CB070+3Ej + ; DATA XREF: .text:off_4CB218o + cmp word ptr [esi], 13h ; jumptable 004CB0AE case 112 + jnz short loc_4CB131 ; default + ; jumptable 004CB0AE cases 1-63,67-79,83-111,113-127,130-143 + cmp dword ptr [esi+8], 0 + setz cl + mov [ebp+32EECh], cl + jmp loc_4CB1F9 +; --------------------------------------------------------------------------- + +loc_4CB100: ; CODE XREF: sub_4CB070+3Ej + ; DATA XREF: .text:off_4CB218o + cmp word ptr [esi], 8 ; jumptable 004CB0AE case 81 + jnz short loc_4CB131 ; default + ; jumptable 004CB0AE cases 1-63,67-79,83-111,113-127,130-143 + mov eax, [esi+8] + lea edi, [ebp+0C4h] + lea ebx, [ebp+0CCh] + call sub_4CAFC0 + test eax, eax + jz short loc_4CB131 ; default + ; jumptable 004CB0AE cases 1-63,67-79,83-111,113-127,130-143 + mov edx, [esp+14h+var_4] + jmp loc_4CB1F9 +; --------------------------------------------------------------------------- + +loc_4CB127: ; CODE XREF: sub_4CB070+3Ej + ; DATA XREF: .text:off_4CB218o + cmp word ptr [esi], 0Bh ; jumptable 004CB0AE case 128 + jz loc_4CB1F9 + +loc_4CB131: ; CODE XREF: sub_4CB070+31j + ; sub_4CB070+3Ej ... + pop edi ; default + ; jumptable 004CB0AE cases 1-63,67-79,83-111,113-127,130-143 + pop esi + pop ebp + mov eax, 80070057h + pop ebx + pop ecx + retn 10h +; --------------------------------------------------------------------------- + +loc_4CB13E: ; CODE XREF: sub_4CB070+3Ej + ; DATA XREF: .text:off_4CB218o + cmp word ptr [esi], 13h ; jumptable 004CB0AE case 129 + jnz short loc_4CB131 ; default + ; jumptable 004CB0AE cases 1-63,67-79,83-111,113-127,130-143 + jmp loc_4CB1F9 +; --------------------------------------------------------------------------- + +loc_4CB149: ; CODE XREF: sub_4CB070+3Ej + ; DATA XREF: .text:off_4CB218o + cmp word ptr [esi], 13h ; jumptable 004CB0AE case 0 + jnz short loc_4CB131 ; default + ; jumptable 004CB0AE cases 1-63,67-79,83-111,113-127,130-143 + mov eax, [esi+8] + lea ecx, [eax-1] + cmp ecx, 3FFFFFFFh + ja short loc_4CB131 ; default + ; jumptable 004CB0AE cases 1-63,67-79,83-111,113-127,130-143 + mov [ebp+33B64h], eax + xor ecx, ecx + +loc_4CB165: ; CODE XREF: sub_4CB070+106j + mov edi, 1 + shl edi, cl + cmp eax, edi + jbe short loc_4CB178 + add ecx, 1 + cmp ecx, 1Eh + jb short loc_4CB165 + +loc_4CB178: ; CODE XREF: sub_4CB070+FEj + lea eax, [ecx+ecx] + mov [ebp+33B50h], eax + jmp short loc_4CB1F9 +; --------------------------------------------------------------------------- + +loc_4CB183: ; CODE XREF: sub_4CB070+3Ej + ; DATA XREF: .text:off_4CB218o + cmp word ptr [esi], 13h ; jumptable 004CB0AE case 64 + jnz short loc_4CB131 ; default + ; jumptable 004CB0AE cases 1-63,67-79,83-111,113-127,130-143 + mov ecx, [esi+8] + cmp ecx, 4 + ja short loc_4CB131 ; default + ; jumptable 004CB0AE cases 1-63,67-79,83-111,113-127,130-143 + mov eax, 1 + shl eax, cl + mov [ebp+33B54h], ecx + sub eax, 1 + mov [ebp+33B58h], eax + jmp short loc_4CB1F9 +; --------------------------------------------------------------------------- + +loc_4CB1A9: ; CODE XREF: sub_4CB070+3Ej + ; DATA XREF: .text:off_4CB218o + cmp word ptr [esi], 13h ; jumptable 004CB0AE case 66 + jnz short loc_4CB131 ; default + ; jumptable 004CB0AE cases 1-63,67-79,83-111,113-127,130-143 + mov eax, [esi+8] + cmp eax, 4 + ja loc_4CB131 ; default + ; jumptable 004CB0AE cases 1-63,67-79,83-111,113-127,130-143 + mov [ebp+33B5Ch], eax + jmp short loc_4CB1F9 +; --------------------------------------------------------------------------- + +loc_4CB1C3: ; CODE XREF: sub_4CB070+3Ej + ; DATA XREF: .text:off_4CB218o + cmp word ptr [esi], 13h ; jumptable 004CB0AE case 65 + jnz loc_4CB131 ; default + ; jumptable 004CB0AE cases 1-63,67-79,83-111,113-127,130-143 + mov eax, [esi+8] + cmp eax, 8 + ja loc_4CB131 ; default + ; jumptable 004CB0AE cases 1-63,67-79,83-111,113-127,130-143 + mov [ebp+33B60h], eax + jmp short loc_4CB1F9 +; --------------------------------------------------------------------------- + +loc_4CB1E1: ; CODE XREF: sub_4CB070+3Ej + ; DATA XREF: .text:off_4CB218o + cmp word ptr [esi], 0Bh ; jumptable 004CB0AE case 144 + jnz loc_4CB131 ; default + ; jumptable 004CB0AE cases 1-63,67-79,83-111,113-127,130-143 + cmp word ptr [esi+8], 0FFFFh + setz cl + mov [ebp+33B8Ch], cl + +loc_4CB1F9: ; CODE XREF: sub_4CB070+5Fj + ; sub_4CB070+73j ... + add edx, 1 + add esi, 10h + cmp edx, [esp+14h+numProperties] + mov [esp+14h+var_4], edx + jb loc_4CB090 + +loc_4CB20D: ; CODE XREF: sub_4CB070+Fj + pop edi + pop esi + pop ebp + xor eax, eax + pop ebx + pop ecx + retn 10h + +off_4CB218 dd offset loc_4CB149, offset loc_4CB183, offset loc_4CB1C3 + dd offset loc_4CB1A9, offset loc_4CB0B5, offset loc_4CB100 ; jump table for switch statement + dd offset loc_4CB0D4, offset loc_4CB0E8, offset loc_4CB127 + dd offset loc_4CB13E, offset loc_4CB1E1, offset loc_4CB131 + +ICompressSetCoderProperties_SetCoderProperties endp + +; =============== S U B R O U T I N E ======================================= + +sub_4CB2E0 proc near ; CODE XREF: CEncoder_GetOptimum+1199p + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 + + push ebx + push ebp + push esi + mov esi, [esp+0Ch+arg_4] + lea eax, [esi+esi*4] + lea edx, [ecx+eax*8] + mov [ecx+32F08h], esi + mov eax, [edx+100h] + mov ebx, [edx+104h] + push edi + +loc_4CB300: ; CODE XREF: sub_4CB2E0+A6j + lea edx, [esi+esi*4] + cmp byte ptr [ecx+edx*8+0F1h], 0 + lea edi, [ecx+edx*8] + jz short loc_4CB359 + lea edx, [eax+eax*4+1Eh] + lea edx, [ecx+edx*8] + mov dword ptr [edx+14h], 0FFFFFFFFh + mov byte ptr [edx+1], 0 + lea edx, [eax+eax*4] + lea edx, [ecx+edx*8] + lea ebp, [eax-1] + mov [edx+100h], ebp + cmp byte ptr [edi+0F2h], 0 + jz short loc_4CB359 + mov byte ptr [edx+0C9h], 0 + mov ebp, [edi+0F4h] + mov [edx+0D8h], ebp + mov edi, [edi+0F8h] + mov [edx+0DCh], edi + +loc_4CB359: ; CODE XREF: sub_4CB2E0+2Ej + ; sub_4CB2E0+58j + lea edx, [eax+eax*4] + add edx, edx + add edx, edx + add edx, edx + mov edi, eax + test edi, edi + mov eax, [edx+ecx+100h] + mov ebp, ebx + mov ebx, [edx+ecx+104h] + mov [edx+ecx+100h], esi + mov [edx+ecx+104h], ebp + mov esi, edi + jnz loc_4CB300 + mov eax, [ecx+104h] + mov edx, [esp+10h+arg_0] + pop edi + pop esi + mov [edx], eax + mov eax, [ecx+100h] + pop ebp + mov [ecx+32F0Ch], eax + pop ebx + retn 8 +sub_4CB2E0 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CB3B0 proc near ; CODE XREF: CEncoder_GetOptimumFast+2Dp + ; CEncoder_GetOptimumFast+28Fp ... + +arg_0 = dword ptr 4 + + push ebx + push ebp + push esi + mov esi, ecx + mov ecx, [esi+80h] + mov edx, [esi+78h] + lea eax, [esi+32660h] + push eax + push ecx + xor ebx, ebx + call edx + mov ebp, [esp+14h+arg_0] + add esp, 8 + test eax, eax + mov [ebp+0], eax + jbe short loc_4CB446 + mov ebx, [esi+eax*4+32658h] + cmp ebx, [esi+32EF8h] + jnz short loc_4CB446 + mov eax, [esi+80h] + mov ecx, [esi+70h] + push edi + push eax + call ecx + mov edx, [esi+80h] + mov edi, eax + mov eax, [esi+74h] + push edx + add edi, 1 + call eax + mov ecx, [ebp+0] + mov ecx, [esi+ecx*4+3265Ch] + add esp, 8 + sub eax, 1 + add ecx, 1 + cmp edi, 111h + jbe short loc_4CB425 + mov edi, 111h + +loc_4CB425: ; CODE XREF: sub_4CB3B0+6Ej + mov edx, eax + sub edx, ecx + cmp ebx, edi + jnb short loc_4CB445 + mov ebp, edx + lea ecx, [eax+ebx] + sub ebp, eax + +loc_4CB434: ; CODE XREF: sub_4CB3B0+93j + mov dl, [ecx] + cmp dl, [ecx+ebp] + jnz short loc_4CB445 + add ebx, 1 + add ecx, 1 + cmp ebx, edi + jb short loc_4CB434 + +loc_4CB445: ; CODE XREF: sub_4CB3B0+7Bj + ; sub_4CB3B0+89j + pop edi + +loc_4CB446: ; CODE XREF: sub_4CB3B0+26j + ; sub_4CB3B0+35j + add dword ptr [esi+32F04h], 1 + pop esi + pop ebp + mov eax, ebx + pop ebx + retn 4 +sub_4CB3B0 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +CEncoder_GetOptimumFast proc near ; CODE XREF: CEncoder_CodeOneBlock+1F4p + +var_28 = dword ptr -28h +var_24 = dword ptr -24h +var_20 = dword ptr -20h +var_1C = dword ptr -1Ch +var_18 = dword ptr -18h +var_14 = dword ptr -14h +var_10 = dword ptr -10h +arg_0 = dword ptr 4 + + sub esp, 28h + push ebx + push esi + push edi + mov edi, ecx + mov eax, [edi+80h] + mov ecx, [edi+70h] + push eax + call ecx + add esp, 4 + cmp byte ptr [edi+32F10h], 0 + mov esi, eax + mov [esp+34h+var_24], esi + jnz short loc_4CB498 + lea edx, [esp+34h+var_20] + push edx + mov ecx, edi + call sub_4CB3B0 + mov ebx, [esp+34h+var_20] + jmp short loc_4CB4AF +; --------------------------------------------------------------------------- + +loc_4CB498: ; CODE XREF: CEncoder_GetOptimumFast+24j + mov ebx, [edi+32F00h] + mov eax, [edi+32EFCh] + mov [esp+34h+var_20], ebx + mov byte ptr [edi+32F10h], 0 + +loc_4CB4AF: ; CODE XREF: CEncoder_GetOptimumFast+36j + mov ecx, [edi+80h] + mov edx, [edi+74h] + push ecx + mov [esp+38h+var_28], eax + call edx + add esp, 4 + sub eax, 1 + cmp esi, 111h + jbe loc_4CB55E + mov [esp+34h+var_24], 111h + +loc_4CB4D9: ; CODE XREF: CEncoder_GetOptimumFast+101j + push ebp + xor ebp, ebp + lea ecx, [edi+14h] + mov [esp+38h+var_18], ebp + mov [esp+38h+var_14], ebp + mov [esp+38h+var_1C], ecx + jmp short loc_4CB4F0 +; --------------------------------------------------------------------------- + align 10h + +loc_4CB4F0: ; CODE XREF: CEncoder_GetOptimumFast+8Bj + ; CEncoder_GetOptimumFast+132j + mov edx, [esp+38h+var_1C] + mov ecx, eax + sub ecx, [edx] + mov dl, [eax] + sub ecx, 1 + cmp dl, [ecx] + jnz short loc_4CB57F + mov dl, [eax+1] + cmp dl, [ecx+1] + jnz short loc_4CB57F + mov esi, 2 + cmp [esp+38h+var_24], esi + jbe short loc_4CB537 + lea edx, [eax+2] + sub ecx, eax + lea esp, [esp+0] + +loc_4CB520: ; CODE XREF: CEncoder_GetOptimumFast+D1j + mov bl, [edx] + cmp bl, [ecx+edx] + jnz short loc_4CB533 + add esi, 1 + add edx, 1 + cmp esi, [esp+38h+var_24] + jb short loc_4CB520 + +loc_4CB533: ; CODE XREF: CEncoder_GetOptimumFast+C5j + mov ebx, [esp+38h+var_20] + +loc_4CB537: ; CODE XREF: CEncoder_GetOptimumFast+B2j + cmp esi, [edi+32EF8h] + jnb short loc_4CB5B9 + mov edx, [esp+38h+var_14] + lea ecx, ds:0[ebp*4] + mov [esp+ecx+38h+var_10], esi + cmp esi, [esp+edx+38h+var_10] + jbe short loc_4CB587 + mov [esp+38h+var_18], ebp + mov [esp+38h+var_14], ecx + jmp short loc_4CB587 +; --------------------------------------------------------------------------- + +loc_4CB55E: ; CODE XREF: CEncoder_GetOptimumFast+6Bj + cmp esi, 2 + jnb loc_4CB4D9 + mov eax, [esp+34h+arg_0] + pop edi + pop esi + mov dword ptr [eax], 0FFFFFFFFh + mov eax, 1 + pop ebx + add esp, 28h + retn 4 +; --------------------------------------------------------------------------- + +loc_4CB57F: ; CODE XREF: CEncoder_GetOptimumFast+9Fj + ; CEncoder_GetOptimumFast+A7j + mov [esp+ebp*4+38h+var_10], 0 + +loc_4CB587: ; CODE XREF: CEncoder_GetOptimumFast+F2j + ; CEncoder_GetOptimumFast+FCj + add [esp+38h+var_1C], 4 + add ebp, 1 + cmp ebp, 4 + jb loc_4CB4F0 + mov esi, [esp+38h+var_28] + cmp esi, [edi+32EF8h] + jb short loc_4CB5EC + mov eax, [edi+ebx*4+3265Ch] + mov ecx, [esp+38h+arg_0] + add eax, 4 + mov [ecx], eax + jmp loc_4CB69A +; --------------------------------------------------------------------------- + +loc_4CB5B9: ; CODE XREF: CEncoder_GetOptimumFast+DDj + mov eax, [esp+38h+arg_0] + mov [eax], ebp + lea eax, [esi-1] + test eax, eax + jz loc_4CB82E + mov ecx, [edi+80h] + mov edx, [edi+7Ch] + add [edi+32F04h], eax + push eax + push ecx + call edx + add esp, 8 + pop ebp + pop edi + mov eax, esi + pop esi + pop ebx + add esp, 28h + retn 4 +; --------------------------------------------------------------------------- + +loc_4CB5EC: ; CODE XREF: CEncoder_GetOptimumFast+142j + xor ebp, ebp + cmp esi, 2 + mov [esp+38h+var_20], ebp + jb short loc_4CB65A + cmp ebx, 2 + mov ecx, [edi+ebx*4+3265Ch] + mov [esp+38h+var_20], ecx + jbe short loc_4CB63F + lea eax, [edi+ebx*4+32654h] + mov edi, edi + +loc_4CB610: ; CODE XREF: CEncoder_GetOptimumFast+1DDj + mov edx, [eax-4] + add edx, 1 + cmp esi, edx + jnz short loc_4CB63F + mov ecx, [esp+38h+var_20] + shr ecx, 7 + cmp ecx, [eax] + jbe short loc_4CB63F + mov edx, [eax-4] + mov ecx, [eax] + sub eax, 8 + sub ebx, 2 + cmp ebx, 2 + mov [esp+38h+var_28], edx + mov [esp+38h+var_20], ecx + mov esi, edx + ja short loc_4CB610 + +loc_4CB63F: ; CODE XREF: CEncoder_GetOptimumFast+1A5j + ; CEncoder_GetOptimumFast+1B8j ... + cmp esi, 2 + jnz short loc_4CB656 + cmp [esp+38h+var_20], 80h + jb short loc_4CB656 + mov [esp+38h+var_28], 1 + +loc_4CB656: ; CODE XREF: CEncoder_GetOptimumFast+1E2j + ; CEncoder_GetOptimumFast+1ECj + mov ebp, [esp+38h+var_20] + +loc_4CB65A: ; CODE XREF: CEncoder_GetOptimumFast+195j + mov edx, [esp+38h+var_18] + mov esi, [esp+edx*4+38h+var_10] + cmp esi, 2 + mov ebx, [esp+38h+var_28] + jb short loc_4CB6C7 + lea eax, [esi+1] + cmp eax, ebx + jnb short loc_4CB690 + lea ecx, [esi+2] + cmp ecx, ebx + jb short loc_4CB681 + cmp ebp, 200h + ja short loc_4CB690 + +loc_4CB681: ; CODE XREF: CEncoder_GetOptimumFast+217j + lea edx, [esi+3] + cmp edx, ebx + jb short loc_4CB6C7 + cmp ebp, 8000h + jbe short loc_4CB6C7 + +loc_4CB690: ; CODE XREF: CEncoder_GetOptimumFast+210j + ; CEncoder_GetOptimumFast+21Fj + mov eax, [esp+38h+arg_0] + mov ecx, [esp+38h+var_18] + mov [eax], ecx + +loc_4CB69A: ; CODE XREF: CEncoder_GetOptimumFast+154j + lea eax, [esi-1] + test eax, eax + jz loc_4CB82E + mov edx, [edi+80h] + add [edi+32F04h], eax + push eax + mov eax, [edi+7Ch] + push edx + call eax + add esp, 8 + pop ebp + pop edi + mov eax, esi + pop esi + pop ebx + add esp, 28h + retn 4 +; --------------------------------------------------------------------------- + +loc_4CB6C7: ; CODE XREF: CEncoder_GetOptimumFast+209j + ; CEncoder_GetOptimumFast+226j ... + cmp ebx, 2 + jb short loc_4CB73E + cmp [esp+38h+var_24], 2 + jbe short loc_4CB73E + mov ecx, [edi+80h] + mov edx, [edi+70h] + push ecx + call edx + add esp, 4 + lea esi, [edi+32F00h] + push esi + mov ecx, edi + mov [esp+3Ch+var_24], eax + call sub_4CB3B0 + cmp eax, 2 + mov [edi+32EFCh], eax + jb short loc_4CB757 + cmp eax, ebx + mov ecx, [esi] + mov edx, [edi+ecx*4+3265Ch] + jb short loc_4CB710 + cmp edx, ebp + jb short loc_4CB737 + +loc_4CB710: ; CODE XREF: CEncoder_GetOptimumFast+2AAj + lea ecx, [ebx+1] + cmp eax, ecx + jnz short loc_4CB722 + mov esi, edx + shr esi, 7 + cmp esi, ebp + jbe short loc_4CB737 + cmp eax, ecx + +loc_4CB722: ; CODE XREF: CEncoder_GetOptimumFast+2B5j + ja short loc_4CB737 + add eax, 1 + cmp eax, ebx + jb short loc_4CB757 + cmp ebx, 3 + jb short loc_4CB757 + shr ebp, 7 + cmp ebp, edx + jbe short loc_4CB757 + +loc_4CB737: ; CODE XREF: CEncoder_GetOptimumFast+2AEj + ; CEncoder_GetOptimumFast+2BEj ... + mov byte ptr [edi+32F10h], 1 + +loc_4CB73E: ; CODE XREF: CEncoder_GetOptimumFast+26Aj + ; CEncoder_GetOptimumFast+271j + mov edx, [esp+38h+arg_0] + pop ebp + pop edi + pop esi + mov dword ptr [edx], 0FFFFFFFFh + mov eax, 1 + pop ebx + add esp, 28h + retn 4 +; --------------------------------------------------------------------------- + +loc_4CB757: ; CODE XREF: CEncoder_GetOptimumFast+29Dj + ; CEncoder_GetOptimumFast+2C9j ... + mov eax, [edi+80h] + mov ecx, [edi+74h] + push eax + call ecx + lea ecx, [edi+14h] + add esp, 4 + sub eax, 1 + mov [esp+38h+var_18], 0 + mov ebx, ecx + +loc_4CB776: ; CODE XREF: CEncoder_GetOptimumFast+39Aj + mov dl, [eax+1] + mov ecx, eax + sub ecx, [ebx] + sub ecx, 1 + cmp dl, [ecx+1] + jnz short loc_4CB7DD + mov dl, [eax+2] + cmp dl, [ecx+2] + lea ebp, [eax+2] + jnz short loc_4CB7DD + mov esi, 2 + cmp [esp+38h+var_24], esi + jbe short loc_4CB7B4 + mov edx, ebp + mov ebp, ecx + sub ebp, eax + +loc_4CB7A1: ; CODE XREF: CEncoder_GetOptimumFast+352j + mov cl, [edx] + cmp cl, [edx+ebp] + jnz short loc_4CB7B4 + add esi, 1 + add edx, 1 + cmp esi, [esp+38h+var_24] + jb short loc_4CB7A1 + +loc_4CB7B4: ; CODE XREF: CEncoder_GetOptimumFast+339j + ; CEncoder_GetOptimumFast+346j + add esi, 1 + cmp esi, [esp+38h+var_28] + jb short loc_4CB7E9 + mov eax, [esp+38h+arg_0] + pop ebp + mov byte ptr [edi+32F10h], 1 + pop edi + pop esi + mov dword ptr [eax], 0FFFFFFFFh + mov eax, 1 + pop ebx + add esp, 28h + retn 4 +; --------------------------------------------------------------------------- + +loc_4CB7DD: ; CODE XREF: CEncoder_GetOptimumFast+323j + ; CEncoder_GetOptimumFast+32Ej + mov edx, [esp+38h+var_18] + mov [esp+edx*4+38h+var_10], 0 + +loc_4CB7E9: ; CODE XREF: CEncoder_GetOptimumFast+35Bj + mov ecx, [esp+38h+var_18] + add ecx, 1 + add ebx, 4 + cmp ecx, 4 + mov [esp+38h+var_18], ecx + jb loc_4CB776 + mov esi, [esp+38h+var_28] + mov ecx, [esp+38h+var_20] + mov edx, [esp+38h+arg_0] + add ecx, 4 + lea eax, [esi-2] + test eax, eax + mov [edx], ecx + jz short loc_4CB82E + add [edi+32F04h], eax + mov ecx, [edi+7Ch] + push eax + mov eax, [edi+80h] + push eax + call ecx + add esp, 8 + +loc_4CB82E: ; CODE XREF: CEncoder_GetOptimumFast+164j + ; CEncoder_GetOptimumFast+23Fj ... + pop ebp + pop edi + mov eax, esi + pop esi + pop ebx + add esp, 28h + retn 4 +CEncoder_GetOptimumFast endp + +; =============== S U B R O U T I N E ======================================= + +sub_4CB8A0 proc near ; CODE XREF: sub_4CD940+37p + +arg_0 = dword ptr 4 + + push edi + mov edi, [esp+4+arg_0] + test edi, edi + jz short loc_4CB8EB + mov eax, dword_553598 + test eax, eax + jnz short loc_4CB8DD + push 0Ch ; Size + call _operator_new ; operator new(uint) + add esp, 4 + test eax, eax + jz short loc_4CB8D6 + mov dword ptr [eax], 0 + mov dword ptr [eax+4], 0 + mov dword ptr [eax+8], 0 + jmp short loc_4CB8D8 +; --------------------------------------------------------------------------- + +loc_4CB8D6: ; CODE XREF: sub_4CB8A0+1Ej + xor eax, eax + +loc_4CB8D8: ; CODE XREF: sub_4CB8A0+34j + mov dword_553598, eax + +loc_4CB8DD: ; CODE XREF: sub_4CB8A0+10j + mov eax, [eax] + test eax, eax + jz short loc_4CB8EB + push edi + call eax + add esp, 4 + pop edi + retn +; --------------------------------------------------------------------------- + +loc_4CB8EB: ; CODE XREF: sub_4CB8A0+7j + ; sub_4CB8A0+41j + xor eax, eax + pop edi + retn +sub_4CB8A0 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CB8F0 proc near ; CODE XREF: sub_4CBA60+85p + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 +arg_8 = dword ptr 0Ch + + push esi + mov esi, [esp+4+arg_0] + push edi + mov edi, [esi+44h] + add edi, [esi+40h] + add edi, [esp+8+arg_4] + cmp dword ptr [esi+4Ch], 0 + jz short loc_4CB911 + mov [esi+3Ch], edi + pop edi + mov eax, 1 + pop esi + retn +; --------------------------------------------------------------------------- + +loc_4CB911: ; CODE XREF: sub_4CB8F0+14j + mov eax, [esi+30h] + test eax, eax + jz short loc_4CB91D + cmp [esi+3Ch], edi + jz short loc_4CB93E + +loc_4CB91D: ; CODE XREF: sub_4CB8F0+26j + push ebx + mov ebx, [esp+0Ch+arg_8] + push eax + mov eax, [ebx+4] + call eax + mov dword ptr [esi+30h], 0 + mov [esi+3Ch], edi + mov ecx, [ebx] + push edi + call ecx + add esp, 8 + mov [esi+30h], eax + pop ebx + +loc_4CB93E: ; CODE XREF: sub_4CB8F0+2Bj + xor eax, eax + cmp [esi+30h], eax + pop edi + setnz al + pop esi + retn +sub_4CB8F0 endp + +; --------------------------------------------------------------------------- + align 10h + +loc_4CB950: ; DATA XREF: sub_4CCAA0+1Co + mov eax, [esp+4] + mov eax, [eax] + retn +; --------------------------------------------------------------------------- + align 10h + +loc_4CB960: ; DATA XREF: sub_4CCAA0+Eo + mov eax, [esp+4] + mov ecx, [eax] + mov edx, [esp+8] + mov al, [edx+ecx] + retn +; --------------------------------------------------------------------------- + align 10h +loc_4CB970: ; DATA XREF: sub_4CCAA0+15o + mov ecx, [esp+4] + +; =============== S U B R O U T I N E ======================================= + +; Attributes: library function + +; public: int __thiscall CRect::Height(void)const +?Height@CRect@@QBEHXZ proc near + mov eax, [ecx+0Ch] + sub eax, [ecx+4] + retn +?Height@CRect@@QBEHXZ endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CB980 proc near ; CODE XREF: sub_4CBC80+46p + ; sub_4CBD50+61p + +arg_0 = dword ptr 4 + + push esi + mov esi, [esp+4+arg_0] + cmp dword ptr [esi+38h], 0 + jnz short loc_4CB9F0 + cmp dword ptr [esi+68h], 0 + jnz short loc_4CB9F0 + mov eax, [esi] + sub eax, [esi+4] + mov ecx, [esi+30h] + add eax, [esi+0Ch] + sub ecx, eax + add ecx, [esi+3Ch] + jz short loc_4CB9F0 + push edi + +loc_4CB9A4: ; CODE XREF: sub_4CB980+63j + mov edx, [esi+34h] + lea edi, [esp+8+arg_0] + push edi + push ecx + push eax + mov eax, [edx] + push edx + call eax + add esp, 10h + test eax, eax + mov [esi+68h], eax + jnz short loc_4CB9EF + mov eax, [esp+8+arg_0] + test eax, eax + jz short loc_4CB9E8 + add [esi+0Ch], eax + mov eax, [esi+0Ch] + sub eax, [esi+4] + cmp eax, [esi+44h] + ja short loc_4CB9EF + mov eax, [esi] + sub eax, [esi+4] + mov ecx, [esi+30h] + add eax, [esi+0Ch] + sub ecx, eax + add ecx, [esi+3Ch] + jnz short loc_4CB9A4 + pop edi + pop esi + retn +; --------------------------------------------------------------------------- + +loc_4CB9E8: ; CODE XREF: sub_4CB980+43j + mov dword ptr [esi+38h], 1 + +loc_4CB9EF: ; CODE XREF: sub_4CB980+3Bj + ; sub_4CB980+51j + pop edi + +loc_4CB9F0: ; CODE XREF: sub_4CB980+9j + ; sub_4CB980+Fj ... + pop esi + retn +sub_4CB980 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CBA00 proc near ; CODE XREF: sub_4CBD50+58p + +arg_0 = dword ptr 4 + + push ebx + push ebp + push esi + push edi + mov edi, [esp+10h+arg_0] + mov esi, [edi+0Ch] + mov eax, [edi+40h] + sub esi, [edi+4] + mov ebx, [edi] + mov ebp, [edi+30h] + add esi, eax + sub ebx, eax + mov eax, dword_553598 + test eax, eax + jnz short loc_4CBA44 + push 0Ch ; Size + call _operator_new ; operator new(uint) + xor ecx, ecx + add esp, 4 + cmp eax, ecx + jz short loc_4CBA3D + mov [eax], ecx + mov [eax+4], ecx + mov [eax+8], ecx + jmp short loc_4CBA3F +; --------------------------------------------------------------------------- + +loc_4CBA3D: ; CODE XREF: sub_4CBA00+31j + xor eax, eax + +loc_4CBA3F: ; CODE XREF: sub_4CBA00+3Bj + mov dword_553598, eax + +loc_4CBA44: ; CODE XREF: sub_4CBA00+21j + mov eax, [eax+8] + test eax, eax + jz short loc_4CBA53 + push esi + push ebx + push ebp + call eax + add esp, 0Ch + +loc_4CBA53: ; CODE XREF: sub_4CBA00+49j + mov eax, [edi+30h] + add eax, [edi+40h] + mov [edi], eax + pop edi + pop esi + pop ebp + pop ebx + retn +sub_4CBA00 endp + +; =============== S U B R O U T I N E ======================================= + +sub_4CBA60 proc near ; CODE XREF: sub_4D0270+D2p + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 +arg_8 = dword ptr 0Ch +arg_C = dword ptr 10h +arg_10 = dword ptr 14h +arg_14 = dword ptr 18h + + push ebx + push esi + push edi + mov edi, [esp+0Ch+arg_4] + cmp edi, 0C0000000h + jbe short loc_4CBAA2 + mov esi, [esp+0Ch+arg_0] + mov eax, [esi+20h] + mov edi, [esp+0Ch+arg_14] + mov ecx, [edi+4] + push eax + call ecx + xor ebx, ebx + add esp, 4 + cmp [esi+4Ch], ebx + mov [esi+20h], ebx + jnz short loc_4CBA9C + mov edx, [esi+30h] + mov eax, [edi+4] + push edx + call eax + add esp, 4 + mov [esi+30h], ebx + +loc_4CBA9C: ; CODE XREF: sub_4CBA60+2Bj + pop edi + pop esi + xor eax, eax + pop ebx + retn +; --------------------------------------------------------------------------- + +loc_4CBAA2: ; CODE XREF: sub_4CBA60+Dj + mov eax, edi + shr eax, 1 + cmp edi, 80000000h + jbe short loc_4CBAB3 + mov eax, edi + shr eax, 2 + +loc_4CBAB3: ; CODE XREF: sub_4CBA60+4Cj + mov ecx, [esp+0Ch+arg_8] + mov esi, [esp+0Ch+arg_0] + mov ebx, [esp+0Ch+arg_C] + lea edx, [edi+ecx+1] + push ebp + mov [esi+40h], edx + mov edx, [esp+10h+arg_10] + add ecx, ebx + lea ebp, [ebx+edx] + add ecx, edx + mov [esi+44h], ebp + mov ebp, [esp+10h+arg_14] + shr ecx, 1 + push ebp + lea eax, [ecx+eax+80000h] + push eax + push esi + call sub_4CB8F0 + add esp, 0Ch + test eax, eax + jz loc_4CBBEA + mov edx, [esi+48h] + mov [esi+1Ch], ebx + xor ebx, ebx + cmp edx, 2 + lea ebp, [edi+1] + mov [esi+5Ch], ebx + jnz short loc_4CBB0F + mov eax, 0FFFFh + jmp short loc_4CBB49 +; --------------------------------------------------------------------------- + +loc_4CBB0F: ; CODE XREF: sub_4CBA60+A6j + lea ecx, [edi-1] + mov eax, ecx + shr eax, 1 + or ecx, eax + mov eax, ecx + shr eax, 2 + or ecx, eax + mov eax, ecx + shr eax, 4 + or ecx, eax + mov eax, ecx + or eax, 1FFFE00h + shr eax, 8 + or eax, ecx + shr eax, 1 + cmp eax, 1000000h + jbe short loc_4CBB49 + cmp edx, 3 + jnz short loc_4CBB47 + mov eax, 0FFFFFFh + jmp short loc_4CBB49 +; --------------------------------------------------------------------------- + +loc_4CBB47: ; CODE XREF: sub_4CBA60+DEj + shr eax, 1 + +loc_4CBB49: ; CODE XREF: sub_4CBA60+ADj + ; sub_4CBA60+D9j ... + mov [esi+28h], eax + add eax, 1 + cmp edx, 2 + jbe short loc_4CBB5B + mov dword ptr [esi+5Ch], 400h + +loc_4CBB5B: ; CODE XREF: sub_4CBA60+F2j + cmp edx, 3 + jbe short loc_4CBB67 + add dword ptr [esi+5Ch], 10000h + +loc_4CBB67: ; CODE XREF: sub_4CBA60+FEj + cmp edx, 4 + jbe short loc_4CBB73 + add dword ptr [esi+5Ch], 100000h + +loc_4CBB73: ; CODE XREF: sub_4CBA60+10Aj + mov ecx, [esi+60h] + mov edx, [esi+5Ch] + add ecx, [esi+64h] + add eax, edx + cmp [esi+50h], ebx + mov [esi+58h], edi + mov [esi+60h], eax + mov [esi+18h], ebp + lea edx, [ebp+ebp+0] + jnz short loc_4CBB92 + mov edx, ebp + +loc_4CBB92: ; CODE XREF: sub_4CBA60+12Ej + lea edi, [eax+edx] + mov eax, [esi+20h] + cmp eax, ebx + mov [esi+64h], edx + jz short loc_4CBBA3 + cmp ecx, edi + jz short loc_4CBBE0 + +loc_4CBBA3: ; CODE XREF: sub_4CBA60+13Dj + mov ebp, [esp+10h+arg_14] + push eax + mov eax, [ebp+4] + call eax + lea eax, ds:0[edi*4] + mov ecx, eax + shr ecx, 2 + add esp, 4 + cmp ecx, edi + mov [esi+20h], ebx + jz short loc_4CBBC7 + xor eax, eax + jmp short loc_4CBBD0 +; --------------------------------------------------------------------------- + +loc_4CBBC7: ; CODE XREF: sub_4CBA60+161j + mov edx, [ebp+0] + push eax + call edx + add esp, 4 + +loc_4CBBD0: ; CODE XREF: sub_4CBA60+165j + cmp eax, ebx + mov [esi+20h], eax + jz short loc_4CBBEC + mov ecx, [esi+60h] + lea edx, [eax+ecx*4] + mov [esi+24h], edx + +loc_4CBBE0: ; CODE XREF: sub_4CBA60+141j + pop ebp + pop edi + pop esi + mov eax, 1 + pop ebx + retn +; --------------------------------------------------------------------------- + +loc_4CBBEA: ; CODE XREF: sub_4CBA60+8Fj + xor ebx, ebx + +loc_4CBBEC: ; CODE XREF: sub_4CBA60+175j + mov eax, [esi+20h] + mov ecx, [ebp+4] + push eax + call ecx + add esp, 4 + cmp [esi+4Ch], ebx + mov [esi+20h], ebx + jnz short loc_4CBC0F + mov edx, [esi+30h] + mov eax, [ebp+4] + push edx + call eax + add esp, 4 + mov [esi+30h], ebx + +loc_4CBC0F: ; CODE XREF: sub_4CBA60+19Ej + pop ebp + pop edi + pop esi + xor eax, eax + pop ebx + retn +sub_4CBA60 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CBC20 proc near ; CODE XREF: sub_4CBD50+79p + +arg_0 = dword ptr 4 + + mov eax, [esp+arg_0] + mov edx, [eax+18h] + sub edx, [eax+14h] + push ebx + mov ebx, [eax+4] + or ecx, 0FFFFFFFFh + sub ecx, ebx + cmp edx, ecx + push esi + jnb short loc_4CBC3A + mov ecx, edx + +loc_4CBC3A: ; CODE XREF: sub_4CBC20+16j + mov esi, [eax+0Ch] + sub esi, ebx + push edi + mov edi, [eax+44h] + mov edx, esi + cmp edx, edi + ja short loc_4CBC54 + test edx, edx + jbe short loc_4CBC56 + mov edx, 1 + jmp short loc_4CBC56 +; --------------------------------------------------------------------------- + +loc_4CBC54: ; CODE XREF: sub_4CBC20+27j + sub edx, edi + +loc_4CBC56: ; CODE XREF: sub_4CBC20+2Bj + ; sub_4CBC20+32j + cmp edx, ecx + pop edi + jnb short loc_4CBC5D + mov ecx, edx + +loc_4CBC5D: ; CODE XREF: sub_4CBC20+39j + mov edx, [eax+1Ch] + cmp esi, edx + jbe short loc_4CBC66 + mov esi, edx + +loc_4CBC66: ; CODE XREF: sub_4CBC20+42j + add ebx, ecx + mov [eax+10h], esi + pop esi + mov [eax+8], ebx + pop ebx + retn +sub_4CBC20 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CBC80 proc near ; DATA XREF: sub_4CCAA0+8o + +arg_0 = dword ptr 4 + + push ebx + push esi + mov esi, [esp+8+arg_0] + xor eax, eax + cmp [esi+60h], eax + jbe short loc_4CBCA2 + lea ecx, [ecx+0] + +loc_4CBC90: ; CODE XREF: sub_4CBC80+20j + mov ecx, [esi+20h] + mov dword ptr [ecx+eax*4], 0 + add eax, 1 + cmp eax, [esi+60h] + jb short loc_4CBC90 + +loc_4CBCA2: ; CODE XREF: sub_4CBC80+Bj + mov eax, [esi+18h] + mov edx, [esi+30h] + push esi + mov dword ptr [esi+14h], 0 + mov [esi], edx + mov [esi+0Ch], eax + mov [esi+4], eax + mov dword ptr [esi+68h], 0 + mov dword ptr [esi+38h], 0 + call sub_4CB980 + mov eax, [esi+18h] + mov ebx, [esi+4] + sub eax, [esi+14h] + or ecx, 0FFFFFFFFh + sub ecx, ebx + add esp, 4 + cmp eax, ecx + jnb short loc_4CBCE2 + mov ecx, eax + +loc_4CBCE2: ; CODE XREF: sub_4CBC80+5Ej + mov edx, [esi+0Ch] + sub edx, ebx + push edi + mov edi, [esi+44h] + mov eax, edx + cmp eax, edi + ja short loc_4CBCFC + test eax, eax + jbe short loc_4CBCFE + mov eax, 1 + jmp short loc_4CBCFE +; --------------------------------------------------------------------------- + +loc_4CBCFC: ; CODE XREF: sub_4CBC80+6Fj + sub eax, edi + +loc_4CBCFE: ; CODE XREF: sub_4CBC80+73j + ; sub_4CBC80+7Aj + cmp eax, ecx + pop edi + jnb short loc_4CBD05 + mov ecx, eax + +loc_4CBD05: ; CODE XREF: sub_4CBC80+81j + mov eax, edx + mov edx, [esi+1Ch] + cmp eax, edx + jbe short loc_4CBD10 + mov eax, edx + +loc_4CBD10: ; CODE XREF: sub_4CBC80+8Cj + add ebx, ecx + mov [esi+8], ebx + mov [esi+10h], eax + pop esi + pop ebx + retn +sub_4CBC80 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + + +sub_4CBD20 proc near ; CODE XREF: sub_4CBD50+26p + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 +arg_8 = dword ptr 0Ch + + push edi + mov edi, [esp+4+arg_8] + xor eax, eax + test edi, edi + jbe short loc_4CBD4C + mov edx, [esp+4+arg_4] + push esi + mov esi, [esp+8+arg_0] + +loc_4CBD34: ; CODE XREF: sub_4CBD20+29j + mov ecx, [edx+eax*4] + cmp ecx, esi + ja short loc_4CBD3F + xor ecx, ecx + jmp short loc_4CBD41 +; --------------------------------------------------------------------------- + +loc_4CBD3F: ; CODE XREF: sub_4CBD20+19j + sub ecx, esi + +loc_4CBD41: ; CODE XREF: sub_4CBD20+1Dj + mov [edx+eax*4], ecx + add eax, 1 + cmp eax, edi + jb short loc_4CBD34 + pop esi + +loc_4CBD4C: ; CODE XREF: sub_4CBD20+9j + pop edi + retn +sub_4CBD20 endp + +; --------------------------------------------------------------------------- + align 10h + +; =============== S U B R O U T I N E ======================================= + +sub_4CBD50 proc near ; CODE XREF: .text:004CC1A1p + ; .text:004CC20Ap ... + +arg_0 = dword ptr 4 + + push esi + mov esi, [esp+4+arg_0] + cmp dword ptr [esi+4], 0FFFFFFFFh + jnz short loc_4CBD88 + mov eax, [esi+64h] + add eax, [esi+60h] + mov ecx, [esi+20h] + push edi + mov edi, 0FFFFFFFEh + sub edi, [esi+58h] + push eax + push ecx + and edi, 0FFFFFC00h + push edi + call sub_4CBD20 + sub [esi+8], edi + sub [esi+4], edi + add esp, 0Ch + sub [esi+0Ch], edi + pop edi + +loc_4CBD88: ; CODE XREF: sub_4CBD50+9j + cmp dword ptr [esi+38h], 0 + jnz short loc_4CBDB9 + mov edx, [esi+0Ch] + sub edx, [esi+4] + mov eax, [esi+44h] + cmp eax, edx + jnz short loc_4CBDB9 + mov ecx, [esi+3Ch] + add ecx, [esi+30h] + sub ecx, [esi] + cmp ecx, eax + ja short loc_4CBDB0 + push esi + call sub_4CBA00 + add esp, 4 + +loc_4CBDB0: ; CODE XREF: sub_4CBD50+55j + push esi + call sub_4CB980 + add esp, 4 + +loc_4CBDB9: ; CODE XREF: sub_4CBD50+3Cj + ; sub_4CBD50+49j + mov edx, [esi+14h] + cmp edx, [esi+18h] + jnz short loc_4CBDC8 + mov dword ptr [esi+14h], 0 + +loc_4CBDC8: ; CODE XREF: sub_4CBD50+6Fj + push esi + call sub_4CBC20 + add esp, 4 + pop esi + retn +sub_4CBD50 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CBDE0 proc near ; CODE XREF: sub_4CC5C0+1B7p + +var_4 = dword ptr -4 +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 +arg_8 = dword ptr 0Ch +arg_C = dword ptr 10h +arg_10 = dword ptr 14h +arg_14 = dword ptr 18h +arg_18 = dword ptr 1Ch +arg_1C = dword ptr 20h +arg_20 = dword ptr 24h +arg_24 = dword ptr 28h + + push ecx + mov edx, [esp+4+arg_4] + mov ecx, [esp+4+arg_10] + mov eax, [esp+4+arg_14] + push ebx + mov [ecx+eax*4], edx + mov ecx, [esp+8+arg_8] + push ebp + push esi + sub ecx, edx + cmp [esp+10h+arg_1C], 0 + push edi + jz loc_4CBEAC + mov ebp, [esp+14h+arg_C] + mov ebx, [esp+14h+arg_24] + jmp short loc_4CBE14 +; --------------------------------------------------------------------------- + align 10h + +loc_4CBE10: ; CODE XREF: sub_4CBDE0+C6j + mov eax, [esp+14h+arg_14] + +loc_4CBE14: ; CODE XREF: sub_4CBDE0+2Dj + mov esi, [esp+14h+arg_18] + sub [esp+14h+arg_1C], 1 + cmp ecx, esi + jnb loc_4CBEAC + mov edx, ebp + sub edx, ecx + cmp eax, ecx + sbb edi, edi + and edi, esi + sub edi, ecx + add edi, eax + mov eax, [esp+14h+arg_10] + mov eax, [eax+edi*4] + mov [esp+14h+arg_4], eax + mov al, [edx+ebx] + cmp al, [ebx+ebp] + jnz short loc_4CBE99 + mov al, [edx] + cmp al, [ebp+0] + jnz short loc_4CBE99 + mov eax, [esp+14h+arg_0] + mov esi, 1 + cmp eax, esi + jz short loc_4CBE7A + sub edx, ebp + lea edi, [ebp+1] + mov [esp+14h+var_4], edx + jmp short loc_4CBE69 +; --------------------------------------------------------------------------- + +loc_4CBE65: ; CODE XREF: sub_4CBDE0+98j + mov edx, [esp+14h+var_4] + +loc_4CBE69: ; CODE XREF: sub_4CBDE0+83j + mov dl, [edx+edi] + cmp dl, [edi] + jnz short loc_4CBE7A + add esi, 1 + add edi, 1 + cmp esi, eax + jnz short loc_4CBE65 + +loc_4CBE7A: ; CODE XREF: sub_4CBDE0+78j + ; sub_4CBDE0+8Ej + cmp ebx, esi + jnb short loc_4CBE99 + mov edx, [esp+14h+arg_20] + mov [edx], esi + add edx, 4 + add ecx, 0FFFFFFFFh + mov [edx], ecx + add edx, 4 + cmp esi, eax + mov ebx, esi + mov [esp+14h+arg_20], edx + jz short loc_4CBEB6 + +loc_4CBE99: ; CODE XREF: sub_4CBDE0+64j + ; sub_4CBDE0+6Bj ... + mov ecx, [esp+14h+arg_8] + sub ecx, [esp+14h+arg_4] + cmp [esp+14h+arg_1C], 0 + jnz loc_4CBE10 + +loc_4CBEAC: ; CODE XREF: sub_4CBDE0+1Fj + ; sub_4CBDE0+3Fj + mov eax, [esp+14h+arg_20] + pop edi + pop esi + pop ebp + pop ebx + pop ecx + retn +; --------------------------------------------------------------------------- + +loc_4CBEB6: ; CODE XREF: sub_4CBDE0+B7j + pop edi + pop esi + pop ebp + mov eax, edx + pop ebx + pop ecx + retn +sub_4CBDE0 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CBEC0 proc near ; CODE XREF: .text:004CC1E7p + ; sub_4CC220+14Ep ... + +var_10 = dword ptr -10h +var_C = dword ptr -0Ch +var_8 = dword ptr -8 +var_4 = dword ptr -4 +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 +arg_8 = dword ptr 0Ch +arg_C = dword ptr 10h +arg_10 = dword ptr 14h +arg_14 = dword ptr 18h +arg_18 = dword ptr 1Ch +arg_1C = dword ptr 20h +arg_20 = dword ptr 24h +arg_24 = dword ptr 28h + + sub esp, 10h + mov eax, [esp+10h+arg_10] + mov edx, [esp+10h+arg_8] + sub edx, [esp+10h+arg_4] + push ebx + push ebp + push esi + push edi + mov edi, [esp+20h+arg_14] + lea eax, [eax+edi*8] + lea ecx, [eax+4] + mov [esp+20h+var_C], ecx + xor ecx, ecx + xor ebx, ebx + cmp [esp+20h+arg_1C], ecx + mov ebp, eax + mov [esp+20h+var_10], ebp + mov [esp+20h+var_8], ecx + mov [esp+20h+var_4], ebx + jnz short loc_4CBF24 + +loc_4CBEF9: ; CODE XREF: sub_4CBEC0+6Fj + ; sub_4CBEC0+151j + mov edx, [esp+20h+var_C] + mov eax, [esp+20h+arg_20] + pop edi + pop esi + mov dword ptr [ebp+0], 0 + pop ebp + mov dword ptr [edx], 0 + pop ebx + add esp, 10h + retn +; --------------------------------------------------------------------------- + jmp short loc_4CBF20 +; --------------------------------------------------------------------------- + align 10h + +loc_4CBF20: ; CODE XREF: sub_4CBEC0+56j + ; sub_4CBEC0+14Bj + mov edi, [esp+20h+arg_14] + +loc_4CBF24: ; CODE XREF: sub_4CBEC0+37j + mov eax, [esp+20h+arg_18] + sub [esp+20h+arg_1C], 1 + cmp edx, eax + jnb short loc_4CBEF9 + cmp edi, edx + sbb esi, esi + and esi, eax + mov eax, [esp+20h+arg_10] + sub esi, edx + add esi, edi + lea eax, [eax+esi*8] + mov esi, [esp+20h+arg_C] + sub esi, edx + cmp ecx, ebx + jb short loc_4CBF4E + mov ecx, ebx + +loc_4CBF4E: ; CODE XREF: sub_4CBEC0+8Aj + mov bl, [ecx+esi] + mov edi, [esp+20h+arg_C] + cmp bl, [ecx+edi] + jnz short loc_4CBFB8 + add ecx, 1 + cmp ecx, [esp+20h+arg_0] + jz short loc_4CBF93 + mov bl, [ecx+esi] + cmp bl, [ecx+edi] + jnz short loc_4CBF93 + add ecx, 1 + cmp ecx, [esp+20h+arg_0] + jz short loc_4CBF93 + mov ebx, edi + mov ebp, esi + lea edi, [ecx+ebx] + sub ebp, ebx + lea ecx, [ecx+0] + +loc_4CBF80: ; CODE XREF: sub_4CBEC0+D1j + mov bl, [edi+ebp] + cmp bl, [edi] + jnz short loc_4CBF93 + add ecx, 1 + add edi, 1 + cmp ecx, [esp+20h+arg_0] + jnz short loc_4CBF80 + +loc_4CBF93: ; CODE XREF: sub_4CBEC0+A1j + ; sub_4CBEC0+A9j ... + cmp [esp+20h+arg_24], ecx + jnb short loc_4CBFB8 + mov edi, [esp+20h+arg_20] + mov [edi], ecx + add edi, 4 + add edx, 0FFFFFFFFh + mov [edi], edx + add edi, 4 + cmp ecx, [esp+20h+arg_0] + mov [esp+20h+arg_24], ecx + mov [esp+20h+arg_20], edi + jz short loc_4CC016 + +loc_4CBFB8: ; CODE XREF: sub_4CBEC0+98j + ; sub_4CBEC0+D7j + mov dl, [ecx+esi] + mov esi, [esp+20h+arg_C] + cmp dl, [ecx+esi] + mov edx, [esp+20h+arg_4] + jnb short loc_4CBFE4 + mov esi, [esp+20h+var_10] + lea ebp, [eax+4] + mov ebx, ecx + mov ecx, [esp+20h+var_8] + mov [esi], edx + mov eax, [ebp+0] + mov [esp+20h+var_10], ebp + mov [esp+20h+var_4], ebx + jmp short loc_4CBFFC +; --------------------------------------------------------------------------- + +loc_4CBFE4: ; CODE XREF: sub_4CBEC0+106j + mov esi, [esp+20h+var_C] + mov ebp, [esp+20h+var_10] + mov ebx, [esp+20h+var_4] + mov [esi], edx + mov [esp+20h+var_C], eax + mov eax, [eax] + mov [esp+20h+var_8], ecx + +loc_4CBFFC: ; CODE XREF: sub_4CBEC0+122j + mov edx, [esp+20h+arg_8] + sub edx, eax + cmp [esp+20h+arg_1C], 0 + mov [esp+20h+arg_4], eax + jnz loc_4CBF20 + jmp loc_4CBEF9 +; --------------------------------------------------------------------------- + +loc_4CC016: ; CODE XREF: sub_4CBEC0+F6j + mov ecx, [eax] + mov edx, [esp+20h+var_10] + mov [edx], ecx + mov eax, [eax+4] + mov ecx, [esp+20h+var_C] + mov [ecx], eax + mov eax, edi + pop edi + pop esi + pop ebp + pop ebx + add esp, 10h + retn +sub_4CBEC0 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + + +sub_4CC040 proc near ; CODE XREF: sub_4CC220+F8p + ; sub_4CC3B0+173p ... + +var_10 = dword ptr -10h +var_C = dword ptr -0Ch +var_8 = dword ptr -8 +var_4 = dword ptr -4 +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 +arg_8 = dword ptr 0Ch +arg_C = dword ptr 10h +arg_10 = dword ptr 14h +arg_14 = dword ptr 18h +arg_18 = dword ptr 1Ch +arg_1C = dword ptr 20h + + sub esp, 10h + mov eax, [esp+10h+arg_10] + mov edx, [esp+10h+arg_4] + push ebx + push ebp + push esi + mov esi, [esp+1Ch+arg_14] + lea eax, [eax+esi*8] + lea ecx, [eax+4] + push edi + mov edi, eax + mov eax, [esp+20h+arg_8] + xor ebx, ebx + xor ebp, ebp + sub eax, edx + cmp [esp+20h+arg_1C], ebx + mov [esp+20h+var_C], ecx + mov [esp+20h+var_10], edi + mov [esp+20h+var_8], ebx + mov [esp+20h+var_4], ebp + jz loc_4CC159 + nop + +loc_4CC080: ; CODE XREF: sub_4CC040+114j + sub [esp+20h+arg_1C], 1 + cmp eax, [esp+20h+arg_18] + jnb loc_4CC159 + cmp esi, eax + sbb ecx, ecx + and ecx, [esp+20h+arg_18] + sub ecx, eax + add ecx, esi + mov esi, [esp+20h+arg_10] + lea edi, [esi+ecx*8] + mov ecx, [esp+20h+arg_C] + sub ecx, eax + cmp ebx, ebp + mov eax, ebx + jb short loc_4CC0B0 + mov eax, ebp + +loc_4CC0B0: ; CODE XREF: sub_4CC040+6Cj + mov bl, [eax+ecx] + mov esi, [esp+20h+arg_C] + cmp bl, [eax+esi] + jnz short loc_4CC102 + add eax, 1 + cmp eax, [esp+20h+arg_0] + jz short loc_4CC0E3 + mov ebx, esi + mov ebp, ecx + lea esi, [eax+ebx] + sub ebp, ebx + mov edi, edi + +loc_4CC0D0: ; CODE XREF: sub_4CC040+A1j + mov bl, [esi+ebp] + cmp bl, [esi] + jnz short loc_4CC0FC + add eax, 1 + add esi, 1 + cmp eax, [esp+20h+arg_0] + jnz short loc_4CC0D0 + +loc_4CC0E3: ; CODE XREF: sub_4CC040+83j + ; sub_4CC040+C0j + mov edx, [edi] + mov eax, [esp+20h+var_10] + mov [eax], edx + mov ecx, [edi+4] + mov edx, [esp+20h+var_C] + pop edi + pop esi + pop ebp + mov [edx], ecx + pop ebx + add esp, 10h + retn +; --------------------------------------------------------------------------- + +loc_4CC0FC: ; CODE XREF: sub_4CC040+95j + cmp eax, [esp+20h+arg_0] + jz short loc_4CC0E3 + +loc_4CC102: ; CODE XREF: sub_4CC040+7Aj + mov cl, [eax+ecx] + mov esi, [esp+20h+arg_C] + cmp cl, [eax+esi] + jnb short loc_4CC129 + mov ecx, [esp+20h+var_10] + mov ebx, [esp+20h+var_8] + add edi, 4 + mov ebp, eax + mov [ecx], edx + mov edx, [edi] + mov [esp+20h+var_10], edi + mov [esp+20h+var_4], ebp + jmp short loc_4CC143 +; --------------------------------------------------------------------------- + +loc_4CC129: ; CODE XREF: sub_4CC040+CCj + mov ecx, [esp+20h+var_C] + mov ebp, [esp+20h+var_4] + mov [ecx], edx + mov edx, [edi] + mov ebx, eax + mov [esp+20h+var_C], edi + mov edi, [esp+20h+var_10] + mov [esp+20h+var_8], ebx + +loc_4CC143: ; CODE XREF: sub_4CC040+E7j + mov eax, [esp+20h+arg_8] + sub eax, edx + cmp [esp+20h+arg_1C], 0 + jz short loc_4CC159 + mov esi, [esp+20h+arg_14] + jmp loc_4CC080 +; --------------------------------------------------------------------------- + +loc_4CC159: ; CODE XREF: sub_4CC040+39j + ; sub_4CC040+49j ... + mov eax, [esp+20h+var_C] + mov dword ptr [edi], 0 + pop edi + pop esi + pop ebp + mov dword ptr [eax], 0 + pop ebx + add esp, 10h + retn +sub_4CC040 endp + +; --------------------------------------------------------------------------- + align 10h + +loc_4CC180: ; DATA XREF: sub_4CCAA0+40o + push esi + mov esi, [esp+8] + mov edx, [esi+10h] + cmp edx, 2 + jnb short loc_4CC1AD + add dword ptr [esi+4], 1 + mov eax, [esi+4] + add dword ptr [esi+14h], 1 + add dword ptr [esi], 1 + cmp eax, [esi+8] + jnz short loc_4CC1A9 + push esi + call sub_4CBD50 + add esp, 4 + +loc_4CC1A9: ; CODE XREF: .text:004CC19Ej + xor eax, eax + pop esi + retn +; --------------------------------------------------------------------------- + +loc_4CC1AD: ; CODE XREF: .text:004CC18Bj + mov eax, [esi] + xor ecx, ecx + mov ch, [eax+1] + push ebx + mov ebx, [esp+10h] + push edi + mov edi, [esi+4] + push 1 + push ebx + mov cl, [eax] + mov eax, ecx + mov ecx, [esi+20h] + lea eax, [ecx+eax*4] + mov ecx, [eax] + mov [eax], edi + mov eax, [esi+2Ch] + push eax + mov eax, [esi+18h] + push eax + mov eax, [esi+14h] + push eax + mov eax, [esi+24h] + push eax + mov eax, [esi] + push eax + mov eax, [esi+4] + push eax + push ecx + push edx + call sub_4CBEC0 + add dword ptr [esi+4], 1 + add dword ptr [esi+14h], 1 + add dword ptr [esi], 1 + mov edi, eax + mov eax, [esi+4] + sub edi, ebx + add esp, 28h + sar edi, 2 + cmp eax, [esi+8] + jnz short loc_4CC212 + push esi + call sub_4CBD50 + add esp, 4 + +loc_4CC212: ; CODE XREF: .text:004CC207j + mov eax, edi + pop edi + pop ebx + pop esi + retn + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CC220 proc near ; DATA XREF: sub_4CCAA0+54o + +var_8 = dword ptr -8 +var_4 = dword ptr -4 +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 + + sub esp, 8 + push esi + mov esi, [esp+0Ch+arg_0] + mov eax, [esi+10h] + cmp eax, 3 + mov [esp+0Ch+arg_0], eax + jnb short loc_4CC259 + mov eax, 1 + add [esi+14h], eax + add [esi], eax + add [esi+4], eax + mov eax, [esi+4] + cmp eax, [esi+8] + jnz short loc_4CC252 + push esi + call sub_4CBD50 + add esp, 4 + +loc_4CC252: ; CODE XREF: sub_4CC220+27j + xor eax, eax + pop esi + add esp, 8 + retn +; --------------------------------------------------------------------------- + +loc_4CC259: ; CODE XREF: sub_4CC220+12j + push ebx + mov ebx, [esi+20h] + push ebp + xor edx, edx + push edi + mov edi, [esi] + mov dh, [edi+2] + movzx ecx, byte ptr [edi] + movzx eax, byte ptr [edi+1] + xor eax, dword_553198[ecx*4] + xor edx, eax + and edx, [esi+28h] + mov ecx, eax + mov ebp, [ebx+edx*4+1000h] + mov eax, [esi+4] + and ecx, 3FFh + sub eax, [ebx+ecx*4] + mov [esp+18h+var_8], ebp + mov ebp, [esi+4] + mov [ebx+edx*4+1000h], ebp + mov ebx, [esi+20h] + mov edx, [ebx+edx*4+1000h] + mov [ebx+ecx*4], edx + mov ebx, [esp+18h+arg_4] + xor ebp, ebp + cmp eax, [esi+18h] + mov ecx, 2 + jnb loc_4CC348 + mov edx, edi + sub edx, eax + mov [esp+18h+var_4], edx + mov dl, [edx] + cmp dl, [edi] + jnz short loc_4CC348 + mov edx, [esp+18h+arg_0] + cmp edx, ecx + jz short loc_4CC2EA + +loc_4CC2D3: ; CODE XREF: sub_4CC220+C4j + mov ebx, [esp+18h+var_4] + mov bl, [ebx+ecx] + cmp bl, [ecx+edi] + jnz short loc_4CC2E6 + add ecx, 1 + cmp ecx, edx + jnz short loc_4CC2D3 + +loc_4CC2E6: ; CODE XREF: sub_4CC220+BDj + mov ebx, [esp+18h+arg_4] + +loc_4CC2EA: ; CODE XREF: sub_4CC220+B1j + add eax, 0FFFFFFFFh + cmp ecx, edx + mov [ebx], ecx + mov [ebx+4], eax + mov ebp, 2 + jnz short loc_4CC34C + mov eax, [esi+2Ch] + mov ecx, [esi+18h] + push eax + mov eax, [esi+14h] + push ecx + mov ecx, [esi+24h] + push eax + mov eax, [esi] + push ecx + mov ecx, [esi+4] + push eax + mov eax, [esp+2Ch+var_8] + push ecx + push eax + push edx + call sub_4CC040 + mov eax, 1 + add [esi+14h], eax + add [esi], eax + add [esi+4], eax + mov eax, [esi+4] + add esp, 20h + cmp eax, [esi+8] + jnz short loc_4CC33E + push esi + call sub_4CBD50 + add esp, 4 + +loc_4CC33E: ; CODE XREF: sub_4CC220+113j + pop edi + mov eax, ebp + pop ebp + pop ebx + pop esi + add esp, 8 + retn +; --------------------------------------------------------------------------- + +loc_4CC348: ; CODE XREF: sub_4CC220+97j + ; sub_4CC220+A9j + mov edx, [esp+18h+arg_0] + +loc_4CC34C: ; CODE XREF: sub_4CC220+D9j + mov eax, [esi+2Ch] + push ecx + lea ecx, [ebx+ebp*4] + push ecx + mov ecx, [esi+18h] + push eax + mov eax, [esi+14h] + push ecx + mov ecx, [esi+24h] + push eax + mov eax, [esi] + push ecx + mov ecx, [esi+4] + push eax + mov eax, [esp+34h+var_8] + push ecx + push eax + push edx + call sub_4CBEC0 + mov edi, eax + mov eax, 1 + add [esi+14h], eax + add [esi], eax + add [esi+4], eax + mov eax, [esi+4] + sub edi, ebx + add esp, 28h + sar edi, 2 + cmp eax, [esi+8] + jnz short loc_4CC39B + push esi + call sub_4CBD50 + add esp, 4 + +loc_4CC39B: ; CODE XREF: sub_4CC220+170j + mov eax, edi + pop edi + pop ebp + pop ebx + pop esi + add esp, 8 + retn +sub_4CC220 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CC3B0 proc near ; DATA XREF: sub_4CCAA0:loc_4CCB03o + +var_10 = dword ptr -10h +var_8 = dword ptr -8 +var_4 = dword ptr -4 +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 + + sub esp, 10h + push esi + mov esi, [esp+14h+arg_0] + mov eax, [esi+10h] + cmp eax, 4 + mov [esp+14h+arg_0], eax + jnb short loc_4CC3E9 + mov eax, 1 + add [esi+14h], eax + add [esi], eax + add [esi+4], eax + mov eax, [esi+4] + cmp eax, [esi+8] + jnz short loc_4CC3E2 + push esi + call sub_4CBD50 + add esp, 4 + +loc_4CC3E2: ; CODE XREF: sub_4CC3B0+27j + xor eax, eax + pop esi + add esp, 10h + retn +; --------------------------------------------------------------------------- + +loc_4CC3E9: ; CODE XREF: sub_4CC3B0+12j + push ebx + push ebp + push edi + mov edi, [esi] + movzx eax, byte ptr [edi] + movzx edx, byte ptr [edi+1] + xor edx, dword_553198[eax*4] + movzx eax, byte ptr [edi+2] + movzx ebp, byte ptr [edi+3] + mov ecx, eax + add eax, eax + add eax, eax + add eax, eax + xor eax, dword_553198[ebp*4] + mov ebp, [esi+4] + shl eax, 5 + shl ecx, 8 + xor eax, edx + and eax, [esi+28h] + xor ecx, edx + mov ebx, edx + mov edx, [esi+20h] + and ebx, 3FFh + sub ebp, [edx+ebx*4] + and ecx, 0FFFFh + mov [esp+20h+var_4], ebp + mov ebp, [esi+4] + sub ebp, [edx+ecx*4+1000h] + mov [esp+20h+var_10], ebp + mov ebp, [edx+eax*4+41000h] + mov [esp+20h+var_8], ebp + mov ebp, [esi+4] + mov [edx+eax*4+41000h], ebp + mov edx, [esi+20h] + mov eax, [edx+eax*4+41000h] + mov [edx+ecx*4+1000h], eax + mov eax, [esi+20h] + mov ecx, [eax+ecx*4+1000h] + mov [eax+ebx*4], ecx + mov ecx, [esp+20h+var_4] + mov ebx, [esp+20h+arg_4] + xor ebp, ebp + cmp ecx, [esi+18h] + mov eax, 1 + jnb short loc_4CC4A9 + mov edx, edi + sub edx, ecx + mov dl, [edx] + cmp dl, [edi] + jnz short loc_4CC4A9 + mov eax, 2 + lea edx, [ecx-1] + mov [ebx], eax + mov [ebx+4], edx + mov ebp, eax + +loc_4CC4A9: ; CODE XREF: sub_4CC3B0+DEj + ; sub_4CC3B0+E8j + mov edx, [esp+20h+var_10] + cmp ecx, edx + jz short loc_4CC4D5 + cmp edx, [esi+18h] + jnb short loc_4CC4D5 + mov edx, edi + sub edx, [esp+20h+var_10] + mov dl, [edx] + cmp dl, [edi] + jnz short loc_4CC4D5 + mov ecx, [esp+20h+var_10] + lea edx, [ecx-1] + mov [ebx+ebp*4+4], edx + mov eax, 3 + add ebp, 2 + +loc_4CC4D5: ; CODE XREF: sub_4CC3B0+FFj + ; sub_4CC3B0+104j ... + test ebp, ebp + mov edx, [esp+20h+arg_0] + jz short loc_4CC553 + cmp eax, edx + jz short loc_4CC4FE + mov edx, eax + sub edx, ecx + add edx, edi + +loc_4CC4E7: ; CODE XREF: sub_4CC3B0+148j + mov cl, [edx] + cmp cl, [eax+edi] + jnz short loc_4CC4FA + add eax, 1 + add edx, 1 + cmp eax, [esp+20h+arg_0] + jnz short loc_4CC4E7 + +loc_4CC4FA: ; CODE XREF: sub_4CC3B0+13Cj + mov edx, [esp+20h+arg_0] + +loc_4CC4FE: ; CODE XREF: sub_4CC3B0+12Fj + cmp eax, edx + mov [ebx+ebp*4-8], eax + jnz short loc_4CC553 + mov eax, [esi+2Ch] + mov ecx, [esi+18h] + push eax + mov eax, [esi+14h] + push ecx + mov ecx, [esi+24h] + push eax + mov eax, [esi] + push ecx + mov ecx, [esi+4] + push eax + mov eax, [esp+34h+var_8] + push ecx + push eax + push edx + call sub_4CC040 + mov eax, 1 + add [esi+14h], eax + add [esi], eax + add [esi+4], eax + mov eax, [esi+4] + add esp, 20h + cmp eax, [esi+8] + jnz short loc_4CC549 + push esi + call sub_4CBD50 + add esp, 4 + +loc_4CC549: ; CODE XREF: sub_4CC3B0+18Ej + pop edi + mov eax, ebp + pop ebp + pop ebx + pop esi + add esp, 10h + retn +; --------------------------------------------------------------------------- + +loc_4CC553: ; CODE XREF: sub_4CC3B0+12Bj + ; sub_4CC3B0+154j + cmp eax, 3 + jnb short loc_4CC55D + mov eax, 3 + +loc_4CC55D: ; CODE XREF: sub_4CC3B0+1A6j + push eax + mov eax, [esi+2Ch] + lea ecx, [ebx+ebp*4] + push ecx + mov ecx, [esi+18h] + push eax + mov eax, [esi+14h] + push ecx + mov ecx, [esi+24h] + push eax + mov eax, [esi] + push ecx + mov ecx, [esi+4] + push eax + mov eax, [esp+3Ch+var_8] + push ecx + push eax + push edx + call sub_4CBEC0 + mov edi, eax + mov eax, 1 + add [esi+14h], eax + add [esi], eax + add [esi+4], eax + mov eax, [esi+4] + sub edi, ebx + add esp, 28h + sar edi, 2 + cmp eax, [esi+8] + jnz short loc_4CC5AC + push esi + call sub_4CBD50 + add esp, 4 + +loc_4CC5AC: ; CODE XREF: sub_4CC3B0+1F1j + mov eax, edi + pop edi + pop ebp + pop ebx + pop esi + add esp, 10h + retn +sub_4CC3B0 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CC5C0 proc near ; DATA XREF: sub_4CCAA0+29o + +var_10 = dword ptr -10h +var_8 = dword ptr -8 +var_4 = dword ptr -4 +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 + + sub esp, 10h + push esi + mov esi, [esp+14h+arg_0] + mov eax, [esi+10h] + cmp eax, 4 + mov [esp+14h+arg_0], eax + jnb short loc_4CC5F9 + mov eax, 1 + add [esi+14h], eax + add [esi], eax + add [esi+4], eax + mov eax, [esi+4] + cmp eax, [esi+8] + jnz short loc_4CC5F2 + push esi + call sub_4CBD50 + add esp, 4 + +loc_4CC5F2: ; CODE XREF: sub_4CC5C0+27j + xor eax, eax + pop esi + add esp, 10h + retn +; --------------------------------------------------------------------------- + +loc_4CC5F9: ; CODE XREF: sub_4CC5C0+12j + push ebx + push ebp + push edi + mov edi, [esi] + movzx eax, byte ptr [edi] + movzx edx, byte ptr [edi+1] + xor edx, dword_553198[eax*4] + movzx eax, byte ptr [edi+2] + movzx ebp, byte ptr [edi+3] + mov ecx, eax + add eax, eax + add eax, eax + add eax, eax + xor eax, dword_553198[ebp*4] + mov ebp, [esi+4] + shl eax, 5 + shl ecx, 8 + xor eax, edx + and eax, [esi+28h] + xor ecx, edx + mov ebx, edx + mov edx, [esi+20h] + and ebx, 3FFh + sub ebp, [edx+ebx*4] + and ecx, 0FFFFh + mov [esp+20h+var_4], ebp + mov ebp, [esi+4] + sub ebp, [edx+ecx*4+1000h] + mov [esp+20h+var_10], ebp + mov ebp, [edx+eax*4+41000h] + mov [esp+20h+var_8], ebp + mov ebp, [esi+4] + mov [edx+eax*4+41000h], ebp + mov edx, [esi+20h] + mov eax, [edx+eax*4+41000h] + mov [edx+ecx*4+1000h], eax + mov eax, [esi+20h] + mov ecx, [eax+ecx*4+1000h] + mov [eax+ebx*4], ecx + mov ecx, [esp+20h+var_4] + mov ebx, [esp+20h+arg_4] + xor ebp, ebp + cmp ecx, [esi+18h] + mov eax, 1 + jnb short loc_4CC6B9 + mov edx, edi + sub edx, ecx + mov dl, [edx] + cmp dl, [edi] + jnz short loc_4CC6B9 + mov eax, 2 + lea edx, [ecx-1] + mov [ebx], eax + mov [ebx+4], edx + mov ebp, eax + +loc_4CC6B9: ; CODE XREF: sub_4CC5C0+DEj + ; sub_4CC5C0+E8j + mov edx, [esp+20h+var_10] + cmp ecx, edx + jz short loc_4CC6E5 + cmp edx, [esi+18h] + jnb short loc_4CC6E5 + mov edx, edi + sub edx, [esp+20h+var_10] + mov dl, [edx] + cmp dl, [edi] + jnz short loc_4CC6E5 + mov ecx, [esp+20h+var_10] + lea edx, [ecx-1] + mov [ebx+ebp*4+4], edx + mov eax, 3 + add ebp, 2 + +loc_4CC6E5: ; CODE XREF: sub_4CC5C0+FFj + ; sub_4CC5C0+104j ... + test ebp, ebp + jz short loc_4CC747 + cmp eax, [esp+20h+arg_0] + jz short loc_4CC708 + mov edx, eax + sub edx, ecx + add edx, edi + +loc_4CC6F5: ; CODE XREF: sub_4CC5C0+146j + mov cl, [edx] + cmp cl, [eax+edi] + jnz short loc_4CC708 + add eax, 1 + add edx, 1 + cmp eax, [esp+20h+arg_0] + jnz short loc_4CC6F5 + +loc_4CC708: ; CODE XREF: sub_4CC5C0+12Dj + ; sub_4CC5C0+13Aj + cmp eax, [esp+20h+arg_0] + mov [ebx+ebp*4-8], eax + jnz short loc_4CC747 + mov edx, [esi+14h] + mov eax, [esi+24h] + mov ecx, [esp+20h+var_8] + mov [eax+edx*4], ecx + mov eax, 1 + add [esi+14h], eax + add [esi], eax + add [esi+4], eax + mov eax, [esi+4] + cmp eax, [esi+8] + jnz short loc_4CC73D + push esi + call sub_4CBD50 + add esp, 4 + +loc_4CC73D: ; CODE XREF: sub_4CC5C0+172j + pop edi + mov eax, ebp + pop ebp + pop ebx + pop esi + add esp, 10h + retn +; --------------------------------------------------------------------------- + +loc_4CC747: ; CODE XREF: sub_4CC5C0+127j + ; sub_4CC5C0+150j + cmp eax, 3 + jnb short loc_4CC751 + mov eax, 3 + +loc_4CC751: ; CODE XREF: sub_4CC5C0+18Aj + mov ecx, [esi+18h] + push eax + mov eax, [esi+2Ch] + lea edx, [ebx+ebp*4] + push edx + mov edx, [esi+14h] + push eax + mov eax, [esi+24h] + push ecx + mov ecx, [esi] + push edx + mov edx, [esi+4] + push eax + mov eax, [esp+38h+var_8] + push ecx + mov ecx, [esp+3Ch+arg_0] + push edx + push eax + push ecx + call sub_4CBDE0 + mov edi, eax + mov eax, 1 + add [esi+14h], eax + add [esi], eax + add [esi+4], eax + mov eax, [esi+4] + sub edi, ebx + add esp, 28h + sar edi, 2 + cmp eax, [esi+8] + jnz short loc_4CC7A4 + push esi + call sub_4CBD50 + add esp, 4 + +loc_4CC7A4: ; CODE XREF: sub_4CC5C0+1D9j + mov eax, edi + pop edi + pop ebp + pop ebx + pop esi + add esp, 10h + retn +sub_4CC5C0 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CC7B0 proc near ; DATA XREF: sub_4CCAA0+47o + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 + + push ebx + push ebp + mov ebp, [esp+8+arg_4] + push esi + mov esi, [esp+0Ch+arg_0] + push edi + mov edi, 1 + +loc_4CC7C1: ; CODE XREF: sub_4CC7B0+6Dj + mov edx, [esi+10h] + cmp edx, 2 + jb short loc_4CC802 + mov eax, [esi] + mov ebx, [esi+4] + xor ecx, ecx + mov ch, [eax+1] + mov cl, [eax] + mov eax, ecx + mov ecx, [esi+20h] + lea eax, [ecx+eax*4] + mov ecx, [eax] + mov [eax], ebx + mov eax, [esi+2Ch] + push eax + mov eax, [esi+18h] + push eax + mov eax, [esi+14h] + push eax + mov eax, [esi+24h] + push eax + mov eax, [esi] + push eax + mov eax, [esi+4] + push eax + push ecx + push edx + call sub_4CC040 + add esp, 20h + +loc_4CC802: ; CODE XREF: sub_4CC7B0+17j + add [esi+4], edi + mov eax, [esi+4] + add [esi+14h], edi + add [esi], edi + cmp eax, [esi+8] + jnz short loc_4CC81B + push esi + call sub_4CBD50 + add esp, 4 + +loc_4CC81B: ; CODE XREF: sub_4CC7B0+60j + sub ebp, edi + jnz short loc_4CC7C1 + pop edi + pop esi + pop ebp + pop ebx + retn +sub_4CC7B0 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CC830 proc near ; DATA XREF: sub_4CCAA0+5Bo + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 + + push ebx + push ebp + push esi + mov esi, [esp+0Ch+arg_0] + push edi + mov edi, 1 + lea ecx, [ecx+0] + +loc_4CC840: ; CODE XREF: sub_4CC830+9Fj + mov ebp, [esi+10h] + cmp ebp, 3 + jb short loc_4CC8B2 + mov ecx, [esi] + movzx edx, byte ptr [ecx] + movzx eax, byte ptr [ecx+1] + xor eax, dword_553198[edx*4] + mov ebx, [esi+4] + xor edx, edx + mov dh, [ecx+2] + xor edx, eax + and edx, [esi+28h] + and eax, 3FFh + mov ecx, edx + mov edx, [esi+20h] + mov edi, [edx+ecx*4+1000h] + lea edx, [edx+ecx*4+1000h] + mov [edx], ebx + mov edx, [esi+20h] + mov ecx, [edx+ecx*4+1000h] + mov [edx+eax*4], ecx + mov edx, [esi+2Ch] + mov eax, [esi+18h] + mov ecx, [esi+14h] + push edx + mov edx, [esi+24h] + push eax + mov eax, [esi] + push ecx + mov ecx, [esi+4] + push edx + push eax + push ecx + push edi + push ebp + call sub_4CC040 + add esp, 20h + mov edi, 1 + +loc_4CC8B2: ; CODE XREF: sub_4CC830+16j + add [esi+4], edi + mov eax, [esi+4] + add [esi+14h], edi + add [esi], edi + cmp eax, [esi+8] + jnz short loc_4CC8CB + push esi + call sub_4CBD50 + add esp, 4 + +loc_4CC8CB: ; CODE XREF: sub_4CC830+90j + sub [esp+10h+arg_4], edi + jnz loc_4CC840 + pop edi + pop esi + pop ebp + pop ebx + retn +sub_4CC830 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CC8E0 proc near ; DATA XREF: sub_4CCAA0+6Ao + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 + + push ebx + push ebp + push esi + mov esi, [esp+0Ch+arg_0] + push edi + mov edi, 1 + lea ecx, [ecx+0] + +loc_4CC8F0: ; CODE XREF: sub_4CC8E0+D6j + mov eax, [esi+10h] + cmp eax, 4 + mov [esp+10h+arg_0], eax + jb loc_4CC999 + mov eax, [esi] + movzx edi, byte ptr [eax+2] + movzx edx, byte ptr [eax] + movzx ebx, byte ptr [eax+3] + movzx ecx, byte ptr [eax+1] + xor ecx, dword_553198[edx*4] + mov ebp, [esi+4] + lea eax, ds:0[edi*8] + xor eax, dword_553198[ebx*4] + mov edx, edi + mov edi, [esi+20h] + shl eax, 5 + xor eax, ecx + and eax, [esi+28h] + shl edx, 8 + mov ebx, [edi+eax*4+41000h] + xor edx, ecx + and edx, 0FFFFh + mov [edi+edx*4+1000h], ebp + mov edi, [esi+20h] + mov edx, [edi+edx*4+1000h] + and ecx, 3FFh + mov [edi+ecx*4], edx + mov ecx, [esi+20h] + mov edx, [esi+4] + mov [ecx+eax*4+41000h], edx + mov eax, [esi+2Ch] + mov ecx, [esi+18h] + mov edx, [esi+14h] + push eax + mov eax, [esi+24h] + push ecx + mov ecx, [esi] + push edx + mov edx, [esi+4] + push eax + mov eax, [esp+20h+arg_0] + push ecx + push edx + push ebx + push eax + call sub_4CC040 + add esp, 20h + mov edi, 1 + +loc_4CC999: ; CODE XREF: sub_4CC8E0+1Aj + add [esi+4], edi + mov eax, [esi+4] + add [esi+14h], edi + add [esi], edi + cmp eax, [esi+8] + jnz short loc_4CC9B2 + push esi + call sub_4CBD50 + add esp, 4 + +loc_4CC9B2: ; CODE XREF: sub_4CC8E0+C7j + sub [esp+10h+arg_4], edi + jnz loc_4CC8F0 + pop edi + pop esi + pop ebp + pop ebx + retn +sub_4CC8E0 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CC9D0 proc near ; DATA XREF: sub_4CCAA0+30o + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 + + push ebx + push ebp + push esi + mov esi, [esp+0Ch+arg_0] + push edi + mov edi, 1 + lea ecx, [ecx+0] + +loc_4CC9E0: ; CODE XREF: sub_4CC9D0+BAj + cmp dword ptr [esi+10h], 4 + jb loc_4CCA6D + mov eax, [esi] + movzx edi, byte ptr [eax+2] + movzx edx, byte ptr [eax] + movzx ebx, byte ptr [eax+3] + movzx ecx, byte ptr [eax+1] + xor ecx, dword_553198[edx*4] + mov ebp, [esi+4] + lea eax, ds:0[edi*8] + xor eax, dword_553198[ebx*4] + mov edx, edi + mov edi, [esi+20h] + shl eax, 5 + xor eax, ecx + and eax, [esi+28h] + mov ebx, [edi+eax*4+41000h] + lea edi, [edi+eax*4+41000h] + mov [edi], ebp + mov edi, [esi+20h] + mov eax, [edi+eax*4+41000h] + shl edx, 8 + xor edx, ecx + and edx, 0FFFFh + mov [edi+edx*4+1000h], eax + mov eax, [esi+20h] + mov edx, [eax+edx*4+1000h] + and ecx, 3FFh + mov [eax+ecx*4], edx + mov eax, [esi+14h] + mov ecx, [esi+24h] + mov [ecx+eax*4], ebx + mov edi, 1 + +loc_4CCA6D: ; CODE XREF: sub_4CC9D0+14j + add [esi+4], edi + mov eax, [esi+4] + add [esi+14h], edi + add [esi], edi + cmp eax, [esi+8] + jnz short loc_4CCA86 + push esi + call sub_4CBD50 + add esp, 4 + +loc_4CCA86: ; CODE XREF: sub_4CC9D0+ABj + sub [esp+10h+arg_4], edi + jnz loc_4CC9E0 + pop edi + pop esi + pop ebp + pop ebx + retn +sub_4CC9D0 endp + +; =============== S U B R O U T I N E ======================================= + +sub_4CCAA0 proc near ; CODE XREF: sub_4D0270+F3p + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 + + mov eax, [esp+arg_4] + mov ecx, [esp+arg_0] + mov dword ptr [eax], offset sub_4CBC80 + mov dword ptr [eax+4], offset loc_4CB960 + mov dword ptr [eax+8], offset loc_4CB970 + mov dword ptr [eax+0Ch], offset loc_4CB950 + cmp dword ptr [ecx+50h], 0 + jnz short loc_4CCAD8 + mov dword ptr [eax+10h], offset sub_4CC5C0 + mov dword ptr [eax+14h], offset sub_4CC9D0 + retn +; --------------------------------------------------------------------------- + +loc_4CCAD8: ; CODE XREF: sub_4CCAA0+27j + mov ecx, [ecx+48h] + cmp ecx, 2 + jnz short loc_4CCAEF + mov dword ptr [eax+10h], offset loc_4CC180 + mov dword ptr [eax+14h], offset sub_4CC7B0 + retn +; --------------------------------------------------------------------------- + +loc_4CCAEF: ; CODE XREF: sub_4CCAA0+3Ej + cmp ecx, 3 + jnz short loc_4CCB03 + mov dword ptr [eax+10h], offset sub_4CC220 + mov dword ptr [eax+14h], offset sub_4CC830 + retn +; --------------------------------------------------------------------------- + +loc_4CCB03: ; CODE XREF: sub_4CCAA0+52j + mov dword ptr [eax+10h], offset sub_4CC3B0 + mov dword ptr [eax+14h], offset sub_4CC8E0 + retn +sub_4CCAA0 endp + +; --------------------------------------------------------------------------- + +Interface1_AddRef proc near ; DATA XREF: .rdata:00517A94o +;sub_4CCB80 + +arg_0 = dword ptr 4 + mov eax, [esp+arg_0] + add dword ptr [eax+4], 1 + mov eax, [eax+4] + retn 4 +Interface1_AddRef endp + +; --------------------------------------------------------------------------- + +sub_4CCB20 proc near ; DATA XREF: .rdata:00517A9Co + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 +arg_8 = dword ptr 0Ch +arg_C = dword ptr 10h + + push esi + mov esi, [esp+4+arg_0] + mov ecx, [esi+10h] + sub ecx, [esi+18h] + mov eax, [esi+14h] + sbb eax, [esi+1Ch] + xor edx, edx + cmp edx, eax + push edi + mov edi, [esp+8+arg_8] + jb short loc_4CCB48 + ja short loc_4CCB42 + cmp edi, ecx + jbe short loc_4CCB48 + +loc_4CCB42: ; CODE XREF: sub_4CCB20+1Cj + mov edi, [esi+10h] + sub edi, [esi+18h] + +loc_4CCB48: ; CODE XREF: sub_4CCB20+1Aj + ; sub_4CCB20+20j + mov eax, [esp+8+arg_C] + test eax, eax + jz short loc_4CCB52 + mov [eax], edi + +loc_4CCB52: ; CODE XREF: sub_4CCB20+2Ej + test edi, edi + jz short loc_4CCB72 + mov eax, [esi+8] + add eax, [esi+18h] + mov ecx, [esp+8+arg_4] + push edi ; size_t + push eax ; void * + push ecx ; void * + call _memcpy ; Microsoft VisualC 2-8/net runtime + add esp, 0Ch + add [esi+18h], edi + adc dword ptr [esi+1Ch], 0 + +loc_4CCB72: ; CODE XREF: sub_4CCB20+34j + pop edi + xor eax, eax + pop esi + retn 10h +sub_4CCB20 endp + +; --------------------------------------------------------------------------- + +sub_4CCB90 proc near ; DATA XREF: .rdata:00517AB0o + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 +arg_8 = dword ptr 0Ch +arg_C = dword ptr 10h + + push ebx + mov ebx, [esp+4+arg_8] + push esi + mov esi, [esp+8+arg_0] + mov ecx, [esi+10h] + mov eax, [esi+14h] + push edi + xor edi, edi + sub ecx, [esi+18h] + sbb eax, [esi+1Ch] + cmp edi, eax + jb short loc_4CCBC2 + ja short loc_4CCBB3 + cmp ebx, ecx + jbe short loc_4CCBC2 + +loc_4CCBB3: ; CODE XREF: sub_4CCB90+1Dj + pop edi + mov byte ptr [esi+20h], 1 + pop esi + mov eax, 80004005h + pop ebx + retn 10h + +loc_4CCBC2: ; CODE XREF: sub_4CCB90+1Bj + ; sub_4CCB90+21j + mov ecx, [esi+8] + mov eax, [esp+0Ch+arg_4] + add ecx, [esi+18h] + push ebx ; size_t + push eax ; void * + push ecx ; void * + call _memcpy ; Microsoft VisualC 2-8/net runtime + mov eax, [esp+18h+arg_C] + add esp, 0Ch + add [esi+18h], ebx + adc [esi+1Ch], edi + test eax, eax + jz short loc_4CCBE7 + mov [eax], ebx + +loc_4CCBE7: ; CODE XREF: sub_4CCB90+53j + pop edi + pop esi + xor eax, eax + pop ebx + retn 10h +sub_4CCB90 endp + +; --------------------------------------------------------------------------- + align 10h +; --------------------------------------------------------------------------- + +LzmaProps_Decode proc near ; CODE XREF: Decompress_lzma_internal+35p +;sub_4CCBF0 + +propsRes = dword ptr 4 +propsData = dword ptr 8 +propsSize = dword ptr 0Ch + + cmp [esp+propsSize], 5 ; LZMA_PROPS_SIZE + jge short loc_4CCBFD + +loc_4CCBF7: ; CODE XREF: LzmaProps_Decode+16j + mov eax, 1 + retn +; --------------------------------------------------------------------------- + +loc_4CCBFD: ; CODE XREF: LzmaProps_Decode+5j + mov eax, [esp+propsData] + mov cl, [eax] + cmp cl, 0E1h ; 9 * 5 * 5 + jnb short loc_4CCBF7 + cmp cl, 2Dh + push edi + mov edi, [esp+4+propsRes] + mov dword ptr [edi+8], 0 + jb short loc_4CCC40 + push esi + movzx esi, cl + mov eax, 6C16C16Dh + mul esi + mov eax, esi + sub eax, edx + shr eax, 1 + add eax, edx + shr eax, 5 + movzx eax, al + mov edx, eax + pop esi + +loc_4CCC35: ; CODE XREF: LzmaProps_Decode+4Bj + add cl, 0D3h + sub eax, 1 + jnz short loc_4CCC35 + mov [edi+8], edx + +loc_4CCC40: ; CODE XREF: LzmaProps_Decode+27j + cmp cl, 9 + mov dword ptr [edi+4], 0 + jb short loc_4CCC6B + movzx edx, cl + mov eax, 38E38E39h + mul edx + shr edx, 1 + movzx eax, dl + mov edx, eax + lea ecx, [ecx+0] + +loc_4CCC60: ; CODE XREF: LzmaProps_Decode+76j + add cl, 0F7h + sub eax, 1 + jnz short loc_4CCC60 + mov [edi+4], edx + +loc_4CCC6B: ; CODE XREF: LzmaProps_Decode+5Aj + movzx eax, cl + mov [edi], eax + xor eax, eax + pop edi + retn +LzmaProps_Decode endp + +sub_4CCC80 proc near ; CODE XREF: Decompress_lzma_internal+97p + +var_3C = dword ptr -3Ch +var_38 = dword ptr -38h +var_34 = dword ptr -34h +var_30 = dword ptr -30h +var_2C = dword ptr -2Ch +var_28 = dword ptr -28h +var_24 = dword ptr -24h +var_20 = dword ptr -20h +var_1C = dword ptr -1Ch +var_18 = dword ptr -18h +var_14 = dword ptr -14h +var_10 = dword ptr -10h +var_C = dword ptr -0Ch +var_8 = dword ptr -8 +var_4 = dword ptr -4 +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 +arg_8 = dword ptr 0Ch +arg_C = dword ptr 10h +arg_10 = dword ptr 14h +arg_14 = dword ptr 18h +arg_18 = dword ptr 1Ch + + sub esp, 3Ch + mov eax, [esp+3Ch+arg_0] + mov ecx, [eax+8] + push ebx + push ebp + mov ebp, 1 + mov edx, ebp + shl edx, cl + mov ecx, [eax+4] + xor ebx, ebx + push esi + sub edx, ebp + mov [esp+48h+var_C], edx + mov edx, ebp + shl edx, cl + mov ecx, [esp+48h+arg_C] + push edi + mov edi, [eax+0Ch] + sub edx, ebp + mov [esp+4Ch+var_8], edx + mov edx, [eax] + mov [ecx], ebx + mov ecx, [esp+4Ch+arg_18] + mov [ecx], ebx + mov ecx, [eax+4] + add ecx, edx + mov eax, 300h + shl eax, cl + mov [esp+4Ch+var_20], edi + mov [esp+4Ch+var_2C], ebx + mov byte ptr [esp+4Ch+arg_0], bl + add eax, 736h + mov [esp+4Ch+var_14], edx + mov [esp+4Ch+var_34], ebx + mov [esp+4Ch+var_38], ebp + mov [esp+4Ch+var_24], ebp + mov [esp+4Ch+var_28], ebp + mov [esp+4Ch+var_18], ebp + jz short loc_4CCD04 + mov ecx, eax + shr ecx, 1 + mov eax, 4000400h + rep stosd + adc ecx, ecx + rep stosw + +loc_4CCD04: ; CODE XREF: sub_4CCC80+72j + mov edx, [esp+4Ch+arg_8] + mov ecx, [esp+4Ch+arg_4] + lea edi, [ecx+edx] + xor esi, esi + or eax, 0FFFFFFFFh + mov [esp+4Ch+var_3C], edi + xor edx, edx + lea ebx, [ebx+0] + +loc_4CCD20: ; CODE XREF: sub_4CCC80+BCj + cmp ecx, edi + jz loc_4CCF0B + movzx ebp, byte ptr [ecx] + shl esi, 8 + or esi, ebp + mov ebp, 1 + add edx, ebp + add ecx, ebp + cmp edx, 5 + jl short loc_4CCD20 + cmp [esp+4Ch+arg_14], ebx + mov [esp+4Ch+arg_8], ecx + jbe loc_4CCFCD + lea esp, [esp+0] + +loc_4CCD50: ; CODE XREF: sub_4CCC80+32Dj + mov edx, [esp+4Ch+var_34] + mov ecx, [esp+4Ch+var_C] + and ecx, [esp+4Ch+var_2C] + mov edi, [esp+4Ch+var_20] + mov ebx, edx + shl ebx, 4 + add ebx, ecx + cmp eax, 1000000h + lea ebx, [edi+ebx*2] + mov [esp+4Ch+var_1C], ecx + mov [esp+4Ch+var_30], ebx + jnb short loc_4CCD99 + mov ecx, [esp+4Ch+arg_8] + cmp ecx, [esp+4Ch+var_3C] + jz loc_4CD6E2 + movzx ebp, byte ptr [ecx] + shl esi, 8 + shl eax, 8 + or esi, ebp + add ecx, 1 + mov [esp+4Ch+arg_8], ecx + +loc_4CCD99: ; CODE XREF: sub_4CCC80+F7j + movzx ebx, word ptr [ebx] + movzx ebp, bx + mov ecx, eax + shr ecx, 0Bh + imul ecx, ebp + cmp esi, ecx + jnb loc_4CCFF4 + mov edi, [esp+4Ch+var_30] + mov eax, ecx + mov ecx, 800h + sub ecx, ebp + mov ebp, [esp+4Ch+var_8] + sar ecx, 5 + add ecx, ebx + movzx ebx, byte ptr [esp+4Ch+arg_0] + mov [edi], cx + mov edi, [esp+4Ch+var_2C] + mov ecx, 8 + sub cl, byte ptr [esp+4Ch+var_14] + and ebp, edi + shr ebx, cl + mov ecx, [esp+4Ch+var_14] + shl ebp, cl + mov ecx, [esp+4Ch+var_20] + mov edx, 1 + add ebx, ebp + imul ebx, 600h + cmp [esp+4Ch+var_34], 7 + lea ebp, [ebx+ecx+0E6Ch] + mov [esp+4Ch+var_30], ebp + jl loc_4CCEB0 + sub edi, [esp+4Ch+var_38] + mov ecx, [esp+4Ch+arg_10] + movzx ebx, byte ptr [edi+ecx] + jmp short loc_4CCE20 +; --------------------------------------------------------------------------- + align 10h + +loc_4CCE20: ; CODE XREF: sub_4CCC80+197j + ; sub_4CCC80+2C6j + add ebx, ebx + mov [esp+4Ch+var_10], ebx + and ebx, 100h + cmp eax, 1000000h + lea ecx, [ebx+edx] + lea ebp, [ebp+ecx*2+200h] + mov [esp+4Ch+arg_0], ebp + jnb short loc_4CCE61 + mov ecx, [esp+4Ch+arg_8] + cmp ecx, [esp+4Ch+var_3C] + jz loc_4CD6E2 + movzx edi, byte ptr [ecx] + shl esi, 8 + shl eax, 8 + or esi, edi + add ecx, 1 + mov [esp+4Ch+arg_8], ecx + +loc_4CCE61: ; CODE XREF: sub_4CCC80+1BFj + movzx edi, word ptr [ebp+0] + movzx ebp, di + mov ecx, eax + shr ecx, 0Bh + imul ecx, ebp + cmp esi, ecx + jnb loc_4CCF15 + mov eax, ecx + mov ecx, 800h + sub ecx, ebp + sar ecx, 5 + add ecx, edi + mov edi, [esp+4Ch+arg_0] + add edx, edx + test ebx, ebx + mov [edi], cx + jz loc_4CCF36 + +loc_4CCE97: ; CODE XREF: sub_4CCC80+2B0j + cmp edx, 100h + jge loc_4CCF70 + mov ebp, [esp+4Ch+var_30] + jmp short loc_4CCEB0 +; --------------------------------------------------------------------------- + align 10h + +loc_4CCEB0: ; CODE XREF: sub_4CCC80+185j + ; sub_4CCC80+227j ... + cmp eax, 1000000h + lea ecx, [edx+edx] + mov [esp+4Ch+arg_0], ecx + jnb short loc_4CCEDE + mov edi, [esp+4Ch+arg_8] + cmp edi, [esp+4Ch+var_3C] + jz loc_4CD6E2 + movzx ebx, byte ptr [edi] + shl esi, 8 + shl eax, 8 + or esi, ebx + add edi, 1 + mov [esp+4Ch+arg_8], edi + +loc_4CCEDE: ; CODE XREF: sub_4CCC80+23Cj + movzx edi, word ptr [ecx+ebp] + movzx ebx, di + mov ecx, eax + shr ecx, 0Bh + imul ecx, ebx + cmp esi, ecx + jnb short loc_4CCF4B + mov eax, ecx + mov ecx, 800h + sub ecx, ebx + sar ecx, 5 + add ecx, edi + mov edi, [esp+4Ch+arg_0] + mov [edi+ebp], cx + add edx, edx + jmp short loc_4CCF64 +; --------------------------------------------------------------------------- + +loc_4CCF0B: ; CODE XREF: sub_4CCC80+A2j + pop edi + pop esi + mov eax, ebp + pop ebp + pop ebx + add esp, 3Ch + retn +; --------------------------------------------------------------------------- + +loc_4CCF15: ; CODE XREF: sub_4CCC80+1F2j + sub eax, ecx + sub esi, ecx + mov cx, di + shr cx, 5 + sub di, cx + test ebx, ebx + mov ecx, [esp+4Ch+arg_0] + mov [ecx], di + lea edx, [edx+edx+1] + jz loc_4CCE97 + +loc_4CCF36: ; CODE XREF: sub_4CCC80+211j + cmp edx, 100h + jge short loc_4CCF70 + mov ebp, [esp+4Ch+var_30] + mov ebx, [esp+4Ch+var_10] + jmp loc_4CCE20 +; --------------------------------------------------------------------------- + +loc_4CCF4B: ; CODE XREF: sub_4CCC80+26Fj + mov dx, di + shr dx, 5 + sub di, dx + mov edx, [esp+4Ch+arg_0] + sub eax, ecx + sub esi, ecx + mov [edx+ebp], di + add edx, 1 + +loc_4CCF64: ; CODE XREF: sub_4CCC80+289j + cmp edx, 100h + jl loc_4CCEB0 + +loc_4CCF70: ; CODE XREF: sub_4CCC80+21Dj + ; sub_4CCC80+2BCj + mov ecx, [esp+4Ch+var_2C] + mov edi, [esp+4Ch+arg_10] + mov [ecx+edi], dl + add ecx, 1 + mov [esp+4Ch+var_2C], ecx + mov ecx, [esp+4Ch+var_34] + cmp ecx, 4 + mov byte ptr [esp+4Ch+arg_0], dl + jge short loc_4CCF99 + mov [esp+4Ch+var_34], 0 + jmp short loc_4CCFA5 +; --------------------------------------------------------------------------- + +loc_4CCF99: ; CODE XREF: sub_4CCC80+30Dj + cmp ecx, 0Ah + jge short loc_4CCFEF + sub ecx, 3 + +loc_4CCFA1: ; CODE XREF: sub_4CCC80+372j + mov [esp+4Ch+var_34], ecx + +loc_4CCFA5: ; CODE XREF: sub_4CCC80+317j + ; sub_4CCC80+530j ... + mov ecx, [esp+4Ch+var_2C] + cmp ecx, [esp+4Ch+arg_14] + jb loc_4CCD50 + +loc_4CCFB3: ; CODE XREF: sub_4CCC80+A13j + ; sub_4CCC80+A5Aj + cmp eax, 1000000h + jnb short loc_4CCFCD + mov edx, [esp+4Ch+arg_8] + cmp edx, [esp+4Ch+var_3C] + jz loc_4CD6E2 + add [esp+4Ch+arg_8], 1 + +loc_4CCFCD: ; CODE XREF: sub_4CCC80+C6j + ; sub_4CCC80+338j + mov eax, [esp+4Ch+arg_8] + sub eax, [esp+4Ch+arg_4] + mov ecx, [esp+4Ch+arg_C] + mov edx, [esp+4Ch+var_2C] + pop edi + mov [ecx], eax + mov eax, [esp+48h+arg_18] + pop esi + pop ebp + mov [eax], edx + xor eax, eax + pop ebx + add esp, 3Ch + retn +; --------------------------------------------------------------------------- + +loc_4CCFEF: ; CODE XREF: sub_4CCC80+31Cj + sub ecx, 6 + jmp short loc_4CCFA1 +; --------------------------------------------------------------------------- + +loc_4CCFF4: ; CODE XREF: sub_4CCC80+129j + sub eax, ecx + sub esi, ecx + mov cx, bx + shr cx, 5 + sub bx, cx + cmp eax, 1000000h + mov ecx, [esp+4Ch+var_30] + mov [ecx], bx + jnb short loc_4CD030 + mov ecx, [esp+4Ch+arg_8] + cmp ecx, [esp+4Ch+var_3C] + jz loc_4CD6E2 + movzx ebx, byte ptr [ecx] + shl esi, 8 + shl eax, 8 + or esi, ebx + add ecx, 1 + mov [esp+4Ch+arg_8], ecx + +loc_4CD030: ; CODE XREF: sub_4CCC80+38Ej + movzx ebx, word ptr [edi+edx*2+180h] + movzx ebp, bx + mov ecx, eax + shr ecx, 0Bh + imul ecx, ebp + cmp esi, ecx + jnb short loc_4CD096 + mov eax, ecx + mov ecx, 800h + sub ecx, ebp + sar ecx, 5 + add ecx, ebx + mov [edi+edx*2+180h], cx + mov ecx, [esp+4Ch+var_28] + mov ebp, [esp+4Ch+var_1C] + mov [esp+4Ch+var_18], ecx + mov ecx, [esp+4Ch+var_24] + mov [esp+4Ch+var_28], ecx + mov ecx, [esp+4Ch+var_38] + mov [esp+4Ch+var_24], ecx + xor ecx, ecx + cmp edx, 7 + setl cl + sub ecx, 1 + and ecx, 3 + mov [esp+4Ch+var_34], ecx + lea ecx, [edi+664h] + jmp loc_4CD30B +; --------------------------------------------------------------------------- + +loc_4CD096: ; CODE XREF: sub_4CCC80+3C5j + sub eax, ecx + sub esi, ecx + mov cx, bx + shr cx, 5 + sub bx, cx + cmp eax, 1000000h + mov [edi+edx*2+180h], bx + jnb short loc_4CD0D3 + mov ecx, [esp+4Ch+arg_8] + cmp ecx, [esp+4Ch+var_3C] + jz loc_4CD6E2 + movzx ebx, byte ptr [ecx] + shl esi, 8 + shl eax, 8 + or esi, ebx + add ecx, 1 + mov [esp+4Ch+arg_8], ecx + +loc_4CD0D3: ; CODE XREF: sub_4CCC80+431j + movzx ebx, word ptr [edi+edx*2+198h] + movzx ebp, bx + mov ecx, eax + shr ecx, 0Bh + imul ecx, ebp + cmp esi, ecx + mov [esp+4Ch+arg_0], ebx + jnb loc_4CD1D3 + mov ebx, 800h + sub ebx, ebp + mov ebp, [esp+4Ch+var_1C] + sar ebx, 5 + add ebx, [esp+4Ch+arg_0] + mov eax, ecx + mov [edi+edx*2+198h], bx + lea ebx, [edx+0Fh] + shl ebx, 4 + add ebx, ebp + cmp ecx, 1000000h + lea ebx, [edi+ebx*2] + mov [esp+4Ch+var_30], ebx + jnb short loc_4CD147 + mov ebx, [esp+4Ch+arg_8] + cmp ebx, [esp+4Ch+var_3C] + jz loc_4CD6E2 + shl ecx, 8 + mov eax, ecx + movzx ecx, byte ptr [ebx] + shl esi, 8 + or esi, ecx + add ebx, 1 + mov [esp+4Ch+arg_8], ebx + +loc_4CD147: ; CODE XREF: sub_4CCC80+4A3j + mov ecx, [esp+4Ch+var_30] + movzx ecx, word ptr [ecx] + mov [esp+4Ch+arg_0], ecx + movzx ebx, cx + mov ecx, eax + shr ecx, 0Bh + imul ecx, ebx + cmp esi, ecx + jnb short loc_4CD1B5 + mov edi, [esp+4Ch+var_30] + mov eax, ecx + mov ecx, 800h + sub ecx, ebx + sar ecx, 5 + add ecx, [esp+4Ch+arg_0] + mov [edi], cx + mov edi, [esp+4Ch+var_2C] + test edi, edi + jz loc_4CD6E2 + xor ecx, ecx + cmp edx, 7 + mov edx, [esp+4Ch+arg_10] + setnl cl + lea ecx, [ecx+ecx+9] + mov [esp+4Ch+var_34], ecx + mov ecx, edi + sub ecx, [esp+4Ch+var_38] + add edi, 1 + mov cl, [ecx+edx] + mov [edi+edx-1], cl + mov byte ptr [esp+4Ch+arg_0], cl + mov [esp+4Ch+var_2C], edi + jmp loc_4CCFA5 +; --------------------------------------------------------------------------- + +loc_4CD1B5: ; CODE XREF: sub_4CCC80+4DFj + sub eax, ecx + sub esi, ecx + mov ecx, [esp+4Ch+arg_0] + mov bx, cx + shr bx, 5 + sub cx, bx + mov ebx, [esp+4Ch+var_30] + mov [ebx], cx + jmp loc_4CD2F0 +; --------------------------------------------------------------------------- + +loc_4CD1D3: ; CODE XREF: sub_4CCC80+46Cj + sub eax, ecx + sub esi, ecx + mov cx, bx + shr cx, 5 + sub bx, cx + cmp eax, 1000000h + mov [edi+edx*2+198h], bx + jnb short loc_4CD210 + mov ecx, [esp+4Ch+arg_8] + cmp ecx, [esp+4Ch+var_3C] + jz loc_4CD6E2 + movzx ebx, byte ptr [ecx] + shl esi, 8 + shl eax, 8 + or esi, ebx + add ecx, 1 + mov [esp+4Ch+arg_8], ecx + +loc_4CD210: ; CODE XREF: sub_4CCC80+56Ej + movzx ebx, word ptr [edi+edx*2+1B0h] + movzx ebp, bx + mov ecx, eax + shr ecx, 0Bh + imul ecx, ebp + cmp esi, ecx + jnb short loc_4CD246 + mov eax, ecx + mov ecx, 800h + sub ecx, ebp + sar ecx, 5 + add ecx, ebx + mov [edi+edx*2+1B0h], cx + mov ecx, [esp+4Ch+var_24] + jmp loc_4CD2E0 +; --------------------------------------------------------------------------- + +loc_4CD246: ; CODE XREF: sub_4CCC80+5A5j + sub eax, ecx + sub esi, ecx + mov cx, bx + shr cx, 5 + sub bx, cx + cmp eax, 1000000h + mov [edi+edx*2+1B0h], bx + jnb short loc_4CD283 + mov ecx, [esp+4Ch+arg_8] + cmp ecx, [esp+4Ch+var_3C] + jz loc_4CD6E2 + movzx ebx, byte ptr [ecx] + shl esi, 8 + shl eax, 8 + or esi, ebx + add ecx, 1 + mov [esp+4Ch+arg_8], ecx + +loc_4CD283: ; CODE XREF: sub_4CCC80+5E1j + movzx ebx, word ptr [edi+edx*2+1C8h] + movzx ebp, bx + mov ecx, eax + shr ecx, 0Bh + imul ecx, ebp + cmp esi, ecx + jnb short loc_4CD2B6 + mov eax, ecx + mov ecx, 800h + sub ecx, ebp + sar ecx, 5 + add ecx, ebx + mov [edi+edx*2+1C8h], cx + mov ecx, [esp+4Ch+var_28] + jmp short loc_4CD2D8 +; --------------------------------------------------------------------------- + +loc_4CD2B6: ; CODE XREF: sub_4CCC80+618j + sub eax, ecx + sub esi, ecx + mov cx, bx + shr cx, 5 + sub bx, cx + mov ecx, [esp+4Ch+var_18] + mov [edi+edx*2+1C8h], bx + mov ebx, [esp+4Ch+var_28] + mov [esp+4Ch+var_18], ebx + +loc_4CD2D8: ; CODE XREF: sub_4CCC80+634j + mov ebx, [esp+4Ch+var_24] + mov [esp+4Ch+var_28], ebx + +loc_4CD2E0: ; CODE XREF: sub_4CCC80+5C1j + mov ebx, [esp+4Ch+var_38] + mov ebp, [esp+4Ch+var_1C] + mov [esp+4Ch+var_24], ebx + mov [esp+4Ch+var_38], ecx + +loc_4CD2F0: ; CODE XREF: sub_4CCC80+54Ej + xor ecx, ecx + cmp edx, 7 + setnl cl + sub ecx, 1 + and ecx, 0FFFFFFFDh + add ecx, 0Bh + mov [esp+4Ch+var_34], ecx + lea ecx, [edi+0A68h] + +loc_4CD30B: ; CODE XREF: sub_4CCC80+411j + cmp eax, 1000000h + jnb short loc_4CD332 + mov edx, [esp+4Ch+arg_8] + cmp edx, [esp+4Ch+var_3C] + jz loc_4CD6E2 + movzx edi, byte ptr [edx] + shl esi, 8 + shl eax, 8 + or esi, edi + add edx, 1 + mov [esp+4Ch+arg_8], edx + +loc_4CD332: ; CODE XREF: sub_4CCC80+690j + movzx edi, word ptr [ecx] + movzx ebx, di + mov edx, eax + shr edx, 0Bh + imul edx, ebx + cmp esi, edx + jnb short loc_4CD36E + mov eax, edx + mov edx, 800h + sub edx, ebx + sar edx, 5 + add edx, edi + mov [ecx], dx + shl ebp, 4 + lea ecx, [ecx+ebp+4] + mov [esp+4Ch+var_1C], 0 + mov edx, 3 + jmp loc_4CD409 +; --------------------------------------------------------------------------- + +loc_4CD36E: ; CODE XREF: sub_4CCC80+6C2j + sub eax, edx + sub esi, edx + mov dx, di + shr dx, 5 + sub di, dx + cmp eax, 1000000h + mov [ecx], di + jnb short loc_4CD3A6 + mov edx, [esp+4Ch+arg_8] + cmp edx, [esp+4Ch+var_3C] + jz loc_4CD6E2 + movzx edi, byte ptr [edx] + shl esi, 8 + shl eax, 8 + or esi, edi + add edx, 1 + mov [esp+4Ch+arg_8], edx + +loc_4CD3A6: ; CODE XREF: sub_4CCC80+704j + movzx edx, word ptr [ecx+2] + movzx ebx, dx + mov edi, eax + shr edi, 0Bh + imul edi, ebx + cmp esi, edi + jnb short loc_4CD3E4 + mov eax, edi + mov edi, 800h + sub edi, ebx + sar edi, 5 + add edi, edx + shl ebp, 4 + mov [ecx+2], di + lea ecx, [ecx+ebp+104h] + mov [esp+4Ch+var_1C], 8 + mov edx, 3 + jmp short loc_4CD409 +; --------------------------------------------------------------------------- + +loc_4CD3E4: ; CODE XREF: sub_4CCC80+737j + sub eax, edi + sub esi, edi + mov di, dx + shr di, 5 + sub dx, di + mov [ecx+2], dx + add ecx, 204h + mov [esp+4Ch+var_1C], 10h + mov edx, 8 + +loc_4CD409: ; CODE XREF: sub_4CCC80+6E9j + ; sub_4CCC80+762j + mov [esp+4Ch+arg_0], edx + mov [esp+4Ch+var_10], edx + mov ebx, 1 + jmp short loc_4CD420 +; --------------------------------------------------------------------------- + align 10h + +loc_4CD420: ; CODE XREF: sub_4CCC80+796j + ; sub_4CCC80+819j + cmp eax, 1000000h + mov edx, [esp+4Ch+arg_8] + lea edi, [ebx+ebx] + mov [esp+4Ch+var_30], edi + jnb short loc_4CD44E + cmp edx, [esp+4Ch+var_3C] + jz loc_4CD6E2 + movzx ebp, byte ptr [edx] + shl esi, 8 + shl eax, 8 + or esi, ebp + add edx, 1 + mov [esp+4Ch+arg_8], edx + +loc_4CD44E: ; CODE XREF: sub_4CCC80+7B0j + movzx edi, word ptr [edi+ecx] + movzx ebp, di + mov edx, eax + shr edx, 0Bh + imul edx, ebp + cmp esi, edx + jnb short loc_4CD47B + mov eax, edx + mov edx, 800h + sub edx, ebp + sar edx, 5 + add edx, edi + mov edi, [esp+4Ch+var_30] + mov [edi+ecx], dx + add ebx, ebx + jmp short loc_4CD494 +; --------------------------------------------------------------------------- + +loc_4CD47B: ; CODE XREF: sub_4CCC80+7DFj + mov ebx, [esp+4Ch+var_30] + sub eax, edx + sub esi, edx + mov dx, di + shr dx, 5 + sub di, dx + mov [ebx+ecx], di + add ebx, 1 + +loc_4CD494: ; CODE XREF: sub_4CCC80+7F9j + sub [esp+4Ch+var_10], 1 + jnz short loc_4CD420 + mov ecx, [esp+4Ch+arg_0] + mov edx, 1 + shl edx, cl + mov ecx, [esp+4Ch+var_1C] + sub ecx, edx + add ebx, ecx + cmp [esp+4Ch+var_34], 4 + mov [esp+4Ch+var_4], ebx + jge loc_4CD69D + add [esp+4Ch+var_34], 7 + cmp ebx, 4 + jl short loc_4CD4CC + mov ebx, 3 + +loc_4CD4CC: ; CODE XREF: sub_4CCC80+845j + mov ecx, [esp+4Ch+var_20] + shl ebx, 7 + lea ecx, [ebx+ecx+360h] + mov [esp+4Ch+var_30], ecx + mov [esp+4Ch+arg_0], 6 + mov edi, 1 + jmp short loc_4CD4F0 +; --------------------------------------------------------------------------- + align 10h + +loc_4CD4F0: ; CODE XREF: sub_4CCC80+86Bj + ; sub_4CCC80+8E3j + cmp eax, 1000000h + mov edx, [esp+4Ch+arg_8] + lea ebx, [edi+edi] + jnb short loc_4CD51A + cmp edx, [esp+4Ch+var_3C] + jz loc_4CD6E2 + movzx ebp, byte ptr [edx] + shl esi, 8 + shl eax, 8 + or esi, ebp + add edx, 1 + mov [esp+4Ch+arg_8], edx + +loc_4CD51A: ; CODE XREF: sub_4CCC80+87Cj + movzx edx, word ptr [ebx+ecx] + movzx ebp, dx + mov ecx, eax + shr ecx, 0Bh + imul ecx, ebp + cmp esi, ecx + jnb short loc_4CD545 + mov eax, ecx + mov ecx, 800h + sub ecx, ebp + sar ecx, 5 + add ecx, edx + mov [esp+4Ch+var_10], ecx + mov edx, ecx + add edi, edi + jmp short loc_4CD556 +; --------------------------------------------------------------------------- + +loc_4CD545: ; CODE XREF: sub_4CCC80+8ABj + sub eax, ecx + sub esi, ecx + mov cx, dx + shr cx, 5 + sub dx, cx + lea edi, [ebx+1] + +loc_4CD556: ; CODE XREF: sub_4CCC80+8C3j + sub [esp+4Ch+arg_0], 1 + mov ecx, [esp+4Ch+var_30] + mov [ebx+ecx], dx + jnz short loc_4CD4F0 + sub edi, 40h + cmp edi, 4 + jl loc_4CD68A + mov ebx, 1 + mov ecx, edi + mov edx, edi + sar ecx, 1 + and edx, ebx + sub ecx, ebx + or edx, 2 + cmp edi, 0Eh + mov [esp+4Ch+var_30], ecx + jge short loc_4CD5A1 + shl edx, cl + mov ecx, [esp+4Ch+var_20] + mov [esp+4Ch+var_38], edx + sub edx, edi + lea ebp, [ecx+edx*2+55Eh] + jmp short loc_4CD5F3 +; --------------------------------------------------------------------------- + +loc_4CD5A1: ; CODE XREF: sub_4CCC80+90Aj + mov edi, [esp+4Ch+arg_8] + sub ecx, 4 + +loc_4CD5A8: ; CODE XREF: sub_4CCC80+958j + cmp eax, 1000000h + jnb short loc_4CD5CA + cmp edi, [esp+4Ch+var_3C] + jz loc_4CD6EF + movzx ebp, byte ptr [edi] + shl esi, 8 + shl eax, 8 + or esi, ebp + add edi, ebx + mov [esp+4Ch+arg_8], edi + +loc_4CD5CA: ; CODE XREF: sub_4CCC80+92Dj + shr eax, 1 + add edx, edx + cmp esi, eax + jb short loc_4CD5D6 + sub esi, eax + or edx, ebx + +loc_4CD5D6: ; CODE XREF: sub_4CCC80+950j + sub ecx, ebx + jnz short loc_4CD5A8 + mov ebp, [esp+4Ch+var_20] + add ebp, 644h + shl edx, 4 + mov [esp+4Ch+var_38], edx + mov [esp+4Ch+var_30], 4 + +loc_4CD5F3: ; CODE XREF: sub_4CCC80+91Fj + mov [esp+4Ch+var_1C], ebx + mov [esp+4Ch+arg_0], ebx + jmp short loc_4CD600 +; --------------------------------------------------------------------------- + align 10h + +loc_4CD600: ; CODE XREF: sub_4CCC80+97Bj + ; sub_4CCC80+A02j + mov ebx, [esp+4Ch+arg_0] + add ebx, ebx + cmp eax, 1000000h + jnb short loc_4CD62D + mov ecx, [esp+4Ch+arg_8] + cmp ecx, [esp+4Ch+var_3C] + jz loc_4CD6E2 + movzx edx, byte ptr [ecx] + shl esi, 8 + shl eax, 8 + or esi, edx + add ecx, 1 + mov [esp+4Ch+arg_8], ecx + +loc_4CD62D: ; CODE XREF: sub_4CCC80+98Bj + movzx edi, word ptr [ebx+ebp] + movzx ecx, di + mov edx, eax + shr edx, 0Bh + imul edx, ecx + cmp esi, edx + jnb short loc_4CD658 + mov eax, edx + mov edx, 800h + sub edx, ecx + sar edx, 5 + add edx, edi + shl [esp+4Ch+arg_0], 1 + mov [ebx+ebp], dx + jmp short loc_4CD679 +; --------------------------------------------------------------------------- + +loc_4CD658: ; CODE XREF: sub_4CCC80+9BEj + mov cx, di + shr cx, 5 + sub di, cx + sub eax, edx + sub esi, edx + mov edx, [esp+4Ch+var_1C] + mov [ebx+ebp], di + add ebx, 1 + or [esp+4Ch+var_38], edx + mov [esp+4Ch+arg_0], ebx + +loc_4CD679: ; CODE XREF: sub_4CCC80+9D6j + shl [esp+4Ch+var_1C], 1 + sub [esp+4Ch+var_30], 1 + jnz loc_4CD600 + jmp short loc_4CD68E +; --------------------------------------------------------------------------- + +loc_4CD68A: ; CODE XREF: sub_4CCC80+8EBj + mov [esp+4Ch+var_38], edi + +loc_4CD68E: ; CODE XREF: sub_4CCC80+A08j + add [esp+4Ch+var_38], 1 + jz loc_4CCFB3 + mov ebx, [esp+4Ch+var_4] + +loc_4CD69D: ; CODE XREF: sub_4CCC80+837j + mov ebp, [esp+4Ch+var_2C] + mov ecx, [esp+4Ch+var_38] + add ebx, 2 + cmp ecx, ebp + ja short loc_4CD6E2 + mov edi, ebp + sub edi, ecx + add edi, [esp+4Ch+arg_10] + +loc_4CD6B4: ; CODE XREF: sub_4CCC80+A60j + mov cl, [edi] + mov edx, [esp+4Ch+arg_10] + sub ebx, 1 + mov [edx+ebp], cl + add ebp, 1 + add edi, 1 + test ebx, ebx + mov byte ptr [esp+4Ch+arg_0], cl + mov [esp+4Ch+var_2C], ebp + jz loc_4CCFA5 + cmp ebp, [esp+4Ch+arg_14] + jnb loc_4CCFB3 + jmp short loc_4CD6B4 +; --------------------------------------------------------------------------- + +loc_4CD6E2: ; CODE XREF: sub_4CCC80+101j + ; sub_4CCC80+1C9j ... + pop edi + pop esi + pop ebp + mov eax, 1 + pop ebx + add esp, 3Ch + retn +; --------------------------------------------------------------------------- + +loc_4CD6EF: ; CODE XREF: sub_4CCC80+933j + pop edi + pop esi + pop ebp + mov eax, ebx + pop ebx + add esp, 3Ch + retn +sub_4CCC80 endp + +_starcraft_decompress_lzma PROC +;sub_4CD700 + +var_14 = byte ptr -14h +var_10 = dword ptr -10h +var_C = dword ptr -0Ch +var_4 = dword ptr -4 +pbInBuffer = dword ptr 4 +cbInBuffer = dword ptr 8 +pbOutBuffer = dword ptr 0Ch +cbOutBuffer = dword ptr 10h +pcbOutBuffer = dword ptr 14h +pfnAllocateMemory= dword ptr 18h +pfnFreeMemory = dword ptr 1Ch + + sub esp, 14h + push ebx + mov ebx, [esp+18h+cbInBuffer] + cmp ebx, 0Eh ; LZMA_PROPS_SIZE + 8 + jnb short loc_4CD714 + xor al, al + pop ebx + add esp, 14h + retn +; --------------------------------------------------------------------------- + +loc_4CD714: ; CODE XREF: Decompress_lzma_internal+Bj + push ebp + mov ebp, [esp+1Ch+pcbOutBuffer] + push edi + mov edi, [esp+20h+pbInBuffer] + mov dword ptr [ebp+0], 0 + cmp byte ptr [edi], 0 + jnz short loc_4CD741 + push 5 + lea eax, [edi+1] + push eax + lea ecx, [esp+28h+var_10] + push ecx + call LzmaProps_Decode + add esp, 0Ch + test eax, eax + jz short loc_4CD74A + +loc_4CD741: ; CODE XREF: Decompress_lzma_internal+28j + pop edi + pop ebp + xor al, al + pop ebx + add esp, 14h + retn +; --------------------------------------------------------------------------- + +loc_4CD74A: ; CODE XREF: Decompress_lzma_internal+3Fj + mov edx, [esp+20h+var_10] + mov eax, [esp+20h+var_C] + lea ecx, [eax+edx] + mov edx, 300h + shl edx, cl + push esi + lea eax, [edx+edx+0E6Ch] + push eax + call [esp+28h+pfnAllocateMemory] + mov esi, eax + add esp, 4 + test esi, esi + mov [esp+24h+var_4], esi + jz short loc_4CD7AA + mov edx, [esp+24h+cbOutBuffer] + mov eax, [esp+24h+pbOutBuffer] + lea ecx, [esp+24h+cbInBuffer] + push ecx ; cbInBuffer + push edx ; cbOutBuffer + push eax ; pbOutBuffer + lea ecx, [esp+30h+var_14] + push ecx ; &var_14 + add ebx, 0FFFFFFF2h + push ebx ; cbInBuffer - LZMA86_HEADER_SIZE + add edi, 0Eh + lea edx, [esp+38h+var_10] + push edi ; pbInBuffer + LZMA86_HEADER_SIZE + push edx ; dest + call sub_4CCC80 + push esi + mov edi, eax + call [esp+44h+pfnFreeMemory] + add esp, 20h + test edi, edi + jz short loc_4CD7B4 + +loc_4CD7AA: ; CODE XREF: Decompress_lzma_internal+74j + pop esi + pop edi + pop ebp + xor al, al + pop ebx + add esp, 14h + retn +; --------------------------------------------------------------------------- + +loc_4CD7B4: ; CODE XREF: Decompress_lzma_internal+A8j + mov eax, [esp+24h+cbInBuffer] + pop esi + pop edi + mov [ebp+0], eax + pop ebp + mov al, 1 + pop ebx + add esp, 14h + retn +_starcraft_decompress_lzma ENDP + +; =============== S U B R O U T I N E ======================================= + +sub_4CD7D0 proc near ; CODE XREF: sub_4CDC00+74p + +arg_0 = dword ptr 4 + + push esi + mov esi, [esp+4+arg_0] + or esi, 8 + xor eax, eax + cmp esi, 1 + jz short loc_4CD806 + push edi + +loc_4CD7E0: ; CODE XREF: sub_4CD7D0+33j + mov edx, esi + shr esi, 1 + mov edi, [ecx+esi*4] + and edx, 1 + sub edi, edx + neg edx + xor edi, edx + shr edi, 2 + and edi, 1FFh + add eax, dword_550998[edi*4] + cmp esi, 1 + jnz short loc_4CD7E0 + pop edi + +loc_4CD806: ; CODE XREF: sub_4CD7D0+Dj + pop esi + retn 4 +sub_4CD7D0 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CD810 proc near ; CODE XREF: CEncoder_FillAlignPrices+17p + +var_4 = dword ptr -4 +arg_0 = dword ptr 4 + + push ecx + push ebx + push ebp + push esi + xor eax, eax + push edi + mov edi, [esp+14h+arg_0] + mov [esp+14h+var_4], ecx + lea esi, [eax+1] + lea ebx, [eax+4] + +loc_4CD825: ; CODE XREF: sub_4CD810+42j + mov ecx, [esp+14h+var_4] + mov ecx, [ecx+esi*4] + mov edx, edi + and edx, 1 + sub ecx, edx + mov ebp, edx + neg ebp + xor ecx, ebp + shr ecx, 2 + and ecx, 1FFh + add eax, dword_550998[ecx*4] + add esi, esi + shr edi, 1 + or esi, edx + sub ebx, 1 + jnz short loc_4CD825 + pop edi + pop esi + pop ebp + pop ebx + pop ecx + retn 4 +sub_4CD810 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CD860 proc near ; CODE XREF: CEncoder_FillDistancesPrices+6Bp + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 +arg_8 = dword ptr 0Ch + + push edi + mov edi, [esp+4+arg_4] + xor eax, eax + test edi, edi + lea edx, [eax+1] + jz short loc_4CD8A7 + push ebx + push ebp + push esi + mov esi, [esp+10h+arg_8] + +loc_4CD875: ; CODE XREF: sub_4CD860+42j + mov ebx, [esp+10h+arg_0] + mov ebx, [ebx+edx*4] + mov ecx, esi + and ecx, 1 + sub ebx, ecx + mov ebp, ecx + neg ebp + xor ebx, ebp + shr ebx, 2 + and ebx, 1FFh + add eax, dword_550998[ebx*4] + add edx, edx + shr esi, 1 + or edx, ecx + sub edi, 1 + jnz short loc_4CD875 + pop esi + pop ebp + pop ebx + +loc_4CD8A7: ; CODE XREF: sub_4CD860+Cj + pop edi + retn +sub_4CD860 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CD8B0 proc near ; CODE XREF: CEncoder_CodeOneBlock+7B8p + mov eax, [ecx+24h] + mov edx, [ecx+1Ch] + push ebx + push esi + mov esi, [ecx+30h] + xor ebx, ebx + push edi + mov edi, [ecx+34h] + sub esi, eax + sbb edi, ebx + add esi, edx + adc edi, ebx + cmp eax, edx + jbe short loc_4CD8D4 + mov eax, [ecx+28h] + add esi, eax + adc edi, ebx + +loc_4CD8D4: ; CODE XREF: sub_4CD8B0+1Bj + mov eax, [ecx] + xor edx, edx + add eax, esi + adc edx, edi + pop edi + add eax, 4 + pop esi + adc edx, ebx + pop ebx + retn +sub_4CD8B0 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CD8F0 proc near ; CODE XREF: sub_4CD940+21p + ; .text:loc_4CF730j ... + mov eax, dword_553598 + test eax, eax + push esi + mov esi, ecx + push edi + mov edi, [esi] + jnz short loc_4CD92A + push 0Ch ; Size + call _operator_new ; operator new(uint) + add esp, 4 + test eax, eax + jz short loc_4CD923 + mov dword ptr [eax], 0 + mov dword ptr [eax+4], 0 + mov dword ptr [eax+8], 0 + jmp short loc_4CD925 +; --------------------------------------------------------------------------- + +loc_4CD923: ; CODE XREF: sub_4CD8F0+1Bj + xor eax, eax + +loc_4CD925: ; CODE XREF: sub_4CD8F0+31j + mov dword_553598, eax + +loc_4CD92A: ; CODE XREF: sub_4CD8F0+Dj + mov eax, [eax+4] + test eax, eax + jz short loc_4CD937 + push edi + call eax + add esp, 4 + +loc_4CD937: ; CODE XREF: sub_4CD8F0+3Fj + pop edi + mov dword ptr [esi], 0 + pop esi + retn +sub_4CD8F0 endp + +; =============== S U B R O U T I N E ======================================= + +sub_4CD940 proc near ; CODE XREF: sub_4D0270+74p + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 + + push ebx + mov ebx, [esp+4+arg_4] + push esi + mov esi, ecx + cmp dword ptr [esi], 0 + push edi + mov edi, [esp+0Ch+arg_0] + jz short loc_4CD95F + mov eax, [esi+8] + add eax, [esi+4] + lea ecx, [edi+ebx] + cmp ecx, eax + jz short loc_4CD981 + +loc_4CD95F: ; CODE XREF: sub_4CD940+10j + mov ecx, esi + call sub_4CD8F0 + lea ecx, [edi+ebx] + mov edx, 1 + shl edx, cl + imul edx, 0C00h + push edx + call sub_4CB8A0 + add esp, 4 + mov [esi], eax + +loc_4CD981: ; CODE XREF: sub_4CD940+1Dj + mov ecx, edi + mov eax, 1 + shl eax, cl + mov [esi+8], edi + pop edi + mov [esi+4], ebx + sub eax, 1 + mov [esi+0Ch], eax + xor eax, eax + cmp [esi], eax + pop esi + setnz al + pop ebx + retn 8 +sub_4CD940 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + + +sub_4CD9B0 proc near ; CODE XREF: CEncoder_GetOptimum+436p + ; CEncoder_GetOptimum+AE1p + +arg_0 = dword ptr 4 +arg_4 = byte ptr 8 +arg_8 = dword ptr 0Ch + + mov edx, [esp+arg_0] + test edx, edx + push esi + jnz short loc_4CD9F2 + movzx eax, [esp+4+arg_4] + mov edx, eax + shl edx, 4 + add edx, [esp+4+arg_8] + mov esi, 800h + sub esi, [ecx+edx*4+284B0h] + mov ecx, [ecx+eax*4+28420h] + shr esi, 2 + mov eax, dword_550998[esi*4] + shr ecx, 2 + add eax, dword_550998[ecx*4] + pop esi + retn 0Ch +; --------------------------------------------------------------------------- + +loc_4CD9F2: ; CODE XREF: sub_4CD9B0+7j + movzx esi, [esp+4+arg_4] + mov eax, 800h + sub eax, [ecx+esi*4+28420h] + shr eax, 2 + cmp edx, 1 + mov eax, dword_550998[eax*4] + jnz short loc_4CDA27 + mov ecx, [ecx+esi*4+28450h] + shr ecx, 2 + add eax, dword_550998[ecx*4] + pop esi + retn 0Ch +; --------------------------------------------------------------------------- + +loc_4CDA27: ; CODE XREF: sub_4CD9B0+60j + push edi + add edx, 0FFFFFFFEh + mov edi, 800h + sub edi, [ecx+esi*4+28450h] + mov ecx, [ecx+esi*4+28480h] + sub ecx, edx + neg edx + xor ecx, edx + shr edi, 2 + mov edx, dword_550998[edi*4] + shr ecx, 2 + and ecx, 1FFh + add edx, dword_550998[ecx*4] + pop edi + add eax, edx + pop esi + retn 0Ch +sub_4CD9B0 endp + +; --------------------------------------------------------------------------- + align 10h + +; =============== S U B R O U T I N E ======================================= + + +sub_4CDA70 proc near ; CODE XREF: CEncoder_CodeReal+10Cp + ; CEncoder_CodeReal+134p ... + push esi + mov esi, [ecx] + cmp dword ptr [esi+80h], 0 + jz short loc_4CDA8C + cmp byte ptr [esi+33B95h], 0 + jz short loc_4CDA8C + mov byte ptr [esi+33B95h], 0 + +loc_4CDA8C: ; CODE XREF: sub_4CDA70+Aj + ; sub_4CDA70+13j + mov eax, [esi+33B8Ch] + test eax, eax + jz short loc_4CDAA8 + mov ecx, [eax] + mov edx, [ecx+8] + push eax + call edx + mov dword ptr [esi+33B8Ch], 0 + +loc_4CDAA8: ; CODE XREF: sub_4CDA70+24j + mov ecx, [esi+4] + mov edx, [ecx+10h] + lea eax, [esi+4] + push eax + call edx + pop esi + retn +sub_4CDA70 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + + +sub_4CDAC0 proc near ; CODE XREF: CEncoder_GetOptimum+2C4p + ; CEncoder_GetOptimum+7ACp ... + +var_4 = dword ptr -4 +arg_0 = dword ptr 4 +arg_4 = byte ptr 8 +arg_8 = byte ptr 0Ch + + push ecx + push ebx + push ebp + xor ebp, ebp + cmp byte ptr [esp+0Ch+arg_0], 0 + push esi + mov eax, ecx + push edi + mov [esp+14h+var_4], eax + lea edi, [ebp+1] + lea ebx, [ebp+8] + jz short loc_4CDB3B + movzx ecx, [esp+14h+arg_8] + mov [esp+14h+arg_0], ecx + +loc_4CDAE3: ; CODE XREF: sub_4CDAC0+71j + movzx esi, [esp+14h+arg_4] + mov edx, [esp+14h+arg_0] + sub ebx, 1 + movzx ecx, bl + shr esi, cl + shr edx, cl + and esi, 1 + mov ecx, esi + shl ecx, 8 + add ecx, edi + mov eax, [eax+ecx*4+400h] + and edx, 1 + sub eax, edx + mov ecx, edx + neg ecx + xor eax, ecx + shr eax, 2 + and eax, 1FFh + add ebp, dword_550998[eax*4] + add edi, edi + or edi, edx + cmp esi, edx + jnz short loc_4CDB33 + test ebx, ebx + jz short loc_4CDB75 + mov eax, [esp+14h+var_4] + jmp short loc_4CDAE3 +; --------------------------------------------------------------------------- + +loc_4CDB33: ; CODE XREF: sub_4CDAC0+67j + test ebx, ebx + jz short loc_4CDB75 + mov eax, [esp+14h+var_4] + +loc_4CDB3B: ; CODE XREF: sub_4CDAC0+18j + movzx edx, [esp+14h+arg_8] + mov [esp+14h+arg_0], edx + +loc_4CDB44: ; CODE XREF: sub_4CDAC0+B3j + mov edx, [esp+14h+arg_0] + sub ebx, 1 + mov cl, bl + shr edx, cl + mov ecx, [eax+edi*4] + add edi, edi + and edx, 1 + sub ecx, edx + mov esi, edx + neg esi + xor ecx, esi + shr ecx, 2 + and ecx, 1FFh + add ebp, dword_550998[ecx*4] + or edi, edx + test ebx, ebx + jnz short loc_4CDB44 + +loc_4CDB75: ; CODE XREF: sub_4CDAC0+6Bj + ; sub_4CDAC0+75j + pop edi + pop esi + mov eax, ebp + pop ebp + pop ebx + pop ecx + retn 0Ch +sub_4CDAC0 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CDB80 proc near ; CODE XREF: sub_4CDEA0+11Ep + ; sub_4CDEA0+137p + +arg_0 = dword ptr 4 + + push esi + mov esi, [esp+4+arg_0] + test esi, esi + mov edx, 400h + push edi + mov [ecx], edx + mov [ecx+4], edx + jbe short loc_4CDBE6 + lea eax, [ecx+20Ch] + lea ebx, [ebx+0] + +loc_4CDBA0: ; CODE XREF: sub_4CDB80+64j + mov [eax-200h], edx + mov [eax-1FCh], edx + mov [eax-1F8h], edx + mov [eax-1F4h], edx + mov [eax-1F0h], edx + mov [eax-1ECh], edx + mov [eax-1E8h], edx + mov [eax], edx + mov [eax+4], edx + mov [eax+8], edx + mov [eax+0Ch], edx + mov [eax+10h], edx + mov [eax+14h], edx + mov [eax+18h], edx + add eax, 20h + sub esi, 1 + jnz short loc_4CDBA0 + +loc_4CDBE6: ; CODE XREF: sub_4CDB80+12j + lea edi, [ecx+40Ch] + mov ecx, 0FFh + mov eax, edx + rep stosd + pop edi + pop esi + retn 4 +sub_4CDB80 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CDC00 proc near ; CODE XREF: sub_4CF740+22p + ; sub_4CF780+2Bp + +var_C = dword ptr -0Ch +var_8 = dword ptr -8 +var_4 = dword ptr -4 +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 +arg_8 = dword ptr 0Ch + + sub esp, 0Ch + push ebx + push ebp + push esi + push edi + mov edi, ecx + mov eax, [edi] + mov ebx, [esp+1Ch+arg_0] + mov ecx, eax + shr ecx, 2 + mov edx, dword_550998[ecx*4] + mov ecx, 800h + sub ecx, eax + shr ecx, 2 + mov eax, dword_550998[ecx*4] + mov ecx, [edi+4] + mov [esp+1Ch+var_C], edx + mov edx, ecx + shr edx, 2 + mov ebp, dword_550998[edx*4] + mov edx, 800h + sub edx, ecx + shr edx, 2 + mov ecx, dword_550998[edx*4] + add ebp, eax + add ecx, eax + mov [esp+1Ch+var_8], ebp + mov [esp+1Ch+var_4], ecx + xor esi, esi + mov edi, edi + +loc_4CDC60: ; CODE XREF: sub_4CDC00+8Aj + cmp esi, [esp+1Ch+arg_4] + jnb loc_4CDD62 + mov eax, ebx + shl eax, 5 + push esi + lea ecx, [eax+edi+8] + call sub_4CD7D0 + add eax, [esp+1Ch+var_C] + mov ecx, [esp+1Ch+arg_8] + mov [ecx+esi*4], eax + add esi, 1 + cmp esi, 8 + jb short loc_4CDC60 + cmp esi, 10h + jnb short loc_4CDD00 + lea ecx, [esi-8] + mov [esp+1Ch+arg_0], ecx + jmp short loc_4CDCA0 +; --------------------------------------------------------------------------- + align 10h + +loc_4CDCA0: ; CODE XREF: sub_4CDC00+98j + ; sub_4CDC00+FEj + cmp esi, [esp+1Ch+arg_4] + jnb loc_4CDD62 + or ecx, 8 + xor edx, edx + cmp ecx, 1 + jz short loc_4CDCE4 + +loc_4CDCB4: ; CODE XREF: sub_4CDC00+DEj + mov eax, ecx + shr ecx, 1 + and eax, 1 + lea ebp, [ecx+ebx*8] + mov ebp, [edi+ebp*4+208h] + sub ebp, eax + neg eax + xor ebp, eax + shr ebp, 2 + and ebp, 1FFh + add edx, dword_550998[ebp*4] + cmp ecx, 1 + jnz short loc_4CDCB4 + mov ebp, [esp+1Ch+var_8] + +loc_4CDCE4: ; CODE XREF: sub_4CDC00+B2j + mov eax, [esp+1Ch+arg_8] + mov ecx, [esp+1Ch+arg_0] + add edx, ebp + mov [eax+esi*4], edx + add esi, 1 + add ecx, 1 + cmp esi, 10h + mov [esp+1Ch+arg_0], ecx + jb short loc_4CDCA0 + +loc_4CDD00: ; CODE XREF: sub_4CDC00+8Fj + cmp esi, [esp+1Ch+arg_4] + jnb short loc_4CDD62 + lea ebx, [esi-10h] + lea esp, [esp+0] + +loc_4CDD10: ; CODE XREF: sub_4CDC00+160j + mov ecx, ebx + or ecx, 100h + xor edx, edx + cmp ecx, 1 + jz short loc_4CDD49 + nop + +loc_4CDD20: ; CODE XREF: sub_4CDC00+147j + mov eax, ecx + shr ecx, 1 + mov ebp, [edi+ecx*4+408h] + and eax, 1 + sub ebp, eax + neg eax + xor ebp, eax + shr ebp, 2 + and ebp, 1FFh + add edx, dword_550998[ebp*4] + cmp ecx, 1 + jnz short loc_4CDD20 + +loc_4CDD49: ; CODE XREF: sub_4CDC00+11Dj + mov ecx, [esp+1Ch+var_4] + mov eax, [esp+1Ch+arg_8] + add edx, ecx + mov [eax+esi*4], edx + add esi, 1 + add ebx, 1 + cmp esi, [esp+1Ch+arg_4] + jb short loc_4CDD10 + +loc_4CDD62: ; CODE XREF: sub_4CDC00+64j + ; sub_4CDC00+A4j ... + pop edi + pop esi + pop ebp + pop ebx + add esp, 0Ch + retn 0Ch +sub_4CDC00 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +; int __cdecl sub_4CDD70(SIZE_T dwSize) +sub_4CDD70 proc near ; DATA XREF: .data:off_546E20o + +dwSize = dword ptr 4 + + mov eax, [esp+dwSize] + test eax, eax + jnz short loc_4CDD79 + retn +; --------------------------------------------------------------------------- + +loc_4CDD79: ; CODE XREF: sub_4CDD70+6j + push 4 ; flProtect + push 1000h ; flAllocationType + push eax ; dwSize + push 0 ; lpAddress + call ds:VirtualAlloc + retn +sub_4CDD70 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + + +; int __cdecl sub_4CDD90(void * lpAddress) +sub_4CDD90 proc near ; CODE XREF: sub_4CF810+53p + ; sub_4CF810+73p + ; DATA XREF: ... + +lpAddress = dword ptr 4 + + mov eax, [esp+lpAddress] + test eax, eax + jz short locret_4CDDA6 + push 8000h ; dwFreeType + push 0 ; dwSize + push eax ; lpAddress + call ds:VirtualFree + +locret_4CDDA6: ; CODE XREF: sub_4CDD90+6j + retn +sub_4CDD90 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + + +sub_4CDDB0 proc near ; DATA XREF: .rdata:00517AC8o + +var_10 = dword ptr -10h +var_C = byte ptr -0Ch +var_B = byte ptr -0Bh +var_A = byte ptr -0Ah +var_9 = byte ptr -9 +var_8 = byte ptr -8 +var_4 = dword ptr -4 +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 + + sub esp, 10h + mov eax, dword_544960 + xor eax, esp + mov [esp+10h+var_4], eax + mov ecx, [esp+10h+arg_0] + mov al, [ecx+33B50h] + mov dl, 5 + imul dl + add al, [ecx+33B58h] + mov dl, 9 + imul dl + add al, [ecx+33B5Ch] + push ebp + mov ebp, [esp+14h+arg_4] + mov [esp+14h+var_C], al + mov eax, [ecx+33B60h] + mov ecx, eax + mov edx, eax + push esi + shr ecx, 8 + shr edx, 10h + mov [esp+18h+var_B], al + shr eax, 18h + push edi + mov [esp+1Ch+var_A], cl + mov [esp+1Ch+var_9], dl + mov [esp+1Ch+var_8], al + mov esi, 5 + lea edi, [esp+1Ch+var_C] + +loc_4CDE13: ; CODE XREF: sub_4CDDB0+85j + mov eax, [ebp+0] + mov edx, [eax+0Ch] + lea ecx, [esp+1Ch+var_10] + push ecx + push esi + push edi + push ebp + call edx + mov ecx, [esp+1Ch+var_10] + add edi, ecx + sub esi, ecx + test eax, eax + jnz short loc_4CDE37 + test ecx, ecx + jz short loc_4CDE4B + test esi, esi + jnz short loc_4CDE13 + +loc_4CDE37: ; CODE XREF: sub_4CDDB0+7Dj + pop edi + pop esi + pop ebp + mov ecx, [esp+10h+var_4] + xor ecx, esp + call sub_4A0686 + add esp, 10h + retn 8 +; --------------------------------------------------------------------------- + +loc_4CDE4B: ; CODE XREF: sub_4CDDB0+81j + mov ecx, [esp+1Ch+var_4] + pop edi + pop esi + pop ebp + xor ecx, esp + mov eax, 80004005h + call sub_4A0686 + add esp, 10h + retn 8 +sub_4CDDB0 endp + + align 10h + +; =============== S U B R O U T I N E ======================================= + +sub_4CDE70 proc near ; DATA XREF: .rdata:00517AF4o + +arg_0 = dword ptr 4 + + push esi + mov esi, [esp+4+arg_0] + mov eax, [esi+50h] + test eax, eax + jz short loc_4CDE8B + mov ecx, [eax] + mov edx, [ecx+8] + push eax + call edx + mov dword ptr [esi+50h], 0 + +loc_4CDE8B: ; CODE XREF: sub_4CDE70+Aj + xor eax, eax + pop esi + retn 4 +sub_4CDE70 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + + +sub_4CDEA0 proc near ; CODE XREF: CEncoder_SetStreams+3Cp + +var_4 = dword ptr -4 + + push ecx + push ebx + xor ebx, ebx + push ebp + push esi + mov esi, ecx + mov byte ptr [esi+10h], 0 + mov byte ptr [esi+11h], 0 + mov [esi+14h], ebx + mov [esi+18h], ebx + mov [esi+1Ch], ebx + mov [esi+20h], ebx + mov eax, [esi+50h] + mov [esi+4Ch], ebx + mov [esi+48h], eax + mov [esi+44h], ebx + mov [esi+58h], ebx + mov [esi+5Ch], ebx + mov [esi+64h], bl + push edi + mov [esi+30h], ebx + mov [esi+34h], ebx + mov dword ptr [esi+38h], 0FFFFFFFFh + mov dword ptr [esi+28h], 1 + mov [esi+2Ch], bl + lea ecx, [esi+28420h] + lea edi, [esi+284B0h] + mov [esp+14h+var_4], 0Ch + mov ebp, 400h + +loc_4CDF02: ; CODE XREF: sub_4CDEA0+9Cj + xor edx, edx + mov eax, edi + jmp short loc_4CDF10 +; --------------------------------------------------------------------------- + align 10h + +loc_4CDF10: ; CODE XREF: sub_4CDEA0+66j + ; sub_4CDEA0+84j + mov [eax-3C0h], ebp + mov [eax], ebp + add edx, 1 + add eax, 4 + cmp edx, [esi+33B60h] + jbe short loc_4CDF10 + mov [ecx-30h], ebp + mov [ecx], ebp + mov [ecx+30h], ebp + mov [ecx+60h], ebp + add ecx, 4 + add edi, 40h + sub [esp+14h+var_4], 1 + jnz short loc_4CDF02 + mov ecx, [esi+32658h] + add ecx, [esi+32654h] + mov eax, 1 + shl eax, cl + cmp eax, ebx + jbe short loc_4CDF7C + xor edx, edx + mov ebx, eax + lea esp, [esp+0] + +loc_4CDF60: ; CODE XREF: sub_4CDEA0+DAj + mov edi, [esi+32650h] + add edi, edx + mov ecx, 300h + mov eax, ebp + add edx, 0C00h + sub ebx, 1 + rep stosd + jnz short loc_4CDF60 + +loc_4CDF7C: ; CODE XREF: sub_4CDEA0+B3j + lea edx, [esi+287B4h] + mov ebx, 4 + +loc_4CDF87: ; CODE XREF: sub_4CDEA0+FBj + mov edi, edx + mov ecx, 3Fh + mov eax, ebp + add edx, 100h + sub ebx, 1 + rep stosd + jnz short loc_4CDF87 + lea edi, [esi+28BB0h] + mov ecx, 72h + rep stosd + mov ecx, [esi+33B5Ch] + mov edx, 1 + shl edx, cl + lea ecx, [esi+28DB8h] + push edx + call sub_4CDB80 + mov ecx, [esi+33B5Ch] + mov eax, 1 + shl eax, cl + lea ecx, [esi+2DA04h] + push eax + call sub_4CDB80 + mov eax, ebp + mov [esi+28D7Ch], eax + mov [esi+28D80h], eax + mov [esi+28D84h], eax + mov [esi+28D88h], eax + mov [esi+28D8Ch], eax + mov [esi+28D90h], eax + mov [esi+28D94h], eax + mov [esi+28D98h], eax + mov [esi+28D9Ch], eax + mov [esi+28DA0h], eax + mov [esi+28DA4h], eax + mov [esi+28DA8h], eax + mov [esi+28DACh], eax + mov [esi+28DB0h], eax + mov [esi+28DB4h], eax + xor eax, eax + pop edi + mov [esi+32F10h], bl + mov [esi+32F08h], eax + mov [esi+32F0Ch], eax + mov [esi+32F04h], eax + pop esi + pop ebp + pop ebx + pop ecx + retn +sub_4CDEA0 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CF450 proc near ; CODE XREF: .text:004CF692p + ; CEncoder_Flush+42p + +var_8 = dword ptr -8 +var_4 = dword ptr -4 + + sub esp, 8 + push esi + mov esi, ecx + mov eax, [esi+0Ch] + push edi + mov edi, [esi+4] + cmp eax, edi + jb short loc_4CF464 + mov edi, [esi+10h] + +loc_4CF464: ; CODE XREF: sub_4CF450+Fj + push ebp + mov ebp, [esi+20h] + xor edx, edx + sub edi, eax + cmp ebp, edx + mov [esp+14h+var_4], edx + jz short loc_4CF4BA + push ebx + mov ebx, [esi] + add ebx, eax + mov eax, dword_553598 + cmp eax, edx + jnz short loc_4CF4A5 + push 0Ch ; Size + call _operator_new ; operator new(uint) + xor ecx, ecx + add esp, 4 + cmp eax, ecx + jz short loc_4CF49C + mov [eax], ecx + mov [eax+4], ecx + mov [eax+8], ecx + jmp short loc_4CF49E +; --------------------------------------------------------------------------- + +loc_4CF49C: ; CODE XREF: sub_4CF450+40j + xor eax, eax + +loc_4CF49E: ; CODE XREF: sub_4CF450+4Aj + mov dword_553598, eax + xor edx, edx + +loc_4CF4A5: ; CODE XREF: sub_4CF450+30j + mov eax, [eax+8] + cmp eax, edx + jz short loc_4CF4B6 + push edi + push ebx + push ebp + call eax + add esp, 0Ch + xor edx, edx + +loc_4CF4B6: ; CODE XREF: sub_4CF450+5Aj + add [esi+20h], edi + pop ebx + +loc_4CF4BA: ; CODE XREF: sub_4CF450+22j + mov eax, [esi+14h] + cmp eax, edx + pop ebp + jz short loc_4CF4E4 + mov [esp+10h+var_8], edx + mov ecx, [eax] + lea edx, [esp+10h+var_8] + push edx + mov edx, [esi] + add edx, [esi+0Ch] + push edi + push edx + push eax + mov eax, [ecx+0Ch] + call eax + mov edi, [esp+10h+var_8] + mov [esp+10h+var_4], eax + xor edx, edx + +loc_4CF4E4: ; CODE XREF: sub_4CF450+70j + add [esi+0Ch], edi + mov ecx, [esi+0Ch] + mov eax, [esi+10h] + cmp ecx, eax + jnz short loc_4CF4F4 + mov [esi+0Ch], edx + +loc_4CF4F4: ; CODE XREF: sub_4CF450+9Fj + cmp [esi+4], eax + jnz short loc_4CF500 + mov byte ptr [esi+24h], 1 + mov [esi+4], edx + +loc_4CF500: ; CODE XREF: sub_4CF450+A7j + mov ecx, [esi+0Ch] + cmp ecx, [esi+4] + jbe short loc_4CF50A + mov eax, ecx + +loc_4CF50A: ; CODE XREF: sub_4CF450+B6j + add [esi+18h], edi + mov [esi+8], eax + mov eax, [esp+10h+var_4] + adc [esi+1Ch], edx + pop edi + pop esi + add esp, 8 + retn +sub_4CF450 endp + +; --------------------------------------------------------------------------- + align 10h + + +; --------------------------------------------------------------------------- + +; int __stdcall Interface1_QueryInterface(int, void *Buf1, int) +Interface1_QueryInterface proc near ; DATA XREF: .rdata:off_517A90o +; sub_4CF520 + +arg_0 = dword ptr 4 +Buf1 = dword ptr 8 +arg_8 = dword ptr 0Ch + + mov eax, [esp+Buf1] + push offset dword_512730 ; Buf2 + push eax ; Buf1 + call unknown_libname_324 ; MFC 3.1/4.0/4.2/8.0 32bit + add esp, 8 + test eax, eax + jz short loc_4CF54D + mov eax, [esp+arg_0] + mov ecx, [esp+arg_8] + mov [ecx], eax + mov edx, [eax] + push eax + mov eax, [edx+4] + call eax + xor eax, eax + retn 0Ch +loc_4CF54D: ; CODE XREF: Interface1_QueryInterface+14j + mov eax, 80004002h + retn 0Ch +Interface1_QueryInterface endp + +; --------------------------------------------------------------------------- + +; int __stdcall Interface1_Release(void *pUnknown) +Interface1_Release proc near ; DATA XREF: .rdata:00517A98o + +pUnknown = dword ptr 4 + + mov ecx, [esp+pUnknown] + add dword ptr [ecx+4], 0FFFFFFFFh + mov eax, [ecx+4] + jnz short locret_4CF585 + push ecx ; Memory + mov dword ptr [ecx], offset off_517A90 + mov dword ptr [ecx+8], 0 + call j__free + add esp, 4 + xor eax, eax + +locret_4CF585: ; CODE XREF: Interface1_Release+Bj + retn 4 +Interface1_Release endp + +; --------------------------------------------------------------------------- + +sub_4CF590 proc near ; DATA XREF: .rdata:00517AB4o + +arg_0 = dword ptr 4 +arg_4 = byte ptr 8 +arg_8 = dword ptr 0Ch +arg_C = dword ptr 10h + + mov eax, [esp+arg_0] + mov edx, [eax+10h] + sub edx, [eax+18h] + mov ecx, [eax+14h] + sbb ecx, [eax+1Ch] + push ebx + mov ebx, [esp+4+arg_8] + push edi + mov edi, [esp+8+arg_C] + cmp edi, ecx + jb short loc_4CF5C2 + ja short loc_4CF5B4 + cmp ebx, edx + jbe short loc_4CF5C2 + +loc_4CF5B4: ; CODE XREF: sub_4CF590+1Ej + pop edi + mov byte ptr [eax+20h], 1 + mov eax, 80004005h + pop ebx + retn 10h +; --------------------------------------------------------------------------- + +loc_4CF5C2: ; CODE XREF: sub_4CF590+1Cj + ; sub_4CF590+22j + push esi + xor esi, esi + xor ecx, ecx + test edi, edi + jb short loc_4CF5FA + ja short loc_4CF5D1 + test ebx, ebx + jbe short loc_4CF5FA + +loc_4CF5D1: ; CODE XREF: sub_4CF590+3Bj + mov dl, [esp+0Ch+arg_4] + push ebp + +loc_4CF5D6: ; CODE XREF: sub_4CF590+5Fj + ; sub_4CF590+67j + mov ebp, [eax+18h] + mov ebx, [eax+8] + mov [ebx+ebp], dl + add dword ptr [eax+18h], 1 + adc dword ptr [eax+1Ch], 0 + add esi, 1 + adc ecx, 0 + cmp ecx, edi + jb short loc_4CF5D6 + ja short loc_4CF5F9 + cmp esi, [esp+10h+arg_8] + jb short loc_4CF5D6 + +loc_4CF5F9: ; CODE XREF: sub_4CF590+61j + pop ebp + +loc_4CF5FA: ; CODE XREF: sub_4CF590+39j + ; sub_4CF590+3Fj + pop esi + pop edi + xor eax, eax + pop ebx + retn 10h +sub_4CF590 endp + +; =============== S U B R O U T I N E ======================================= + +; int __stdcall Interface2_Release(void *pUnknown) +Interface2_Release proc near ; DATA XREF: .rdata:00517AACo +; sub_4CF610 + +pUnknown = dword ptr 4 + + mov ecx, [esp+pUnknown] + add dword ptr [ecx+4], 0FFFFFFFFh + mov eax, [ecx+4] + jnz short locret_4CF635 + push ecx ; Memory + mov dword ptr [ecx], offset off_517AA4 + mov dword ptr [ecx+8], 0 + call j__free + add esp, 4 + xor eax, eax + +locret_4CF635: ; CODE XREF: Interface2_Release+Bj + retn 4 +Interface2_Release endp + +; =============== S U B R O U T I N E ======================================= + +loc_4CF640: ; CODE XREF: sub_4CF6E0+39p + ; sub_4CFAC0+57p ... + push ecx + push ebx + push esi + push edi + mov edi, ecx + mov esi, [edi+8] + cmp esi, 0FF000000h + jb short loc_4CF661 + mov edx, [edi+0Ch] + mov eax, esi + mov cl, 20h + call __allshr ; Microsoft VisualC 2-8/net runtime + test eax, eax + jz short loc_4CF6B6 + +loc_4CF661: ; CODE XREF: .text:004CF64Fj + mov bl, [edi+4] + lea esi, [edi+18h] + +loc_4CF667: ; CODE XREF: .text:004CF6A9j + mov eax, [edi+8] + mov edx, [edi+0Ch] + mov cl, 20h + call __allshr ; Microsoft VisualC 2-8/net runtime + mov ecx, [esi+4] + mov edx, [esi] + add al, bl + mov [ecx+edx], al + add dword ptr [esi+4], 1 + mov eax, [esi+4] + cmp eax, [esi+8] + jnz short loc_4CF6A3 + cmp [esi+0Ch], eax + jz short loc_4CF6A3 + nop + +loc_4CF690: ; CODE XREF: .text:004CF6A1j + mov ecx, esi + call sub_4CF450 + test eax, eax + jnz short loc_4CF6CB + mov eax, [esi+0Ch] + cmp eax, [esi+4] + jnz short loc_4CF690 + +loc_4CF6A3: ; CODE XREF: .text:004CF688j + ; .text:004CF68Dj + or bl, 0FFh + add dword ptr [edi], 0FFFFFFFFh + jnz short loc_4CF667 + mov esi, [edi+8] + mov edx, esi + shr edx, 18h + mov [edi+4], dl + +loc_4CF6B6: ; CODE XREF: .text:004CF65Fj + add dword ptr [edi], 1 + shl esi, 8 + mov [edi+8], esi + mov dword ptr [edi+0Ch], 0 + pop edi + pop esi + pop ebx + pop ecx + retn + +; --------------------------------------------------------------------------- + +loc_4CF6CB: ; CODE XREF: .text:004CF699j + push offset dword_526DD0 + lea ecx, [esp+10h] + push ecx + mov [esp+14h], eax + int 3 +; call __CxxThrowException@8 ; _CxxThrowException(x,x) +; --------------------------------------------------------------------------- + + db 2 dup(0CCh) + +; =============== S U B R O U T I N E ======================================= + + +sub_4CF6E0 proc near ; CODE XREF: sub_4D0770+FBp + ; CEncoder_CodeOneBlock+6C5p + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 + + push esi + push edi + mov edi, [esp+8+arg_4] + add edi, 0FFFFFFFFh + mov esi, ecx + js short loc_4CF724 + push ebp + mov ebp, [esp+0Ch+arg_0] + +loc_4CF6F2: ; CODE XREF: sub_4CF6E0+41j + shr dword ptr [esi+10h], 1 + mov eax, [esi+10h] + mov edx, ebp + mov ecx, edi + shr edx, cl + test dl, 1 + jz short loc_4CF70A + add [esi+8], eax + adc dword ptr [esi+0Ch], 0 + +loc_4CF70A: ; CODE XREF: sub_4CF6E0+21j + cmp eax, 1000000h + jnb short loc_4CF71E + shl eax, 8 + mov ecx, esi + mov [esi+10h], eax + call loc_4CF640 + +loc_4CF71E: ; CODE XREF: sub_4CF6E0+2Fj + sub edi, 1 + jns short loc_4CF6F2 + pop ebp + +loc_4CF724: ; CODE XREF: sub_4CF6E0+Bj + pop edi + pop esi + retn 8 +sub_4CF6E0 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CF740 proc near ; CODE XREF: sub_4D0770+DFp + ; CEncoder_CodeOneBlock+58Ap ... + +arg_0 = dword ptr 4 + + push esi + push edi + mov edi, [esp+8+arg_0] + mov eax, edi + imul eax, 440h + mov esi, ecx + mov edx, [esi+4C08h] + lea ecx, [eax+esi+808h] + push ecx + push edx + push edi + mov ecx, esi + call sub_4CDC00 + mov eax, [esi+4C08h] + mov [esi+edi*4+4C0Ch], eax + pop edi + pop esi + retn 4 +sub_4CF740 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CF780 proc near ; CODE XREF: CEncoder_SetStreams+7Ep + ; CEncoder_SetStreams+A6p + +arg_0 = dword ptr 4 + + push esi + push edi + xor edi, edi + cmp [esp+8+arg_0], edi + mov esi, ecx + jbe short loc_4CF7CC + push ebx + push ebp + lea ebx, [esi+4C0Ch] + lea ebp, [esi+808h] + lea ebx, [ebx+0] + +loc_4CF7A0: ; CODE XREF: sub_4CF780+48j + mov eax, [esi+4C08h] + push ebp + push eax + push edi + mov ecx, esi + call sub_4CDC00 + mov ecx, [esi+4C08h] + mov [ebx], ecx + add edi, 1 + add ebx, 4 + add ebp, 440h + cmp edi, [esp+10h+arg_0] + jb short loc_4CF7A0 + pop ebp + pop ebx + +loc_4CF7CC: ; CODE XREF: sub_4CF780+Aj + pop edi + pop esi + retn 4 +sub_4CF780 endp + +; --------------------------------------------------------------------------- + align 10h +CEncoder_GetOptimum proc near ; CODE XREF: CEncoder_CodeOneBlock+201p + +var_7D = byte ptr -7Dh +var_7C = dword ptr -7Ch +var_78 = dword ptr -78h +var_74 = dword ptr -74h +var_70 = dword ptr -70h +var_6C = dword ptr -6Ch +var_68 = dword ptr -68h +var_64 = dword ptr -64h +var_60 = dword ptr -60h +var_5C = dword ptr -5Ch +var_58 = dword ptr -58h +var_54 = dword ptr -54h +var_50 = dword ptr -50h +var_4C = dword ptr -4Ch +var_48 = dword ptr -48h +var_44 = dword ptr -44h +var_40 = dword ptr -40h +var_3C = dword ptr -3Ch +var_38 = dword ptr -38h +var_34 = dword ptr -34h +var_30 = dword ptr -30h +var_2C = dword ptr -2Ch +var_28 = dword ptr -28h +var_24 = dword ptr -24h +var_20 = dword ptr -20h +var_1C = dword ptr -1Ch +var_18 = dword ptr -18h +var_14 = dword ptr -14h +var_10 = dword ptr -10h +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 + + sub esp, 80h + push ebp + mov ebp, ecx + mov edx, [ebp+32F0Ch] + cmp [ebp+32F08h], edx + push esi + jz short loc_4CE0A5 + mov esi, [esp+88h+arg_4] + lea eax, [edx+edx*4+1Eh] + lea ecx, [ebp+eax*8+0] + mov eax, [ecx+10h] + sub eax, edx + mov edx, [ecx+14h] + mov [esi], edx + mov ecx, [ecx+10h] + pop esi + mov [ebp+32F0Ch], ecx + pop ebp + add esp, 80h + retn 8 +; --------------------------------------------------------------------------- + +loc_4CE0A5: ; CODE XREF: CEncoder_GetOptimum+16j + mov edx, [ebp+80h] + mov eax, [ebp+70h] + push ebx + xor esi, esi + push edx + mov [ebp+32F08h], esi + mov [ebp+32F0Ch], esi + call eax + add esp, 4 + cmp byte ptr [ebp+32F10h], 0 + mov ebx, eax + mov [esp+8Ch+var_60], eax + jnz short loc_4CE0E4 + lea ecx, [esp+8Ch+var_70] + push ecx + mov ecx, ebp + call sub_4CB3B0 + mov [esp+8Ch+var_68], eax + jmp short loc_4CE0FF +; --------------------------------------------------------------------------- + +loc_4CE0E4: ; CODE XREF: CEncoder_GetOptimum+70j + mov edx, [ebp+32EFCh] + mov eax, [ebp+32F00h] + mov [esp+8Ch+var_68], edx + mov [esp+8Ch+var_70], eax + mov byte ptr [ebp+32F10h], 0 + +loc_4CE0FF: ; CODE XREF: CEncoder_GetOptimum+82j + mov ecx, [ebp+80h] + mov edx, [ebp+74h] + push edi + push ecx + call edx + mov edi, eax + add esp, 4 + sub edi, 1 + cmp ebx, 2 + jnb short loc_4CE138 + mov eax, [esp+90h+arg_4] + pop edi + pop ebx + pop esi + mov dword ptr [eax], 0FFFFFFFFh + mov eax, 1 + pop ebp + add esp, 80h + retn 8 +; --------------------------------------------------------------------------- + +loc_4CE138: ; CODE XREF: CEncoder_GetOptimum+B7j + cmp ebx, 111h + jbe short loc_4CE149 + mov ebx, 111h + mov [esp+90h+var_60], ebx + +loc_4CE149: ; CODE XREF: CEncoder_GetOptimum+DEj + lea ecx, [ebp+14h] + mov [esp+90h+var_50], esi + mov [esp+90h+var_64], esi + xor edx, edx + mov [esp+90h+var_4C], esi + mov [esp+90h+var_6C], ecx + mov edi, edi + +loc_4CE160: ; CODE XREF: CEncoder_GetOptimum+180j + mov eax, [esp+90h+var_6C] + mov eax, [eax] + mov ecx, edi + sub ecx, eax + mov [esp+edx+90h+var_20], eax + mov al, [edi] + sub ecx, 1 + cmp al, [ecx] + jnz short loc_4CE1C9 + mov al, [edi+1] + cmp al, [ecx+1] + jnz short loc_4CE1C9 + mov eax, 2 + cmp ebx, eax + jbe short loc_4CE1A7 + lea esi, [edi+2] + sub ecx, edi + lea ecx, [ecx+0] + +loc_4CE190: ; CODE XREF: CEncoder_GetOptimum+143j + mov bl, [esi] + cmp bl, [ecx+esi] + mov ebx, [esp+90h+var_60] + jnz short loc_4CE1A5 + add eax, 1 + add esi, 1 + cmp eax, ebx + jb short loc_4CE190 + +loc_4CE1A5: ; CODE XREF: CEncoder_GetOptimum+139j + xor esi, esi + +loc_4CE1A7: ; CODE XREF: CEncoder_GetOptimum+126j + mov ecx, [esp+90h+var_4C] + mov [esp+edx+90h+var_10], eax + cmp eax, [esp+ecx+90h+var_10] + jbe short loc_4CE1D0 + mov eax, [esp+90h+var_64] + mov [esp+90h+var_50], eax + mov [esp+90h+var_4C], edx + jmp short loc_4CE1D0 +; --------------------------------------------------------------------------- + +loc_4CE1C9: ; CODE XREF: CEncoder_GetOptimum+115j + ; CEncoder_GetOptimum+11Dj + mov [esp+edx+90h+var_10], esi + +loc_4CE1D0: ; CODE XREF: CEncoder_GetOptimum+159j + ; CEncoder_GetOptimum+167j + add [esp+90h+var_64], 1 + add [esp+90h+var_6C], 4 + add edx, 4 + cmp edx, 10h + jb loc_4CE160 + mov ecx, [esp+90h+var_50] + mov ebx, [esp+ecx*4+90h+var_10] + mov eax, [ebp+32EF8h] + cmp ebx, eax + mov [esp+90h+var_40], ebx + jb short loc_4CE234 + mov edx, [esp+90h+arg_4] + lea eax, [ebx-1] + cmp eax, esi + mov [edx], ecx + jz short loc_4CE225 + add [ebp+32F04h], eax + mov ecx, [ebp+7Ch] + push eax + mov eax, [ebp+80h] + push eax + call ecx + add esp, 8 + +loc_4CE225: ; CODE XREF: CEncoder_GetOptimum+1ADj + pop edi + mov eax, ebx + pop ebx + pop esi + pop ebp + add esp, 80h + retn 8 +; --------------------------------------------------------------------------- + +loc_4CE234: ; CODE XREF: CEncoder_GetOptimum+19Dj + mov esi, [esp+90h+var_68] + cmp esi, eax + jb short loc_4CE27F + mov edx, [esp+90h+var_70] + mov eax, [ebp+edx*4+3265Ch] + mov ecx, [esp+90h+arg_4] + add eax, 4 + mov [ecx], eax + lea eax, [esi-1] + test eax, eax + jz short loc_4CE270 + mov edx, [ebp+80h] + add [ebp+32F04h], eax + push eax + mov eax, [ebp+7Ch] + push edx + call eax + add esp, 8 + +loc_4CE270: ; CODE XREF: CEncoder_GetOptimum+1F8j + pop edi + pop ebx + mov eax, esi + pop esi + pop ebp + add esp, 80h + retn 8 +; --------------------------------------------------------------------------- + +loc_4CE27F: ; CODE XREF: CEncoder_GetOptimum+1DAj + mov al, [edi] + mov esi, [esp+90h+var_20] + sub edi, esi + cmp [esp+90h+var_68], 2 + mov cl, [edi-1] + mov byte ptr [esp+90h+var_4C], al + mov byte ptr [esp+90h+var_50], cl + jnb short loc_4CE2C1 + cmp al, cl + jz short loc_4CE2C1 + cmp ebx, 2 + jnb short loc_4CE2C1 + mov ecx, [esp+90h+arg_4] + pop edi + pop ebx + pop esi + mov dword ptr [ecx], 0FFFFFFFFh + mov eax, 1 + pop ebp + add esp, 80h + retn 8 +; --------------------------------------------------------------------------- + +loc_4CE2C1: ; CODE XREF: CEncoder_GetOptimum+237j + ; CEncoder_GetOptimum+23Bj ... + mov edx, [esp+90h+var_4C] + mov bl, [ebp+10h] + mov edi, [ebp+33B60h] + and edi, [esp+90h+arg_0] + mov ecx, [esp+90h+var_50] + push edx + cmp bl, 7 + setnb dl + push ecx + mov [ebp+0F0h], bl + mov eax, [ebp+32654h] + mov ecx, 8 + sub cl, al + push edx + movzx edx, byte ptr [ebp+11h] + shr edx, cl + mov ecx, [ebp+3265Ch] + and ecx, [esp+9Ch+arg_0] + mov [esp+9Ch+var_3C], ecx + mov ecx, eax + mov eax, [esp+9Ch+var_3C] + shl eax, cl + add edx, eax + imul edx, 0C00h + add edx, [ebp+32650h] + mov ecx, edx + call sub_4CDAC0 + movzx ecx, bl + shl ecx, 4 + add ecx, edi + mov edx, [ebp+ecx*4+280F0h] + shr edx, 2 + add eax, dword_550998[edx*4] + mov ebx, 800h + mov [ebp+124h], eax + mov dword ptr [ebp+12Ch], 0FFFFFFFFh + mov byte ptr [ebp+119h], 0 + mov cl, [ebp+10h] + movzx eax, cl + mov edx, eax + shl edx, 4 + add edx, edi + sub ebx, [ebp+edx*4+280F0h] + mov edx, 800h + sub edx, [ebp+eax*4+283F0h] + mov al, byte ptr [esp+90h+var_4C] + shr edx, 2 + mov edx, dword_550998[edx*4] + shr ebx, 2 + mov ebx, dword_550998[ebx*4] + add edx, ebx + cmp byte ptr [esp+90h+var_50], al + mov [esp+90h+var_44], ebx + mov [esp+90h+var_3C], edx + jnz short loc_4CE3F3 + movzx eax, cl + mov ebx, [ebp+eax*4+28420h] + mov ecx, eax + shl ecx, 4 + add ecx, edi + mov ecx, [ebp+ecx*4+284B0h] + shr ecx, 2 + mov eax, dword_550998[ecx*4] + shr ebx, 2 + add eax, dword_550998[ebx*4] + add eax, edx + cmp eax, [ebp+124h] + jnb short loc_4CE3F3 + mov [ebp+124h], eax + mov dword ptr [ebp+12Ch], 0 + mov byte ptr [ebp+119h], 0 + +loc_4CE3F3: ; CODE XREF: CEncoder_GetOptimum+344j + ; CEncoder_GetOptimum+37Aj + mov eax, [esp+90h+var_68] + mov ecx, [esp+90h+var_40] + cmp eax, ecx + jb short loc_4CE405 + mov [esp+90h+var_7C], eax + jmp short loc_4CE40B +; --------------------------------------------------------------------------- + +loc_4CE405: ; CODE XREF: CEncoder_GetOptimum+39Dj + mov [esp+90h+var_7C], ecx + mov eax, ecx + +loc_4CE40B: ; CODE XREF: CEncoder_GetOptimum+3A3j + cmp eax, 2 + jnb short loc_4CE431 + mov edx, [ebp+12Ch] + mov eax, [esp+90h+arg_4] + pop edi + pop ebx + pop esi + mov [eax], edx + mov eax, 1 + pop ebp + add esp, 80h + retn 8 +; --------------------------------------------------------------------------- + +loc_4CE431: ; CODE XREF: CEncoder_GetOptimum+3AEj + mov ecx, [esp+90h+var_1C] + mov edx, [esp+90h+var_18] + xor ebx, ebx + mov [ebp+128h], ebx + mov [ebp+10Ch], ecx + mov ecx, [esp+90h+var_14] + mov [ebp+110h], edx + lea edx, [eax+eax*4] + mov [ebp+114h], ecx + mov [ebp+108h], esi + lea ecx, [ebp+edx*8+0FCh] + jmp short loc_4CE470 +; --------------------------------------------------------------------------- + align 10h + +loc_4CE470: ; CODE XREF: CEncoder_GetOptimum+407j + ; CEncoder_GetOptimum+41Fj + mov dword ptr [ecx], 0FFFFFFFh + sub eax, 1 + sub ecx, 28h + cmp eax, 2 + jnb short loc_4CE470 + +loc_4CE481: ; CODE XREF: CEncoder_GetOptimum+48Ej + mov esi, [esp+ebx*4+90h+var_10] + cmp esi, 2 + jb short loc_4CE4E8 + movzx eax, byte ptr [ebp+10h] + push edi + push eax + push ebx + mov ecx, ebp + call sub_4CD9B0 + add eax, [esp+90h+var_3C] + mov ecx, edi + imul ecx, 110h + add ecx, esi + mov [esp+90h+var_40], eax + lea edx, [esi+esi*4] + lea eax, [ebp+ecx*4+2E204h] + lea ecx, [ebp+edx*8+0FCh] + mov edi, edi + +loc_4CE4C0: ; CODE XREF: CEncoder_GetOptimum+486j + mov edx, [eax] + add edx, [esp+90h+var_40] + cmp edx, [ecx] + jnb short loc_4CE4DA + mov [ecx], edx + mov dword ptr [ecx+4], 0 + mov [ecx+8], ebx + mov byte ptr [ecx-0Bh], 0 + +loc_4CE4DA: ; CODE XREF: CEncoder_GetOptimum+468j + sub esi, 1 + sub eax, 4 + sub ecx, 28h + cmp esi, 2 + jnb short loc_4CE4C0 + +loc_4CE4E8: ; CODE XREF: CEncoder_GetOptimum+42Bj + add ebx, 1 + cmp ebx, 4 + jb short loc_4CE481 + movzx eax, byte ptr [ebp+10h] + mov ecx, [ebp+eax*4+283F0h] + shr ecx, 2 + mov eax, dword_550998[ecx*4] + add eax, [esp+90h+var_44] + mov [esp+90h+var_3C], eax + mov eax, [esp+90h+var_10] + cmp eax, 2 + lea ebx, [eax+1] + jnb short loc_4CE521 + mov ebx, 2 + +loc_4CE521: ; CODE XREF: CEncoder_GetOptimum+4BAj + cmp ebx, [esp+90h+var_68] + ja loc_4CE5BA + xor eax, eax + cmp ebx, [ebp+32660h] + mov [esp+90h+var_60], eax + jbe short loc_4CE550 + lea esp, [esp+0] + +loc_4CE540: ; CODE XREF: CEncoder_GetOptimum+4EAj + add eax, 2 + cmp ebx, [ebp+eax*4+32660h] + ja short loc_4CE540 + mov [esp+90h+var_60], eax + +loc_4CE550: ; CODE XREF: CEncoder_GetOptimum+4D7j + lea edx, [ebx+ebx*4] + lea esi, [ebp+edx*8+0FCh] + lea ebx, [ebx+0] + +loc_4CE560: ; CODE XREF: CEncoder_GetOptimum+558j + mov eax, [esp+90h+var_60] + mov eax, [ebp+eax*4+32664h] + push edi + push ebx + push eax + mov ecx, ebp + mov [esp+9Ch+var_40], eax + call sub_4CAEC0 + add eax, [esp+90h+var_3C] + cmp eax, [esi] + jnb short loc_4CE598 + mov ecx, [esp+90h+var_40] + add ecx, 4 + mov [esi], eax + mov dword ptr [esi+4], 0 + mov [esi+8], ecx + mov byte ptr [esi-0Bh], 0 + +loc_4CE598: ; CODE XREF: CEncoder_GetOptimum+51Fj + mov eax, [esp+90h+var_60] + cmp ebx, [ebp+eax*4+32660h] + jnz short loc_4CE5B2 + add eax, 2 + cmp eax, [esp+90h+var_70] + mov [esp+90h+var_60], eax + jz short loc_4CE5BA + +loc_4CE5B2: ; CODE XREF: CEncoder_GetOptimum+543j + add ebx, 1 + add esi, 28h + jmp short loc_4CE560 +; --------------------------------------------------------------------------- + +loc_4CE5BA: ; CODE XREF: CEncoder_GetOptimum+4C5j + ; CEncoder_GetOptimum+550j + mov eax, 1 + cmp [esp+90h+var_7C], eax + mov [esp+90h+var_78], eax + jz loc_4CF1D0 + mov esi, eax + jmp short loc_4CE5D5 +; --------------------------------------------------------------------------- + +loc_4CE5D1: ; CODE XREF: CEncoder_GetOptimum+116Aj + mov esi, [esp+90h+var_78] + +loc_4CE5D5: ; CODE XREF: CEncoder_GetOptimum+56Fj + mov edx, [ebp+80h] + mov eax, [ebp+70h] + push edx + call eax + add esp, 4 + lea ecx, [esp+90h+var_4C] + push ecx + mov ecx, ebp + mov [esp+94h+var_60], eax + call sub_4CB3B0 + cmp eax, [ebp+32EF8h] + mov [esp+90h+var_28], eax + jnb loc_4CF1D7 + add [esp+90h+arg_0], 1 + lea edx, [esi+esi*4+1Eh] + mov bl, [ebp+edx*8+1] + test bl, bl + lea eax, [ebp+edx*8+0] + mov edx, [eax+10h] + jz short loc_4CE673 + sub edx, 1 + cmp byte ptr [eax+2], 0 + jz short loc_4CE660 + mov ecx, [eax+4] + add ecx, 6 + cmp dword ptr [eax+8], 4 + lea ecx, [ecx+ecx*4] + mov cl, [ebp+ecx*8+0] + movzx ecx, cl + jnb short loc_4CE64F + mov cl, ds:kRepNextStates[ecx] + movzx ecx, cl + mov cl, ds:kLiteralNextStates[ecx] + jmp short loc_4CE67B +; --------------------------------------------------------------------------- + +loc_4CE64F: ; CODE XREF: CEncoder_GetOptimum+5DCj + mov cl, ds:kMatchNextStates[ecx] + movzx ecx, cl + mov cl, ds:kLiteralNextStates[ecx] + jmp short loc_4CE67B +; --------------------------------------------------------------------------- + +loc_4CE660: ; CODE XREF: CEncoder_GetOptimum+5C6j + lea ecx, [edx+edx*4+1Eh] + mov cl, [ebp+ecx*8+0] + movzx ecx, cl + mov cl, ds:kLiteralNextStates[ecx] + jmp short loc_4CE67B +; --------------------------------------------------------------------------- + +loc_4CE673: ; CODE XREF: CEncoder_GetOptimum+5BDj + lea ecx, [edx+edx*4+1Eh] + mov cl, [ebp+ecx*8+0] + +loc_4CE67B: ; CODE XREF: CEncoder_GetOptimum+5EDj + ; CEncoder_GetOptimum+5FEj ... + add esi, 0FFFFFFFFh + cmp edx, esi + jnz short loc_4CE6AC + cmp dword ptr [eax+14h], 0 + jnz short loc_4CE69A + movzx edx, cl + mov bl, ds:kShortRepNextStates[edx] + mov byte ptr [esp+90h+var_64], bl + jmp loc_4CE754 +; --------------------------------------------------------------------------- + +loc_4CE69A: ; CODE XREF: CEncoder_GetOptimum+626j + movzx ecx, cl + mov bl, ds:kLiteralNextStates[ecx] + mov byte ptr [esp+90h+var_64], bl + jmp loc_4CE754 +; --------------------------------------------------------------------------- + +loc_4CE6AC: ; CODE XREF: CEncoder_GetOptimum+620j + test bl, bl + jz short loc_4CE6CB + cmp byte ptr [eax+2], 0 + jz short loc_4CE6CB + mov edi, [eax+8] + mov edx, [eax+4] + movzx ecx, cl + mov bl, ds:kRepNextStates[ecx] + mov [esp+90h+var_68], edi + jmp short loc_4CE6EA +; --------------------------------------------------------------------------- + +loc_4CE6CB: ; CODE XREF: CEncoder_GetOptimum+64Ej + ; CEncoder_GetOptimum+654j + mov esi, [eax+14h] + cmp esi, 4 + mov [esp+90h+var_68], esi + movzx ecx, cl + mov edi, esi + jnb short loc_4CE6E4 + mov bl, ds:kRepNextStates[ecx] + jmp short loc_4CE6EA +; --------------------------------------------------------------------------- + +loc_4CE6E4: ; CODE XREF: CEncoder_GetOptimum+67Aj + mov bl, ds:kMatchNextStates[ecx] + +loc_4CE6EA: ; CODE XREF: CEncoder_GetOptimum+669j + ; CEncoder_GetOptimum+682j + cmp edi, 4 + lea edx, [edx+edx*4+1Eh] + mov byte ptr [esp+90h+var_64], bl + lea edx, [ebp+edx*8+0] + jnb short loc_4CE738 + mov ecx, [edx+edi*4+18h] + mov esi, 1 + cmp edi, esi + mov [esp+90h+var_20], ecx + jb short loc_4CE723 + mov ecx, edi + lea esi, [edx+18h] + lea edi, [esp+90h+var_1C] + rep movsd + mov esi, [esp+90h+var_68] + add esi, 1 + cmp esi, 4 + jnb short loc_4CE754 + +loc_4CE723: ; CODE XREF: CEncoder_GetOptimum+6AAj + lea edx, [edx+esi*4+18h] + mov ecx, 4 + lea edi, [esp+esi*4+90h+var_20] + sub ecx, esi + mov esi, edx + rep movsd + jmp short loc_4CE754 +; --------------------------------------------------------------------------- + +loc_4CE738: ; CODE XREF: CEncoder_GetOptimum+699j + mov ecx, [edx+18h] + mov [esp+90h+var_1C], ecx + mov ecx, [edx+1Ch] + mov edx, [edx+20h] + add edi, 0FFFFFFFCh + mov [esp+90h+var_20], edi + mov [esp+90h+var_18], ecx + mov [esp+90h+var_14], edx + +loc_4CE754: ; CODE XREF: CEncoder_GetOptimum+635j + ; CEncoder_GetOptimum+647j ... + mov ecx, [esp+90h+var_1C] + mov edx, [esp+90h+var_18] + mov edi, [esp+90h+var_20] + mov [eax], bl + mov [eax+1Ch], ecx + mov ecx, [esp+90h+var_14] + mov [eax+18h], edi + mov [eax+20h], edx + mov [eax+24h], ecx + mov esi, [eax+0Ch] + mov edx, [ebp+80h] + mov eax, [ebp+74h] + push edx + mov [esp+94h+var_3C], esi + call eax + movzx ecx, byte ptr [eax-1] + sub eax, 1 + mov edx, eax + mov byte ptr [esp+94h+var_5C], cl + sub edx, edi + movzx ecx, byte ptr [edx-1] + lea edi, [edx-1] + mov edx, [ebp+32654h] + mov byte ptr [esp+94h+var_58], cl + mov ecx, [ebp+33B60h] + and ecx, [esp+94h+arg_0] + mov [esp+94h+var_40], edi + movzx edi, bl + mov [esp+94h+var_54], ecx + mov [esp+94h+var_68], edi + add esp, 4 + shl edi, 4 + add edi, ecx + mov ecx, [esp+90h+var_5C] + push ecx + mov ecx, [esp+94h+var_58] + push ecx + cmp bl, 7 + mov ebx, [ebp+3265Ch] + setnb cl + and ebx, [esp+98h+arg_0] + mov [esp+98h+var_74], eax + movzx eax, byte ptr [eax-1] + push ecx + mov ecx, 8 + sub cl, dl + shr eax, cl + mov ecx, edx + shl ebx, cl + add eax, ebx + imul eax, 0C00h + add eax, [ebp+32650h] + mov ecx, eax + call sub_4CDAC0 + mov ecx, [ebp+edi*4+280F0h] + shr ecx, 2 + add eax, dword_550998[ecx*4] + mov ecx, [esp+90h+var_78] + add eax, esi + lea edx, [ecx+ecx*4+23h] + cmp eax, [ebp+edx*8+0Ch] + lea esi, [ebp+edx*8+0] + mov [esp+90h+var_7D], 0 + jnb short loc_4CE851 + mov [esi+0Ch], eax + mov [esi+10h], ecx + mov dword ptr [esi+14h], 0FFFFFFFFh + mov byte ptr [esi+1], 0 + mov [esp+90h+var_7D], 1 + +loc_4CE851: ; CODE XREF: CEncoder_GetOptimum+7D9j + mov ebx, [esp+90h+var_68] + mov edx, 800h + sub edx, [ebp+edi*4+280F0h] + shr edx, 2 + mov ecx, dword_550998[edx*4] + add ecx, [esp+90h+var_3C] + mov edx, 800h + sub edx, [ebp+ebx*4+283F0h] + mov ebx, [esp+90h+var_78] + shr edx, 2 + mov edx, dword_550998[edx*4] + add edx, ecx + mov [esp+90h+var_24], ecx + mov cl, byte ptr [esp+90h+var_58] + cmp cl, byte ptr [esp+90h+var_5C] + mov [esp+90h+var_38], edx + jnz short loc_4CE8EB + cmp [esi+10h], ebx + jnb short loc_4CE8A8 + cmp dword ptr [esi+14h], 0 + jz short loc_4CE8EB + +loc_4CE8A8: ; CODE XREF: CEncoder_GetOptimum+840j + mov ecx, [esp+90h+var_68] + mov ecx, [ebp+ecx*4+28420h] + mov edi, [ebp+edi*4+284B0h] + shr ecx, 2 + mov ecx, dword_550998[ecx*4] + shr edi, 2 + add ecx, dword_550998[edi*4] + add ecx, edx + cmp ecx, [esi+0Ch] + ja short loc_4CE8EB + mov [esi+0Ch], ecx + mov [esi+10h], ebx + mov dword ptr [esi+14h], 0 + mov byte ptr [esi+1], 0 + mov [esp+90h+var_7D], 1 + +loc_4CE8EB: ; CODE XREF: CEncoder_GetOptimum+83Bj + ; CEncoder_GetOptimum+846j ... + mov edx, [esp+90h+var_60] + mov ecx, 0FFFh + sub ecx, ebx + cmp ecx, edx + jnb short loc_4CE900 + mov edx, ecx + mov [esp+90h+var_60], edx + +loc_4CE900: ; CODE XREF: CEncoder_GetOptimum+898j + cmp edx, 2 + mov ebx, edx + mov [esp+90h+var_6C], ebx + jb loc_4CF1BB + mov esi, [ebp+32EF8h] + mov edi, [esp+90h+var_60] + cmp edi, esi + jbe short loc_4CE923 + mov ebx, esi + mov [esp+90h+var_6C], esi + +loc_4CE923: ; CODE XREF: CEncoder_GetOptimum+8BBj + cmp [esp+90h+var_7D], 0 + jnz loc_4CEA90 + mov dl, byte ptr [esp+90h+var_5C] + cmp byte ptr [esp+90h+var_58], dl + jz loc_4CEA90 + lea ecx, [esi+1] + cmp edi, ecx + jb short loc_4CE945 + mov edi, ecx + +loc_4CE945: ; CODE XREF: CEncoder_GetOptimum+8E1j + mov esi, 1 + cmp edi, esi + jbe short loc_4CE975 + mov ebx, [esp+90h+var_74] + mov edx, [esp+90h+var_40] + lea ecx, [ebx+1] + sub edx, ebx + jmp short loc_4CE960 +; --------------------------------------------------------------------------- + align 10h + +loc_4CE960: ; CODE XREF: CEncoder_GetOptimum+8FBj + ; CEncoder_GetOptimum+90Fj + mov bl, [ecx] + cmp bl, [edx+ecx] + jnz short loc_4CE971 + add esi, 1 + add ecx, 1 + cmp esi, edi + jb short loc_4CE960 + +loc_4CE971: ; CODE XREF: CEncoder_GetOptimum+905j + mov ebx, [esp+90h+var_6C] + +loc_4CE975: ; CODE XREF: CEncoder_GetOptimum+8ECj + add esi, 0FFFFFFFFh + cmp esi, 2 + mov [esp+90h+var_50], esi + jb loc_4CEA90 + mov ecx, [esp+90h+var_68] + mov dl, ds:kLiteralNextStates[ecx] + mov ecx, [esp+90h+arg_0] + movzx ebx, dl + add ecx, 1 + and ecx, [ebp+33B60h] + mov edx, ebx + shl edx, 4 + lea esi, [edx+ecx] + mov edx, 800h + sub edx, [ebp+ebx*4+283F0h] + mov edi, 800h + sub edi, [ebp+esi*4+280F0h] + shr edx, 2 + mov edx, dword_550998[edx*4] + shr edi, 2 + add edx, dword_550998[edi*4] + mov edi, [esp+90h+var_78] + add edx, eax + mov eax, [esp+90h+var_50] + lea edi, [eax+edi+1] + mov eax, [esp+90h+var_7C] + cmp eax, edi + mov [esp+90h+var_40], esi + jnb short loc_4CEA22 + mov esi, [esp+90h+var_7C] + lea eax, [eax+eax*4] + lea eax, [ebp+eax*8+0FCh] + mov [esp+90h+var_3C], eax + mov eax, edi + sub eax, esi + add esi, eax + mov [esp+90h+var_7C], esi + mov esi, [esp+90h+var_3C] + +loc_4CEA10: ; CODE XREF: CEncoder_GetOptimum+9BCj + add esi, 28h + sub eax, 1 + mov dword ptr [esi], 0FFFFFFFh + jnz short loc_4CEA10 + mov esi, [esp+90h+var_40] + +loc_4CEA22: ; CODE XREF: CEncoder_GetOptimum+98Ej + imul ecx, 110h + add ecx, [esp+90h+var_50] + mov eax, 800h + sub eax, [ebp+esi*4+284B0h] + mov esi, [ebp+ebx*4+28420h] + mov ebx, [esp+90h+var_6C] + shr eax, 2 + mov eax, dword_550998[eax*4] + shr esi, 2 + add eax, dword_550998[esi*4] + mov esi, [esp+90h+var_7C] + add eax, [ebp+ecx*4+2E204h] + lea ecx, [edi+edi*4+1Eh] + add eax, edx + cmp eax, [ebp+ecx*8+0Ch] + lea ecx, [ebp+ecx*8+0] + jnb short loc_4CEA94 + mov edx, [esp+90h+var_78] + add edx, 1 + mov [ecx+0Ch], eax + mov [ecx+10h], edx + mov dword ptr [ecx+14h], 0 + mov byte ptr [ecx+1], 1 + mov byte ptr [ecx+2], 0 + jmp short loc_4CEA94 +; --------------------------------------------------------------------------- + +loc_4CEA90: ; CODE XREF: CEncoder_GetOptimum+8C8j + ; CEncoder_GetOptimum+8D6j ... + mov esi, [esp+90h+var_7C] + +loc_4CEA94: ; CODE XREF: CEncoder_GetOptimum+A10j + ; CEncoder_GetOptimum+A2Ej + mov [esp+90h+var_70], 0 + mov ecx, [esp+90h+var_70] + mov [esp+90h+var_40], 2 + jmp short loc_4CEAB8 +; --------------------------------------------------------------------------- + align 10h + +loc_4CEAB0: ; CODE XREF: CEncoder_GetOptimum+D63j + mov ebx, [esp+90h+var_6C] + mov esi, [esp+90h+var_7C] + +loc_4CEAB8: ; CODE XREF: CEncoder_GetOptimum+A48j + mov edx, [esp+90h+var_74] + mov eax, edx + sub eax, [esp+ecx*4+90h+var_20] + mov cl, [edx] + sub eax, 1 + cmp cl, [eax] + mov [esp+90h+var_48], eax + jnz loc_4CEDB5 + mov cl, [edx+1] + cmp cl, [eax+1] + jnz loc_4CEDB5 + mov edi, 2 + cmp ebx, edi + jbe short loc_4CEB01 + lea ecx, [edx+2] + sub eax, edx + lea ecx, [ecx+0] + +loc_4CEAF0: ; CODE XREF: CEncoder_GetOptimum+A9Fj + mov dl, [ecx] + cmp dl, [eax+ecx] + jnz short loc_4CEB01 + add edi, 1 + add ecx, 1 + cmp edi, ebx + jb short loc_4CEAF0 + +loc_4CEB01: ; CODE XREF: CEncoder_GetOptimum+A86j + ; CEncoder_GetOptimum+A95j + mov eax, [esp+90h+var_78] + lea ebx, [edi+eax] + cmp esi, ebx + jnb short loc_4CEB2E + mov eax, ebx + lea ecx, [esi+esi*4] + sub eax, esi + add esi, eax + lea ecx, [ebp+ecx*8+0FCh] + mov [esp+90h+var_7C], esi + +loc_4CEB20: ; CODE XREF: CEncoder_GetOptimum+ACCj + add ecx, 28h + sub eax, 1 + mov dword ptr [ecx], 0FFFFFFFh + jnz short loc_4CEB20 + +loc_4CEB2E: ; CODE XREF: CEncoder_GetOptimum+AAAj + mov edx, [esp+90h+var_54] + mov eax, [esp+90h+var_64] + mov ecx, [esp+90h+var_70] + push edx + push eax + push ecx + mov ecx, ebp + mov esi, edi + call sub_4CD9B0 + add eax, [esp+90h+var_38] + mov ecx, [esp+90h+var_54] + imul ecx, 110h + lea edx, [edi+ecx] + mov [esp+90h+var_34], ecx + lea ecx, [ebp+edx*4+2E204h] + mov [esp+90h+var_50], ecx + lea edx, [ebx+ebx*4] + mov ebx, [esp+90h+var_50] + mov [esp+90h+var_2C], eax + lea ecx, [ebp+edx*8+0FCh] + +loc_4CEB78: ; CODE XREF: CEncoder_GetOptimum+B40j + mov edx, [ebx] + add edx, eax + cmp edx, [ecx] + jnb short loc_4CEB94 + mov [ecx], edx + mov edx, [esp+90h+var_78] + mov [ecx+4], edx + mov edx, [esp+90h+var_70] + mov [ecx+8], edx + mov byte ptr [ecx-0Bh], 0 + +loc_4CEB94: ; CODE XREF: CEncoder_GetOptimum+B1Ej + sub edi, 1 + sub ebx, 4 + sub ecx, 28h + cmp edi, 2 + jnb short loc_4CEB78 + cmp [esp+90h+var_70], 0 + jnz short loc_4CEBB0 + lea eax, [esi+1] + mov [esp+90h+var_40], eax + +loc_4CEBB0: ; CODE XREF: CEncoder_GetOptimum+B47j + mov ecx, [ebp+32EF8h] + mov edx, [esp+90h+var_60] + lea eax, [esi+1] + add ecx, eax + cmp edx, ecx + jnb short loc_4CEBC5 + mov ecx, edx + +loc_4CEBC5: ; CODE XREF: CEncoder_GetOptimum+B61j + cmp eax, ecx + jnb short loc_4CEBE7 + mov ebx, [esp+90h+var_74] + mov edi, [esp+90h+var_48] + lea edx, [eax+ebx] + sub edi, ebx + +loc_4CEBD6: ; CODE XREF: CEncoder_GetOptimum+B85j + mov bl, [edx] + cmp bl, [edx+edi] + jnz short loc_4CEBE7 + add eax, 1 + add edx, 1 + cmp eax, ecx + jb short loc_4CEBD6 + +loc_4CEBE7: ; CODE XREF: CEncoder_GetOptimum+B67j + ; CEncoder_GetOptimum+B7Bj + or ecx, 0FFFFFFFFh + sub ecx, esi + add eax, ecx + cmp eax, 2 + mov [esp+90h+var_44], eax + jb loc_4CEDB5 + mov edx, [esp+90h+var_68] + mov cl, ds:kRepNextStates[edx] + mov eax, [ebp+33B60h] + mov edi, [esp+90h+arg_0] + movzx ecx, cl + mov ebx, eax + lea edx, [esi+edi] + and ebx, edx + mov edx, ecx + mov cl, ds:kLiteralNextStates[ecx] + shl edx, 4 + add ebx, edx + mov edx, [ebp+ebx*4+280F0h] + movzx ebx, cl + shr edx, 2 + mov edx, dword_550998[edx*4] + mov [esp+90h+var_30], edx + lea edi, [esi+edi+1] + and edi, eax + mov eax, [ebp+32654h] + mov ecx, ebx + shl ecx, 4 + add ecx, edi + mov [esp+90h+var_50], ecx + mov ecx, [esp+90h+var_74] + movzx edx, byte ptr [esi+ecx] + push edx + mov edx, [esp+94h+var_48] + movzx edx, byte ptr [esi+edx] + push edx + movzx edx, byte ptr [ecx+esi-1] + mov ecx, 8 + sub cl, al + shr edx, cl + mov ecx, [esp+98h+arg_0] + lea eax, [esi+ecx] + mov ecx, [ebp+3265Ch] + and ecx, eax + mov eax, ecx + mov ecx, [ebp+32654h] + shl eax, cl + push 1 + add edx, eax + imul edx, 0C00h + add edx, [ebp+32650h] + mov ecx, edx + call sub_4CDAC0 + mov ecx, [esp+90h+var_50] + mov edx, 800h + sub edx, [ebp+ecx*4+280F0h] + mov ecx, [esp+90h+var_34] + shr edx, 2 + add eax, dword_550998[edx*4] + mov edx, 800h + sub edx, [ebp+ebx*4+283F0h] + shr edx, 2 + add eax, dword_550998[edx*4] + lea edx, [esi+ecx] + add eax, [ebp+edx*4+2E204h] + mov ecx, [esp+90h+var_44] + add eax, [esp+90h+var_30] + mov edx, [esp+90h+var_78] + add eax, [esp+90h+var_2C] + add ecx, esi + lea ecx, [ecx+edx+1] + cmp [esp+90h+var_7C], ecx + mov [esp+90h+var_30], ecx + jnb short loc_4CED3E + mov edx, [esp+90h+var_7C] + lea edx, [edx+edx*4] + lea edx, [ebp+edx*8+0FCh] + mov [esp+90h+var_2C], edx + mov edx, [esp+90h+var_7C] + sub ecx, edx + add edx, ecx + mov [esp+90h+var_7C], edx + mov edx, [esp+90h+var_2C] + jmp short loc_4CED30 +; --------------------------------------------------------------------------- + align 10h + +loc_4CED30: ; CODE XREF: CEncoder_GetOptimum+CCBj + ; CEncoder_GetOptimum+CDCj + add edx, 28h + sub ecx, 1 + mov dword ptr [edx], 0FFFFFFFh + jnz short loc_4CED30 + +loc_4CED3E: ; CODE XREF: CEncoder_GetOptimum+CA7j + mov edx, [esp+90h+var_50] + imul edi, 110h + add edi, [esp+90h+var_44] + mov ecx, 800h + sub ecx, [ebp+edx*4+284B0h] + mov edx, [ebp+ebx*4+28420h] + shr ecx, 2 + mov ecx, dword_550998[ecx*4] + shr edx, 2 + add ecx, dword_550998[edx*4] + add ecx, [ebp+edi*4+2E204h] + add ecx, eax + mov eax, [esp+90h+var_30] + lea eax, [eax+eax*4+1Eh] + cmp ecx, [ebp+eax*8+0Ch] + lea eax, [ebp+eax*8+0] + jnb short loc_4CEDB5 + mov [eax+0Ch], ecx + mov ecx, [esp+90h+var_78] + lea edx, [esi+ecx+1] + mov [eax+4], ecx + mov ecx, [esp+90h+var_70] + mov [eax+10h], edx + mov dword ptr [eax+14h], 0 + mov byte ptr [eax+1], 1 + mov byte ptr [eax+2], 1 + mov [eax+8], ecx + +loc_4CEDB5: ; CODE XREF: CEncoder_GetOptimum+A6Dj + ; CEncoder_GetOptimum+A79j ... + mov ecx, [esp+90h+var_70] + add ecx, 1 + cmp ecx, 4 + mov [esp+90h+var_70], ecx + jb loc_4CEAB0 + mov edx, [esp+90h+var_28] + mov ecx, [esp+90h+var_6C] + cmp edx, ecx + jbe short loc_4CEDFB + xor eax, eax + cmp ecx, [ebp+32660h] + mov edx, ecx + jbe short loc_4CEDED + +loc_4CEDE1: ; CODE XREF: CEncoder_GetOptimum+D8Bj + add eax, 2 + cmp ecx, [ebp+eax*4+32660h] + ja short loc_4CEDE1 + +loc_4CEDED: ; CODE XREF: CEncoder_GetOptimum+D7Fj + mov [ebp+eax*4+32660h], ecx + add eax, 2 + mov [esp+90h+var_4C], eax + +loc_4CEDFB: ; CODE XREF: CEncoder_GetOptimum+D73j + mov esi, [esp+90h+var_40] + cmp edx, esi + jb loc_4CF1BB + mov eax, [esp+90h+var_68] + mov ecx, [ebp+eax*4+283F0h] + shr ecx, 2 + mov eax, dword_550998[ecx*4] + add eax, [esp+90h+var_24] + mov ecx, [esp+90h+var_7C] + mov [esp+90h+var_40], eax + mov eax, [esp+90h+var_78] + add eax, edx + cmp ecx, eax + jnb short loc_4CEE52 + lea edx, [ecx+ecx*4] + sub eax, ecx + add ecx, eax + lea edx, [ebp+edx*8+0FCh] + mov [esp+90h+var_7C], ecx + +loc_4CEE44: ; CODE XREF: CEncoder_GetOptimum+DF0j + add edx, 28h + sub eax, 1 + mov dword ptr [edx], 0FFFFFFFh + jnz short loc_4CEE44 + +loc_4CEE52: ; CODE XREF: CEncoder_GetOptimum+DD0j + xor eax, eax + cmp esi, [ebp+32660h] + mov [esp+90h+var_70], eax + jbe short loc_4CEE70 + +loc_4CEE60: ; CODE XREF: CEncoder_GetOptimum+E0Aj + add eax, 2 + cmp esi, [ebp+eax*4+32660h] + ja short loc_4CEE60 + mov [esp+90h+var_70], eax + +loc_4CEE70: ; CODE XREF: CEncoder_GetOptimum+DFEj + lea ebx, ds:0[eax*4] + mov edx, [ebx+ebp+32664h] + mov ecx, 7FFFFh + sub ecx, edx + sar ecx, 1Fh + and ecx, 0Ch + add ecx, 6 + mov eax, edx + shr eax, cl + mov [esp+90h+var_6C], edx + lea edi, [esi+1] + movzx eax, byte ptr dword_551198[eax] + lea ecx, [eax+ecx*2] + mov eax, [esp+90h+var_54] + imul eax, 110h + add eax, esi + lea eax, [ebp+eax*4+295B8h] + mov [esp+90h+var_3C], ecx + mov ecx, [esp+90h+var_78] + mov [esp+90h+var_54], eax + lea eax, [esi+ecx] + lea eax, [eax+eax*4] + lea ecx, [ebp+eax*8+0FCh] + mov [esp+90h+var_50], ecx + +loc_4CEED3: ; CODE XREF: CEncoder_GetOptimum+1156j + lea eax, [edi-3] + cmp eax, 4 + jb short loc_4CEEE0 + mov eax, 3 + +loc_4CEEE0: ; CODE XREF: CEncoder_GetOptimum+E79j + cmp edx, 80h + jnb short loc_4CEEF6 + shl eax, 7 + add eax, edx + mov eax, [ebp+eax*4+33314h] + jmp short loc_4CEF10 +; --------------------------------------------------------------------------- + +loc_4CEEF6: ; CODE XREF: CEncoder_GetOptimum+E86j + shl eax, 6 + add eax, [esp+90h+var_3C] + mov esi, edx + mov eax, [ebp+eax*4+32F14h] + and esi, 0Fh + add eax, [ebp+esi*4+33B14h] + +loc_4CEF10: ; CODE XREF: CEncoder_GetOptimum+E94j + add eax, [esp+90h+var_40] + mov esi, [esp+90h+var_54] + add eax, [esi] + cmp eax, [ecx] + mov [esp+90h+var_2C], eax + jnb short loc_4CEF35 + mov [ecx], eax + mov eax, [esp+90h+var_78] + add edx, 4 + mov [ecx+4], eax + mov [ecx+8], edx + mov byte ptr [ecx-0Bh], 0 + +loc_4CEF35: ; CODE XREF: CEncoder_GetOptimum+EC0j + lea eax, [edi-1] + cmp eax, [ebx+ebp+32660h] + jnz loc_4CF1A1 + mov ebx, [esp+90h+var_74] + mov eax, [ebp+32EF8h] + mov esi, [esp+90h+var_60] + mov edx, ebx + sub edx, [esp+90h+var_6C] + add eax, edi + sub edx, 1 + cmp esi, eax + mov ecx, edi + jnb short loc_4CEF6C + mov eax, esi + mov [esp+90h+var_44], esi + jmp short loc_4CEF70 +; --------------------------------------------------------------------------- + +loc_4CEF6C: ; CODE XREF: CEncoder_GetOptimum+F02j + mov [esp+90h+var_44], eax + +loc_4CEF70: ; CODE XREF: CEncoder_GetOptimum+F0Aj + cmp edi, eax + jnb short loc_4CEF93 + lea esi, [edi+edx] + sub ebx, edx + lea esp, [esp+0] + +loc_4CEF80: ; CODE XREF: CEncoder_GetOptimum+F31j + mov al, [ebx+esi] + cmp al, [esi] + jnz short loc_4CEF93 + add ecx, 1 + add esi, 1 + cmp ecx, [esp+90h+var_44] + jb short loc_4CEF80 + +loc_4CEF93: ; CODE XREF: CEncoder_GetOptimum+F12j + ; CEncoder_GetOptimum+F25j + or esi, 0FFFFFFFFh + lea eax, [edi-1] + sub esi, eax + add ecx, esi + cmp ecx, 2 + mov [esp+90h+var_48], ecx + jb loc_4CF157 + mov ecx, [esp+90h+var_68] + mov bl, ds:kMatchNextStates[ecx] + mov ecx, [ebp+33B60h] + mov eax, [esp+90h+arg_0] + lea esi, [edi+eax-1] + mov eax, ecx + and eax, esi + movzx esi, bl + movzx edx, byte ptr [edi+edx-1] + mov ebx, esi + shl ebx, 4 + add ebx, eax + mov ebx, [ebp+ebx*4+280F0h] + shr ebx, 2 + mov ebx, dword_550998[ebx*4] + mov [esp+90h+var_28], ebx + mov bl, ds:kLiteralNextStates[esi] + lea esi, [eax+1] + mov eax, [ebp+32654h] + and esi, ecx + movzx ebx, bl + mov ecx, ebx + shl ecx, 4 + add ecx, esi + mov [esp+90h+var_44], ecx + mov ecx, [esp+90h+var_74] + movzx ecx, byte ptr [ecx+edi-1] + push ecx + mov ecx, [esp+94h+var_74] + push edx + movzx edx, byte ptr [edi+ecx-2] + mov ecx, 8 + sub cl, al + shr edx, cl + mov ecx, [esp+98h+arg_0] + lea eax, [edi+ecx-1] + mov ecx, [ebp+3265Ch] + and ecx, eax + mov eax, ecx + mov ecx, [ebp+32654h] + shl eax, cl + push 1 + add edx, eax + imul edx, 0C00h + add edx, [ebp+32650h] + mov ecx, edx + call sub_4CDAC0 + mov edx, 800h + sub edx, [ebp+ebx*4+283F0h] + mov ecx, 800h + shr edx, 2 + add eax, dword_550998[edx*4] + mov edx, [esp+90h+var_44] + sub ecx, [ebp+edx*4+280F0h] + mov edx, [esp+90h+var_78] + shr ecx, 2 + add eax, dword_550998[ecx*4] + mov ecx, [esp+90h+var_48] + add eax, [esp+90h+var_28] + add ecx, edx + add eax, [esp+90h+var_2C] + add ecx, edi + cmp [esp+90h+var_7C], ecx + mov [esp+90h+var_28], ecx + jnb short loc_4CF0DE + mov edx, [esp+90h+var_7C] + lea edx, [edx+edx*4] + lea edx, [ebp+edx*8+0FCh] + mov [esp+90h+var_24], edx + mov edx, [esp+90h+var_7C] + sub ecx, edx + add edx, ecx + mov [esp+90h+var_7C], edx + mov edx, [esp+90h+var_24] + lea ecx, [ecx+0] + +loc_4CF0D0: ; CODE XREF: CEncoder_GetOptimum+107Cj + add edx, 28h + sub ecx, 1 + mov dword ptr [edx], 0FFFFFFFh + jnz short loc_4CF0D0 + +loc_4CF0DE: ; CODE XREF: CEncoder_GetOptimum+1049j + mov edx, [esp+90h+var_44] + imul esi, 110h + add esi, [esp+90h+var_48] + mov ecx, 800h + sub ecx, [ebp+edx*4+284B0h] + mov edx, [ebp+ebx*4+28420h] + shr ecx, 2 + mov ecx, dword_550998[ecx*4] + shr edx, 2 + add ecx, dword_550998[edx*4] + add ecx, [ebp+esi*4+2E204h] + add ecx, eax + mov eax, [esp+90h+var_28] + lea eax, [eax+eax*4+1Eh] + cmp ecx, [ebp+eax*8+0Ch] + lea eax, [ebp+eax*8+0] + jnb short loc_4CF157 + mov [eax+0Ch], ecx + mov ecx, [esp+90h+var_78] + lea edx, [ecx+edi] + mov [eax+4], ecx + mov ecx, [esp+90h+var_6C] + add ecx, 4 + mov [eax+10h], edx + mov dword ptr [eax+14h], 0 + mov byte ptr [eax+1], 1 + mov byte ptr [eax+2], 1 + mov [eax+8], ecx + +loc_4CF157: ; CODE XREF: CEncoder_GetOptimum+F44j + ; CEncoder_GetOptimum+10CCj + mov eax, [esp+90h+var_70] + add eax, 2 + cmp eax, [esp+90h+var_4C] + mov [esp+90h+var_70], eax + jz short loc_4CF1BB + lea ebx, ds:0[eax*4] + mov eax, [ebx+ebp+32664h] + cmp eax, 80h + mov [esp+90h+var_6C], eax + jb short loc_4CF1A1 + mov ecx, 7FFFFh + sub ecx, eax + sar ecx, 1Fh + and ecx, 0Ch + add ecx, 6 + shr eax, cl + movzx edx, byte ptr dword_551198[eax] + lea eax, [edx+ecx*2] + mov [esp+90h+var_3C], eax + +loc_4CF1A1: ; CODE XREF: CEncoder_GetOptimum+EDFj + ; CEncoder_GetOptimum+111Fj + add [esp+90h+var_50], 28h + add [esp+90h+var_54], 4 + mov ecx, [esp+90h+var_50] + mov edx, [esp+90h+var_6C] + add edi, 1 + jmp loc_4CEED3 +; --------------------------------------------------------------------------- + +loc_4CF1BB: ; CODE XREF: CEncoder_GetOptimum+8A9j + ; CEncoder_GetOptimum+DA1j ... + mov eax, [esp+90h+var_78] + add eax, 1 + cmp eax, [esp+90h+var_7C] + mov [esp+90h+var_78], eax + jnz loc_4CE5D1 + +loc_4CF1D0: ; CODE XREF: CEncoder_GetOptimum+567j + mov ecx, [esp+90h+var_78] + push ecx + jmp short loc_4CF1EF +; --------------------------------------------------------------------------- + +loc_4CF1D7: ; CODE XREF: CEncoder_GetOptimum+59Ej + mov ecx, [esp+90h+var_4C] + mov [ebp+32F00h], ecx + mov [ebp+32EFCh], eax + mov byte ptr [ebp+32F10h], 1 + push esi + +loc_4CF1EF: ; CODE XREF: CEncoder_GetOptimum+1175j + mov edx, [esp+94h+arg_4] + push edx + mov ecx, ebp + call sub_4CB2E0 + pop edi + pop ebx + pop esi + pop ebp + add esp, 80h + retn 8 +CEncoder_GetOptimum endp + +; --------------------------------------------------------------------------- + align 10h + +loc_4CF210: ; DATA XREF: CEncoder_CodeOneBlock+44o + mov edx, [esp+10h] + mov eax, [esp+4] + mov eax, [eax+4] + mov ecx, [eax] + push edx + mov edx, [esp+10h] + push edx + mov edx, [esp+10h] + push edx + push eax + mov eax, [ecx+0Ch] + call eax + retn +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +CEncoder_FillDistancesPrices proc near ; CODE XREF: CEncoder_SetStreams+4Fp + ; CEncoder_CodeOneBlock+751p + +var_20C = dword ptr -20Ch +var_208 = dword ptr -208h +var_204 = dword ptr -204h +var_200 = dword ptr -200h + + sub esp, 20Ch + push ebx + push ebp + push esi + push edi + mov ebx, ecx + mov esi, 4 + +loc_4CF241: ; CODE XREF: CEncoder_FillDistancesPrices+80j + cmp esi, 2000h + jnb short loc_4CF252 + movzx edx, byte ptr dword_551198[esi] + jmp short loc_4CF27A +; --------------------------------------------------------------------------- + +loc_4CF252: ; CODE XREF: CEncoder_FillDistancesPrices+17j + cmp esi, 2000000h + jnb short loc_4CF26B + mov eax, esi + shr eax, 0Ch + movzx edx, byte ptr dword_551198[eax] + add edx, 18h + jmp short loc_4CF27A +; --------------------------------------------------------------------------- + +loc_4CF26B: ; CODE XREF: CEncoder_FillDistancesPrices+28j + mov ecx, esi + shr ecx, 18h + movzx edx, byte ptr dword_551198[ecx] + add edx, 30h + +loc_4CF27A: ; CODE XREF: CEncoder_FillDistancesPrices+20j + ; CEncoder_FillDistancesPrices+39j + mov ecx, edx + mov eax, edx + and eax, 1 + shr ecx, 1 + sub ecx, 1 + or eax, 2 + shl eax, cl + mov edi, esi + sub edi, eax + push edi + sub eax, edx + push ecx + lea edx, [ebx+eax*4+28BACh] + push edx + call sub_4CD860 + mov [esp+esi*4+228h+var_200], eax + add esi, 1 + add esp, 0Ch + cmp esi, 80h + jb short loc_4CF241 + lea ebp, [esp+21Ch+var_200] + sub ebp, ebx + lea esi, [ebx+3331Ch] + sub ebp, 33314h + lea edx, [ebx+32F14h] + mov [esp+21Ch+var_20C], esi + mov [esp+21Ch+var_208], ebp + mov [esp+21Ch+var_204], 4 + jmp short loc_4CF2E4 +; --------------------------------------------------------------------------- + align 10h + +loc_4CF2E0: ; CODE XREF: CEncoder_FillDistancesPrices+1BDj + mov esi, [esp+21Ch+var_20C] + +loc_4CF2E4: ; CODE XREF: CEncoder_FillDistancesPrices+AAj + xor edi, edi + cmp [ebx+33B58h], edi + jbe short loc_4CF33F + mov edi, edi + +loc_4CF2F0: ; CODE XREF: CEncoder_FillDistancesPrices+109j + mov ecx, edi + or ecx, 40h + xor esi, esi + cmp ecx, 1 + jz short loc_4CF32D + lea esp, [esp+0] + +loc_4CF300: ; CODE XREF: CEncoder_FillDistancesPrices+F7j + mov eax, ecx + shr ecx, 1 + mov ebp, [edx+ecx*4-0A764h] + and eax, 1 + sub ebp, eax + neg eax + xor ebp, eax + shr ebp, 2 + and ebp, 1FFh + add esi, dword_550998[ebp*4] + cmp ecx, 1 + jnz short loc_4CF300 + mov ebp, [esp+21Ch+var_208] + +loc_4CF32D: ; CODE XREF: CEncoder_FillDistancesPrices+CAj + mov [edx+edi*4], esi + add edi, 1 + cmp edi, [ebx+33B58h] + jb short loc_4CF2F0 + mov esi, [esp+21Ch+var_20C] + +loc_4CF33F: ; CODE XREF: CEncoder_FillDistancesPrices+BCj + mov eax, 0Eh + cmp [ebx+33B58h], eax + jbe short loc_4CF368 + lea esp, [esp+0] + +loc_4CF350: ; CODE XREF: CEncoder_FillDistancesPrices+136j + mov ecx, eax + shr ecx, 1 + sub ecx, 5 + shl ecx, 6 + add [edx+eax*4], ecx + add eax, 1 + cmp eax, [ebx+33B58h] + jb short loc_4CF350 + +loc_4CF368: ; CODE XREF: CEncoder_FillDistancesPrices+11Aj + mov eax, [edx] + mov [esi-8], eax + mov ecx, [edx+4] + mov [esi-4], ecx + mov eax, [edx+8] + mov [esi], eax + mov ecx, [edx+0Ch] + mov [esi+4], ecx + mov eax, 4 + add esi, 8 + +loc_4CF386: ; CODE XREF: CEncoder_FillDistancesPrices+19Ej + cmp eax, 2000h + jnb short loc_4CF396 + movzx ecx, byte ptr dword_551198[eax] + jmp short loc_4CF3BB +; --------------------------------------------------------------------------- + +loc_4CF396: ; CODE XREF: CEncoder_FillDistancesPrices+15Bj + cmp eax, 2000000h + mov ecx, eax + jnb short loc_4CF3AE + shr ecx, 0Ch + movzx ecx, byte ptr dword_551198[ecx] + add ecx, 18h + jmp short loc_4CF3BB +; --------------------------------------------------------------------------- + +loc_4CF3AE: ; CODE XREF: CEncoder_FillDistancesPrices+16Dj + shr ecx, 18h + movzx ecx, byte ptr dword_551198[ecx] + add ecx, 30h + +loc_4CF3BB: ; CODE XREF: CEncoder_FillDistancesPrices+164j + ; CEncoder_FillDistancesPrices+17Cj + mov ecx, [edx+ecx*4] + add ecx, [esi+ebp] + add eax, 1 + mov [esi], ecx + add esi, 4 + cmp eax, 80h + jb short loc_4CF386 + add [esp+21Ch+var_20C], 200h + sub ebp, 200h + add edx, 100h + sub [esp+21Ch+var_204], 1 + mov [esp+21Ch+var_208], ebp + jnz loc_4CF2E0 + pop edi + pop esi + pop ebp + mov dword ptr [ebx+33B70h], 0 + pop ebx + add esp, 20Ch + retn +CEncoder_FillDistancesPrices endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +CEncoder_FillAlignPrices proc near ; CODE XREF: CEncoder_SetStreams+56p + ; CEncoder_CodeOneBlock+761p + push ebx + push ebp + push esi + mov ebp, ecx + push edi + xor esi, esi + lea ebx, [ebp+28D78h] + lea edi, [ebp+33B14h] + +loc_4CF424: ; CODE XREF: CEncoder_FillAlignPrices+27j + push esi + mov ecx, ebx + call sub_4CD810 + mov [edi], eax + add esi, 1 + add edi, 4 + cmp esi, 10h + jb short loc_4CF424 + pop edi + pop esi + mov dword ptr [ebp+33B54h], 0 + pop ebp + pop ebx + retn +CEncoder_FillAlignPrices endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CF810 proc near ; CODE XREF: sub_4D0250+3p + +var_10 = dword ptr -10h +var_C = dword ptr -0Ch +var_4 = dword ptr -4 + + push 0FFFFFFFFh + push offset loc_4DA0C9 + mov eax, dword ptr fs:[0] + push eax + push ecx + push ebx + push esi + mov eax, dword_544960 + xor eax, esp + push eax + lea eax, [esp+1Ch+var_C] + mov dword ptr fs:[0], eax + mov esi, ecx + mov [esp+1Ch+var_10], esi + mov dword ptr [esi], offset NCompress_NLZMA_CEncoder_vftable + mov dword ptr [esi+4], offset NCompress_NLZMA_CEncoder_vftable_ICompressSetOutStream + mov dword ptr [esi+8], offset NCompress_NLZMA_CEncoder_vftable_ICompressSetCoderProperties + mov dword ptr [esi+0Ch], offset NCompress_NLZMA_CEncoder_vftable_ICompressWriteCoderProperties + mov eax, [esi+0A4h] + push eax ; lpAddress + mov [esp+20h+var_4], 1 + call off_546E24 + xor ebx, ebx + add esp, 4 + cmp [esi+0D0h], ebx + mov [esi+0A4h], ebx + jnz short loc_4CF892 + mov ecx, [esi+0B4h] + push ecx ; lpAddress + call off_546E24 + add esp, 4 + mov [esi+0B4h], ebx + +loc_4CF892: ; CODE XREF: sub_4CF810+6Aj + mov eax, [esi+33B8Ch] + cmp eax, ebx + jz short loc_4CF8A4 + mov edx, [eax] + push eax + mov eax, [edx+8] + call eax + +loc_4CF8A4: ; CODE XREF: sub_4CF810+8Aj + lea ecx, [esi+32650h] + mov byte ptr [esp+1Ch+var_4], bl + call sub_4CD8F0 + mov eax, [esi+40h] + cmp eax, ebx + mov [esp+1Ch+var_4], 0FFFFFFFFh + jz short loc_4CF8CF + push 8000h ; dwFreeType + push ebx ; dwSize + push eax ; lpAddress + call ds:VirtualFree + +loc_4CF8CF: ; CODE XREF: sub_4CF810+B0j + mov [esi+40h], ebx + mov esi, [esi+54h] + cmp esi, ebx + jz short loc_4CF8E1 + mov ecx, [esi] + mov edx, [ecx+8] + push esi + call edx + +loc_4CF8E1: ; CODE XREF: sub_4CF810+C7j + mov ecx, [esp+1Ch+var_C] + mov dword ptr fs:[0], ecx + pop ecx + pop esi + pop ebx + add esp, 10h + retn +sub_4CF810 endp + +; =============== S U B R O U T I N E ======================================= + +; int __stdcall sub_4CF900(int, void *Buf1, int) +sub_4CF900 proc near ; CODE XREF: sub_4CFA20+5j + ; ICompressSetCoderProperties_QueryInterface+5j ... + +arg_0 = dword ptr 4 +Buf1 = dword ptr 8 +arg_8 = dword ptr 0Ch + + push esi + mov esi, [esp+4+Buf1] + push offset dword_512730 ; Buf2 + push esi ; Buf1 + call unknown_libname_324 ; MFC 3.1/4.0/4.2/8.0 32bit + add esp, 8 + test eax, eax + jz short loc_4CF94C + +loc_4CF917: ; CODE XREF: sub_4CF900+5Cj + mov eax, [esp+4+arg_0] + test eax, eax + jz short loc_4CF936 + mov edx, [esp+4+arg_8] + lea ecx, [eax+4] + mov [edx], ecx + mov ecx, [eax] + mov edx, [ecx+4] + push eax + call edx + xor eax, eax + pop esi + retn 0Ch +; --------------------------------------------------------------------------- + +loc_4CF936: ; CODE XREF: sub_4CF900+1Dj + ; sub_4CF900+76j ... + mov edx, [esp+4+arg_8] + xor ecx, ecx + mov [edx], ecx + mov ecx, [eax] + mov edx, [ecx+4] + push eax + call edx + xor eax, eax + pop esi + retn 0Ch +; --------------------------------------------------------------------------- + +loc_4CF94C: ; CODE XREF: sub_4CF900+15j + push offset dword_5535A0 ; Buf2 + push esi ; Buf1 + call unknown_libname_324 ; MFC 3.1/4.0/4.2/8.0 32bit + add esp, 8 + test eax, eax + jnz short loc_4CF917 + push offset dword_5535B0 ; Buf2 + push esi ; Buf1 + call unknown_libname_324 ; MFC 3.1/4.0/4.2/8.0 32bit + add esp, 8 + test eax, eax + jz short loc_4CF98F + mov eax, [esp+4+arg_0] + test eax, eax + jz short loc_4CF936 + mov edx, [esp+4+arg_8] + lea ecx, [eax+8] + mov [edx], ecx + mov ecx, [eax] + mov edx, [ecx+4] + push eax + call edx + xor eax, eax + pop esi + retn 0Ch +; --------------------------------------------------------------------------- + +loc_4CF98F: ; CODE XREF: sub_4CF900+6Ej + push offset dword_5535C0 ; Buf2 + push esi ; Buf1 + call unknown_libname_324 ; MFC 3.1/4.0/4.2/8.0 32bit + add esp, 8 + test eax, eax + jz short loc_4CF9C0 + mov eax, [esp+4+arg_0] + test eax, eax + jz short loc_4CF936 + mov edx, [esp+4+arg_8] + lea ecx, [eax+0Ch] + mov [edx], ecx + mov ecx, [eax] + mov edx, [ecx+4] + push eax + call edx + xor eax, eax + pop esi + retn 0Ch +; --------------------------------------------------------------------------- + +loc_4CF9C0: ; CODE XREF: sub_4CF900+9Fj + mov eax, 80004002h + pop esi + retn 0Ch +sub_4CF900 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + + +sub_4CF9D0 proc near ; CODE XREF: ICompressSetCoderProperties_AddRef+5j + ; sub_4CFA10+5j ... + +arg_0 = dword ptr 4 + + mov eax, [esp+arg_0] + add dword ptr [eax+24h], 1 + mov eax, [eax+24h] + retn 4 +sub_4CF9D0 endp + +; --------------------------------------------------------------------------- + align 10h + +; =============== S U B R O U T I N E ======================================= + + +sub_4CF9E0 proc near ; CODE XREF: sub_4CFA40+5j + ; ICompressSetCoderProperties_Release+5j ... + +arg_0 = dword ptr 4 + + mov ecx, [esp+arg_0] + add dword ptr [ecx+24h], 0FFFFFFFFh + mov eax, [ecx+24h] + jnz short locret_4CF9F8 + mov eax, [ecx] + mov edx, [eax+10h] + push 1 + call edx + xor eax, eax + +locret_4CF9F8: ; CODE XREF: sub_4CF9E0+Bj + retn 4 +sub_4CF9E0 endp + +; --------------------------------------------------------------------------- + align 10h + +; =============== S U B R O U T I N E ======================================= + + +ICompressSetCoderProperties_AddRef proc near ; DATA XREF: .rdata:00517AD4o + +arg_0 = dword ptr 4 + + sub [esp+arg_0], 8 + jmp sub_4CF9D0 +ICompressSetCoderProperties_AddRef endp + +; --------------------------------------------------------------------------- + align 10h + +; =============== S U B R O U T I N E ======================================= + + +sub_4CFA10 proc near ; DATA XREF: .rdata:00517AC0o + +arg_0 = dword ptr 4 + + sub [esp+arg_0], 0Ch + jmp sub_4CF9D0 +sub_4CFA10 endp + +; --------------------------------------------------------------------------- + align 10h + +; =============== S U B R O U T I N E ======================================= + + +sub_4CFA20 proc near ; DATA XREF: .rdata:NCompress_NLZMA_CEncoder_vftable_ICompressSetOutStreamo + +arg_0 = dword ptr 4 + + sub [esp+arg_0], 4 + jmp sub_4CF900 +sub_4CFA20 endp + +; --------------------------------------------------------------------------- + align 10h + +; =============== S U B R O U T I N E ======================================= + + +ICompressSetCoderProperties_QueryInterface proc near ; DATA XREF: .rdata:NCompress_NLZMA_CEncoder_vftable_ICompressSetCoderPropertieso + +arg_0 = dword ptr 4 + + sub [esp+arg_0], 8 + jmp sub_4CF900 +ICompressSetCoderProperties_QueryInterface endp + +; --------------------------------------------------------------------------- + align 10h + +; =============== S U B R O U T I N E ======================================= + + +sub_4CFA40 proc near ; DATA XREF: .rdata:00517AECo + +arg_0 = dword ptr 4 + + sub [esp+arg_0], 4 + jmp sub_4CF9E0 +sub_4CFA40 endp + +; --------------------------------------------------------------------------- + align 10h + +; =============== S U B R O U T I N E ======================================= + + +sub_4CFA50 proc near ; DATA XREF: .rdata:NCompress_NLZMA_CEncoder_vftable_ICompressWriteCoderPropertieso + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 +arg_8 = dword ptr 0Ch + + sub [esp+arg_0], 0Ch + jmp sub_4CF900 +sub_4CFA50 endp + +; --------------------------------------------------------------------------- + align 10h + +; =============== S U B R O U T I N E ======================================= + + +ICompressSetCoderProperties_Release proc near ; DATA XREF: .rdata:00517AD8o + +arg_0 = dword ptr 4 + + sub [esp+arg_0], 8 + jmp sub_4CF9E0 +ICompressSetCoderProperties_Release endp + +; --------------------------------------------------------------------------- + align 10h + +; =============== S U B R O U T I N E ======================================= + + +sub_4CFA70 proc near ; DATA XREF: .rdata:00517AC4o + +arg_0 = dword ptr 4 + + sub [esp+arg_0], 0Ch + jmp sub_4CF9E0 +sub_4CFA70 endp + +; --------------------------------------------------------------------------- + align 10h + +; =============== S U B R O U T I N E ======================================= + + +sub_4CFA80 proc near ; DATA XREF: .rdata:00517AE8o + +arg_0 = dword ptr 4 + + sub [esp+arg_0], 4 + jmp sub_4CF9D0 +sub_4CFA80 endp + +; --------------------------------------------------------------------------- + align 10h + +; =============== S U B R O U T I N E ======================================= + + +sub_4CFA90 proc near ; DATA XREF: .rdata:00517AF0o + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 + + push esi + mov esi, [esp+4+arg_4] + test esi, esi + push edi + mov edi, [esp+8+arg_0] + jz short loc_4CFAA6 + mov eax, [esi] + mov ecx, [eax+4] + push esi + call ecx + +loc_4CFAA6: ; CODE XREF: sub_4CFA90+Cj + mov eax, [edi+50h] + test eax, eax + jz short loc_4CFAB5 + mov edx, [eax] + push eax + mov eax, [edx+8] + call eax + +loc_4CFAB5: ; CODE XREF: sub_4CFA90+1Bj + mov [edi+50h], esi + pop edi + xor eax, eax + pop esi + retn 8 +sub_4CFA90 endp + +; =============== S U B R O U T I N E ======================================= + +sub_4CFAC0 proc near ; CODE XREF: CEncoder_CodeOneBlock+42Ap + ; CEncoder_CodeOneBlock+517p + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 + + mov eax, [esp+arg_0] + push esi + mov esi, [eax+10h] + mov edx, esi + shr edx, 0Bh + imul edx, [ecx] + cmp [esp+4+arg_4], 0 + jnz short loc_4CFAEC + mov [eax+10h], edx + mov edx, [ecx] + mov esi, 800h + sub esi, edx + shr esi, 5 + add esi, edx + mov [ecx], esi + jmp short loc_4CFB03 +; --------------------------------------------------------------------------- + +loc_4CFAEC: ; CODE XREF: sub_4CFAC0+15j + add [eax+8], edx + adc dword ptr [eax+0Ch], 0 + sub esi, edx + mov [eax+10h], esi + mov edx, [ecx] + mov esi, edx + shr esi, 5 + sub edx, esi + mov [ecx], edx + +loc_4CFB03: ; CODE XREF: sub_4CFAC0+2Aj + mov ecx, [eax+10h] + cmp ecx, 1000000h + pop esi + jnb short locret_4CFB1C + shl ecx, 8 + mov [eax+10h], ecx + mov ecx, eax + call loc_4CF640 + +locret_4CFB1C: ; CODE XREF: sub_4CFAC0+4Dj + retn 8 +sub_4CFAC0 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + + +sub_4CFB20 proc near ; CODE XREF: sub_4D0020+52p + ; sub_4D0020+E4p + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 + + push ebx + push ebp + push esi + mov esi, [esp+0Ch+arg_0] + push edi + mov ebp, ecx + mov ebx, 1 + mov edx, 3 + +loc_4CFB34: ; CODE XREF: sub_4CFB20+8Cj + mov edi, [esp+10h+arg_4] + sub edx, 1 + mov ecx, edx + shr edi, cl + mov ecx, [esi+10h] + mov eax, ecx + shr eax, 0Bh + imul eax, [ebp+ebx*4+0] + and edi, 1 + test edi, edi + mov [esp+10h+arg_0], edx + jnz short loc_4CFB70 + mov [esi+10h], eax + mov eax, [ebp+ebx*4+0] + mov ecx, 800h + sub ecx, eax + shr ecx, 5 + add ecx, eax + mov [ebp+ebx*4+0], ecx + jmp short loc_4CFB8B +; --------------------------------------------------------------------------- + +loc_4CFB70: ; CODE XREF: sub_4CFB20+35j + add [esi+8], eax + adc dword ptr [esi+0Ch], 0 + sub ecx, eax + mov [esi+10h], ecx + mov eax, [ebp+ebx*4+0] + mov ecx, eax + shr ecx, 5 + sub eax, ecx + mov [ebp+ebx*4+0], eax + +loc_4CFB8B: ; CODE XREF: sub_4CFB20+4Ej + mov eax, [esi+10h] + cmp eax, 1000000h + jnb short loc_4CFBA6 + shl eax, 8 + mov ecx, esi + mov [esi+10h], eax + call loc_4CF640 + mov edx, [esp+10h+arg_0] + +loc_4CFBA6: ; CODE XREF: sub_4CFB20+73j + add ebx, ebx + or ebx, edi + test edx, edx + jnz short loc_4CFB34 + pop edi + pop esi + pop ebp + pop ebx + retn 8 +sub_4CFB20 endp + +; --------------------------------------------------------------------------- + align 10h + +; =============== S U B R O U T I N E ======================================= + + +sub_4CFBC0 proc near ; CODE XREF: sub_4D0020+136p + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 + + push ebx + push ebp + push esi + mov esi, [esp+0Ch+arg_0] + push edi + mov ebp, ecx + mov ebx, 1 + mov edx, 8 + +loc_4CFBD4: ; CODE XREF: sub_4CFBC0+8Cj + mov edi, [esp+10h+arg_4] + sub edx, 1 + mov ecx, edx + shr edi, cl + mov ecx, [esi+10h] + mov eax, ecx + shr eax, 0Bh + imul eax, [ebp+ebx*4+0] + and edi, 1 + test edi, edi + mov [esp+10h+arg_0], edx + jnz short loc_4CFC10 + mov [esi+10h], eax + mov eax, [ebp+ebx*4+0] + mov ecx, 800h + sub ecx, eax + shr ecx, 5 + add ecx, eax + mov [ebp+ebx*4+0], ecx + jmp short loc_4CFC2B +; --------------------------------------------------------------------------- + +loc_4CFC10: ; CODE XREF: sub_4CFBC0+35j + add [esi+8], eax + adc dword ptr [esi+0Ch], 0 + sub ecx, eax + mov [esi+10h], ecx + mov eax, [ebp+ebx*4+0] + mov ecx, eax + shr ecx, 5 + sub eax, ecx + mov [ebp+ebx*4+0], eax + +loc_4CFC2B: ; CODE XREF: sub_4CFBC0+4Ej + mov eax, [esi+10h] + cmp eax, 1000000h + jnb short loc_4CFC46 + shl eax, 8 + mov ecx, esi + mov [esi+10h], eax + call loc_4CF640 + mov edx, [esp+10h+arg_0] + +loc_4CFC46: ; CODE XREF: sub_4CFBC0+73j + add ebx, ebx + or ebx, edi + test edx, edx + jnz short loc_4CFBD4 + pop edi + pop esi + pop ebp + pop ebx + retn 8 +sub_4CFBC0 endp + +; --------------------------------------------------------------------------- + align 10h + +; =============== S U B R O U T I N E ======================================= + + +sub_4CFC60 proc near ; CODE XREF: sub_4D0770+EDp + ; CEncoder_CodeOneBlock+67Cp + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 + + push ebx + push ebp + push esi + mov esi, [esp+0Ch+arg_0] + push edi + mov ebp, ecx + mov ebx, 1 + mov edx, 6 + +loc_4CFC74: ; CODE XREF: sub_4CFC60+8Cj + mov edi, [esp+10h+arg_4] + sub edx, 1 + mov ecx, edx + shr edi, cl + mov ecx, [esi+10h] + mov eax, ecx + shr eax, 0Bh + imul eax, [ebp+ebx*4+0] + and edi, 1 + test edi, edi + mov [esp+10h+arg_0], edx + jnz short loc_4CFCB0 + mov [esi+10h], eax + mov eax, [ebp+ebx*4+0] + mov ecx, 800h + sub ecx, eax + shr ecx, 5 + add ecx, eax + mov [ebp+ebx*4+0], ecx + jmp short loc_4CFCCB +; --------------------------------------------------------------------------- + +loc_4CFCB0: ; CODE XREF: sub_4CFC60+35j + add [esi+8], eax + adc dword ptr [esi+0Ch], 0 + sub ecx, eax + mov [esi+10h], ecx + mov eax, [ebp+ebx*4+0] + mov ecx, eax + shr ecx, 5 + sub eax, ecx + mov [ebp+ebx*4+0], eax + +loc_4CFCCB: ; CODE XREF: sub_4CFC60+4Ej + mov eax, [esi+10h] + cmp eax, 1000000h + jnb short loc_4CFCE6 + shl eax, 8 + mov ecx, esi + mov [esi+10h], eax + call loc_4CF640 + mov edx, [esp+10h+arg_0] + +loc_4CFCE6: ; CODE XREF: sub_4CFC60+73j + add ebx, ebx + or ebx, edi + test edx, edx + jnz short loc_4CFC74 + pop edi + pop esi + pop ebp + pop ebx + retn 8 +sub_4CFC60 endp + +; --------------------------------------------------------------------------- + align 10h + +; =============== S U B R O U T I N E ======================================= + + +sub_4CFD00 proc near ; CODE XREF: sub_4D0770+109p + ; CEncoder_CodeOneBlock+6D5p + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 + + push ebx + push ebp + push esi + mov esi, [esp+0Ch+arg_0] + push edi + mov ebp, ecx + mov edi, 1 + mov [esp+10h+arg_0], 4 + +loc_4CFD17: ; CODE XREF: sub_4CFD00+87j + mov ecx, [esi+10h] + mov ebx, [esp+10h+arg_4] + mov eax, ecx + shr eax, 0Bh + imul eax, [ebp+edi*4+0] + and ebx, 1 + test ebx, ebx + jnz short loc_4CFD48 + mov [esi+10h], eax + mov eax, [ebp+edi*4+0] + mov ecx, 800h + sub ecx, eax + shr ecx, 5 + add ecx, eax + mov [ebp+edi*4+0], ecx + jmp short loc_4CFD63 +; --------------------------------------------------------------------------- + +loc_4CFD48: ; CODE XREF: sub_4CFD00+2Dj + add [esi+8], eax + adc dword ptr [esi+0Ch], 0 + sub ecx, eax + mov [esi+10h], ecx + mov eax, [ebp+edi*4+0] + mov edx, eax + shr edx, 5 + sub eax, edx + mov [ebp+edi*4+0], eax + +loc_4CFD63: ; CODE XREF: sub_4CFD00+46j + mov eax, [esi+10h] + cmp eax, 1000000h + jnb short loc_4CFD7A + shl eax, 8 + mov ecx, esi + mov [esi+10h], eax + call loc_4CF640 + +loc_4CFD7A: ; CODE XREF: sub_4CFD00+6Bj + shr [esp+10h+arg_4], 1 + add edi, edi + or edi, ebx + sub [esp+10h+arg_0], 1 + jnz short loc_4CFD17 + pop edi + pop esi + pop ebp + pop ebx + retn 8 +sub_4CFD00 endp + + +; =============== S U B R O U T I N E ======================================= + + +sub_4CFD90 proc near ; CODE XREF: CEncoder_CodeOneBlock+6AFp + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 +arg_8 = dword ptr 0Ch +arg_C = dword ptr 10h + + mov eax, [esp+arg_8] + test eax, eax + push edi + mov edi, 1 + jle loc_4CFE26 + push ebx + push ebp + mov ebp, [esp+0Ch+arg_0] + push esi + mov esi, [esp+10h+arg_4] + mov [esp+10h+arg_8], eax + +loc_4CFDB1: ; CODE XREF: sub_4CFD90+91j + mov ecx, [esi+10h] + mov ebx, [esp+10h+arg_C] + mov eax, ecx + shr eax, 0Bh + imul eax, [ebp+edi*4+0] + and ebx, 1 + test ebx, ebx + jnz short loc_4CFDE2 + mov [esi+10h], eax + mov eax, [ebp+edi*4+0] + mov ecx, 800h + sub ecx, eax + shr ecx, 5 + add ecx, eax + mov [ebp+edi*4+0], ecx + jmp short loc_4CFDFD +; --------------------------------------------------------------------------- + +loc_4CFDE2: ; CODE XREF: sub_4CFD90+37j + add [esi+8], eax + adc dword ptr [esi+0Ch], 0 + sub ecx, eax + mov [esi+10h], ecx + mov eax, [ebp+edi*4+0] + mov edx, eax + shr edx, 5 + sub eax, edx + mov [ebp+edi*4+0], eax + +loc_4CFDFD: ; CODE XREF: sub_4CFD90+50j + mov eax, [esi+10h] + cmp eax, 1000000h + jnb short loc_4CFE14 + shl eax, 8 + mov ecx, esi + mov [esi+10h], eax + call loc_4CF640 + +loc_4CFE14: ; CODE XREF: sub_4CFD90+75j + shr [esp+10h+arg_C], 1 + add edi, edi + or edi, ebx + sub [esp+10h+arg_8], 1 + jnz short loc_4CFDB1 + pop esi + pop ebp + pop ebx + +loc_4CFE26: ; CODE XREF: sub_4CFD90+Cj + pop edi + retn +sub_4CFD90 endp + +; --------------------------------------------------------------------------- + align 10h + +; =============== S U B R O U T I N E ======================================= + + +sub_4CFE30 proc near ; CODE XREF: CEncoder_CodeOneBlock+190p + ; CEncoder_CodeOneBlock+2CCp + +arg_0 = dword ptr 4 +arg_4 = byte ptr 8 + + push ebx + push ebp + push esi + mov esi, [esp+0Ch+arg_0] + push edi + mov ebx, ecx + mov ebp, 1 + mov edx, 8 + +loc_4CFE44: ; CODE XREF: sub_4CFE30+88j + movzx edi, [esp+10h+arg_4] + sub edx, 1 + mov cl, dl + shr edi, cl + mov ecx, [esi+10h] + mov eax, ecx + shr eax, 0Bh + imul eax, [ebx+ebp*4] + and edi, 1 + test edi, edi + mov [esp+10h+arg_0], edx + jnz short loc_4CFE7E + mov [esi+10h], eax + mov eax, [ebx+ebp*4] + mov ecx, 800h + sub ecx, eax + shr ecx, 5 + add ecx, eax + mov [ebx+ebp*4], ecx + jmp short loc_4CFE97 +; --------------------------------------------------------------------------- + +loc_4CFE7E: ; CODE XREF: sub_4CFE30+35j + add [esi+8], eax + adc dword ptr [esi+0Ch], 0 + sub ecx, eax + mov [esi+10h], ecx + mov eax, [ebx+ebp*4] + mov ecx, eax + shr ecx, 5 + sub eax, ecx + mov [ebx+ebp*4], eax + +loc_4CFE97: ; CODE XREF: sub_4CFE30+4Cj + mov eax, [esi+10h] + cmp eax, 1000000h + jnb short loc_4CFEB2 + shl eax, 8 + mov ecx, esi + mov [esi+10h], eax + call loc_4CF640 + mov edx, [esp+10h+arg_0] + +loc_4CFEB2: ; CODE XREF: sub_4CFE30+6Fj + add ebp, ebp + or ebp, edi + test edx, edx + jnz short loc_4CFE44 + pop edi + pop esi + pop ebp + pop ebx + retn 8 +sub_4CFE30 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4CFED0 proc near ; CODE XREF: CEncoder_CodeOneBlock+300p + +var_4 = dword ptr -4 +arg_0 = dword ptr 4 +arg_4 = byte ptr 8 +arg_8 = byte ptr 0Ch + + push ecx + push ebx + push ebp + push esi + mov esi, [esp+10h+arg_0] + push edi + mov [esp+14h+var_4], ecx + mov ebx, 1 + mov edx, 8 + jmp short loc_4CFEF0 +; --------------------------------------------------------------------------- + align 10h + +loc_4CFEF0: ; CODE XREF: sub_4CFED0+17j + ; sub_4CFED0+ADj + movzx ebp, [esp+14h+arg_4] + movzx edi, [esp+14h+arg_8] + sub edx, 1 + movzx ecx, dl + shr ebp, cl + shr edi, cl + mov ecx, [esp+14h+var_4] + mov [esp+14h+arg_0], edx + mov edx, [esi+10h] + and ebp, 1 + lea eax, [ebp+1] + shl eax, 8 + add eax, ebx + lea ecx, [ecx+eax*4] + mov eax, edx + shr eax, 0Bh + imul eax, [ecx] + and edi, 1 + test edi, edi + jnz short loc_4CFF41 + mov [esi+10h], eax + mov eax, [ecx] + mov edx, 800h + sub edx, eax + shr edx, 5 + add edx, eax + mov [ecx], edx + jmp short loc_4CFF58 +; --------------------------------------------------------------------------- + +loc_4CFF41: ; CODE XREF: sub_4CFED0+5Aj + add [esi+8], eax + adc dword ptr [esi+0Ch], 0 + sub edx, eax + mov [esi+10h], edx + mov eax, [ecx] + mov edx, eax + shr edx, 5 + sub eax, edx + mov [ecx], eax + +loc_4CFF58: ; CODE XREF: sub_4CFED0+6Fj + mov eax, [esi+10h] + cmp eax, 1000000h + jnb short loc_4CFF6F + shl eax, 8 + mov ecx, esi + mov [esi+10h], eax + call loc_4CF640 + +loc_4CFF6F: ; CODE XREF: sub_4CFED0+90j + mov edx, [esp+14h+arg_0] + add ebx, ebx + or ebx, edi + cmp ebp, edi + jnz short loc_4CFF8B + test edx, edx + jnz loc_4CFEF0 + pop edi + pop esi + pop ebp + pop ebx + pop ecx + retn 0Ch +; --------------------------------------------------------------------------- + +loc_4CFF8B: ; CODE XREF: sub_4CFED0+A9j + test edx, edx + jz loc_4D0012 + +loc_4CFF93: ; CODE XREF: sub_4CFED0+140j + movzx edi, [esp+14h+arg_8] + mov ebp, [esp+14h+var_4] + sub edx, 1 + mov cl, dl + shr edi, cl + mov ecx, [esi+10h] + mov eax, ecx + shr eax, 0Bh + imul eax, [ebp+ebx*4+0] + and edi, 1 + test edi, edi + mov [esp+14h+arg_0], edx + jnz short loc_4CFFD4 + mov [esi+10h], eax + mov eax, [ebp+ebx*4+0] + mov ecx, 800h + sub ecx, eax + shr ecx, 5 + add ecx, eax + mov [ebp+ebx*4+0], ecx + jmp short loc_4CFFEF +; --------------------------------------------------------------------------- + +loc_4CFFD4: ; CODE XREF: sub_4CFED0+E9j + add [esi+8], eax + adc dword ptr [esi+0Ch], 0 + sub ecx, eax + mov [esi+10h], ecx + mov eax, [ebp+ebx*4+0] + mov ecx, eax + shr ecx, 5 + sub eax, ecx + mov [ebp+ebx*4+0], eax + +loc_4CFFEF: ; CODE XREF: sub_4CFED0+102j + mov eax, [esi+10h] + cmp eax, 1000000h + jnb short loc_4D000A + shl eax, 8 + mov ecx, esi + mov [esi+10h], eax + call loc_4CF640 + mov edx, [esp+14h+arg_0] + +loc_4D000A: ; CODE XREF: sub_4CFED0+127j + add ebx, ebx + or ebx, edi + test edx, edx + jnz short loc_4CFF93 + +loc_4D0012: ; CODE XREF: sub_4CFED0+BDj + pop edi + pop esi + pop ebp + pop ebx + pop ecx + retn 0Ch +sub_4CFED0 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4D0020 proc near ; CODE XREF: sub_4D0770+C6p + ; CEncoder_CodeOneBlock+56Dp ... + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 +arg_8 = dword ptr 0Ch + + push ebp + mov ebp, [esp+4+arg_4] + cmp ebp, 8 + push esi + mov esi, [esp+8+arg_0] + push edi + mov edi, ecx + jnb short loc_4D007D + mov eax, [esi+10h] + shr eax, 0Bh + imul eax, [edi] + mov [esi+10h], eax + mov eax, [edi] + mov ecx, 800h + sub ecx, eax + +loc_4D0047: ; DATA XREF: .rdata:0050C3BCo + shr ecx, 5 + add ecx, eax + mov [edi], ecx + mov eax, [esi+10h] + cmp eax, 1000000h + jnb short loc_4D0065 + shl eax, 8 + +loc_4D005B: ; DATA XREF: .rdata:005064B0o + mov ecx, esi + mov [esi+10h], eax + call loc_4CF640 + +loc_4D0065: ; CODE XREF: sub_4D0020+36j + mov edx, [esp+0Ch+arg_8] + push ebp + shl edx, 5 + push esi + lea ecx, [edx+edi+8] + call sub_4CFB20 + pop edi + pop esi + pop ebp + retn 0Ch +; --------------------------------------------------------------------------- + +loc_4D007D: ; CODE XREF: sub_4D0020+10j + mov ecx, [esi+10h] + mov eax, ecx + shr eax, 0Bh + imul eax, [edi] + add [esi+8], eax + adc dword ptr [esi+0Ch], 0 + sub ecx, eax + mov [esi+10h], ecx + mov eax, [edi] + mov ecx, eax + shr ecx, 5 + sub eax, ecx + mov [edi], eax + mov eax, [esi+10h] + cmp eax, 1000000h + jnb short loc_4D00B6 + shl eax, 8 + mov ecx, esi + mov [esi+10h], eax + call loc_4CF640 + +loc_4D00B6: ; CODE XREF: sub_4D0020+87j + cmp ebp, 10h + jnb short loc_4D010F + mov edx, [esi+10h] + shr edx, 0Bh + imul edx, [edi+4] + mov [esi+10h], edx + mov eax, [edi+4] + mov ecx, 800h + sub ecx, eax + shr ecx, 5 + add ecx, eax + mov [edi+4], ecx + mov eax, [esi+10h] + cmp eax, 1000000h + jnb short loc_4D00F1 + shl eax, 8 + mov ecx, esi + mov [esi+10h], eax + call loc_4CF640 + +loc_4D00F1: ; CODE XREF: sub_4D0020+C2j + mov edx, [esp+0Ch+arg_8] + add ebp, 0FFFFFFF8h + push ebp + shl edx, 5 + push esi + lea ecx, [edx+edi+208h] + call sub_4CFB20 + pop edi + pop esi + pop ebp + retn 0Ch +; --------------------------------------------------------------------------- + +loc_4D010F: ; CODE XREF: sub_4D0020+99j + mov ecx, [esi+10h] + mov eax, ecx + shr eax, 0Bh + imul eax, [edi+4] + add [esi+8], eax + adc dword ptr [esi+0Ch], 0 + sub ecx, eax + mov [esi+10h], ecx + mov eax, [edi+4] + mov ecx, eax + shr ecx, 5 + sub eax, ecx + mov [edi+4], eax + mov eax, [esi+10h] + cmp eax, 1000000h + jnb short loc_4D014B + shl eax, 8 + mov ecx, esi + mov [esi+10h], eax + call loc_4CF640 + +loc_4D014B: ; CODE XREF: sub_4D0020+11Cj + add ebp, 0FFFFFFF0h + push ebp + push esi + lea ecx, [edi+408h] + call sub_4CFBC0 + pop edi + pop esi + pop ebp + retn 0Ch +sub_4D0020 endp + +; =============== S U B R O U T I N E ======================================= + +NCompress_NLZMA_CEncoder_CEncoder proc near ; CODE XREF: Compress_lzma_internal+149p + mov eax, ecx + mov dword ptr [eax+4], offset ICompressSetOutStream_vftable + mov dword ptr [eax+8], offset ICompressSetCoderProperties_vftable + mov dword ptr [eax+0Ch], offset ICompressWriteCoderProperties_vftable + xor ecx, ecx + mov [eax+24h], ecx + mov dword ptr [eax], offset NCompress_NLZMA_CEncoder_vftable + mov dword ptr [eax+4], offset NCompress_NLZMA_CEncoder_vftable_ICompressSetOutStream + mov dword ptr [eax+8], offset NCompress_NLZMA_CEncoder_vftable_ICompressSetCoderProperties + mov dword ptr [eax+0Ch], offset NCompress_NLZMA_CEncoder_vftable_ICompressWriteCoderProperties + mov [eax+40h], ecx + mov [eax+44h], ecx + mov [eax+54h], ecx + mov [eax+60h], ecx + mov [eax+32650h], ecx + mov dword ptr [eax+32EF8h], 20h + mov dword ptr [eax+33B58h], 2Ch + mov dword ptr [eax+33B5Ch], 2 + mov [eax+33B64h], ecx + mov dword ptr [eax+33B6Ch], 00400000h + mov edx, 3 + mov [eax+33B60h], edx + mov [eax+33B68h], edx + mov [eax+33B8Ch], ecx + mov [eax+33B90h], ecx + mov [eax+33B94h], cl + mov [eax+0B4h], ecx + mov [eax+0A4h], ecx + mov dword ptr [eax+0B0h], 20h + mov dword ptr [eax+0D4h], 1 + mov dword ptr [eax+0CCh], 4 + mov [eax+0D0h], ecx + mov [eax+0D8h], ecx + mov [eax+32EF4h], cl + retn +NCompress_NLZMA_CEncoder_CEncoder endp + +; =============== S U B R O U T I N E ======================================= + +; int __thiscall sub_4D0250(void *Memory, char) +sub_4D0250 proc near ; DATA XREF: .rdata:00517B0Co + +arg_0 = byte ptr 4 + + push esi + mov esi, ecx + call sub_4CF810 + test [esp+4+arg_0], 1 + jz short loc_4D0268 + push esi ; Memory + call j__free + add esp, 4 + +loc_4D0268: ; CODE XREF: sub_4D0250+Dj + mov eax, esi + pop esi + retn 4 +sub_4D0250 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +sub_4D0270 proc near ; CODE XREF: CEncoder_SetStreams+14p + push esi + mov esi, ecx + mov eax, [esi+40h] + test eax, eax + push edi + mov edi, 100000h + jz short loc_4D0297 + cmp [esi+50h], edi + jz short loc_4D02C5 + test eax, eax + jz short loc_4D0297 + push 8000h ; dwFreeType + push 0 ; dwSize + push eax ; lpAddress + call ds:VirtualFree + +loc_4D0297: ; CODE XREF: sub_4D0270+Ej + ; sub_4D0270+17j + push 4 ; flProtect + push 1000h ; flAllocationType + push edi ; dwSize + push 0 ; lpAddress + mov dword ptr [esi+40h], 0 + mov [esi+50h], edi + call ds:VirtualAlloc + test eax, eax + mov [esi+40h], eax + setnz al + test al, al + jnz short loc_4D02C5 + pop edi + mov eax, 8007000Eh + pop esi + retn +; --------------------------------------------------------------------------- + +loc_4D02C5: ; CODE XREF: sub_4D0270+13j + ; sub_4D0270+4Bj + mov eax, [esi+33B68h] + mov ecx, [esi+33B64h] + cmp dword ptr [esi+0D4h], 0 + push ebx + push eax + push ecx + lea ecx, [esi+32650h] + setnz bl + call sub_4CD940 + test al, al + jz short loc_4D034F + mov ecx, [esi+33B6Ch] + mov edx, 1000000h + cmp edx, ecx + sbb eax, eax + neg eax + push ebp + mov ebp, [esi+32EF8h] + mov [esi+0D8h], eax + mov eax, ebp + shr eax, 1 + add eax, 10h + test bl, bl + jnz short loc_4D0318 + shr eax, 1 + +loc_4D0318: ; CODE XREF: sub_4D0270+A4j + mov edx, [esi+33B90h] + test edx, edx + jz short loc_4D0324 + mov eax, edx + +loc_4D0324: ; CODE XREF: sub_4D0270+B0j + push offset off_546E20 + push 111h + push ebp + push 1000h + push ecx + lea edi, [esi+84h] + push edi + mov [esi+0B0h], eax + call sub_4CBA60 + add esp, 18h + test eax, eax + pop ebp + jnz short loc_4D0358 + +loc_4D034F: ; CODE XREF: sub_4D0270+7Bj + pop ebx + pop edi + mov eax, 8007000Eh + pop esi + retn +; --------------------------------------------------------------------------- + +loc_4D0358: ; CODE XREF: sub_4D0270+DDj + mov [esi+80h], edi + add esi, 68h + push esi + push edi + call sub_4CCAA0 + add esp, 8 + pop ebx + pop edi + xor eax, eax + pop esi + retn +sub_4D0270 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +CEncoder_SetStreams proc near ; CODE XREF: CEncoder_CodeReal+4Ap + +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 + + mov eax, [esp+arg_0] + push esi + mov esi, ecx + mov [esi+33B84h], eax + mov byte ptr [esi+33B80h], 0 + call sub_4D0270 + test eax, eax + jnz loc_4D0441 + mov edx, [esp+4+arg_4] + mov ecx, [esi+4] + lea eax, [esi+4] + push edx + push eax + mov eax, [ecx+0Ch] + call eax + test eax, eax + jnz loc_4D0441 + mov ecx, esi + call sub_4CDEA0 + test eax, eax + jnz short loc_4D0441 + cmp [esi+32EF4h], al + jnz short loc_4D03DB + mov ecx, esi + call CEncoder_FillDistancesPrices + mov ecx, esi + call CEncoder_FillAlignPrices + +loc_4D03DB: ; CODE XREF: CEncoder_SetStreams+4Bj + mov ecx, [esi+32EF8h] + sub ecx, 1 + mov [esi+2D9C0h], ecx + mov ecx, [esi+33B5Ch] + mov edx, 1 + shl edx, cl + lea ecx, [esi+28DB8h] + push edx + call sub_4CF780 + mov ecx, [esi+33B5Ch] + mov eax, [esi+32EF8h] + mov edx, 1 + shl edx, cl + sub eax, 1 + lea ecx, [esi+2DA04h] + mov [esi+3260Ch], eax + push edx + call sub_4CF780 + mov dword ptr [esi+33B78h], 0 + mov dword ptr [esi+33B7Ch], 0 + xor eax, eax + +loc_4D0441: ; CODE XREF: CEncoder_SetStreams+1Bj + ; CEncoder_SetStreams+34j ... + pop esi + retn 10h +CEncoder_SetStreams endp + +;Compress_lzma_internal proc near ; CODE XREF: Compress_lzma+34p +_starcraft_compress_lzma proc near ; CODE XREF: Compress_lzma+34p +; sub_4D0450 + +var_58 = dword ptr -58h +var_54 = dword ptr -54h +var_50 = dword ptr -50h +var_4C = dword ptr -4Ch +var_48 = dword ptr -48h +var_44 = dword ptr -44h +var_40 = dword ptr -40h +var_3C = word ptr -3Ch +var_34 = dword ptr -34h +var_2C = word ptr -2Ch +var_24 = dword ptr -24h +var_1C = dword ptr -1Ch +var_14 = dword ptr -14h +var_C = dword ptr -0Ch +var_4 = dword ptr -4 +pbInBuffer = dword ptr 4 +cbInBuffer = dword ptr 8 +pcbInBuffer = dword ptr 0Ch +pbOutBuffer = dword ptr 10h +cbOutBuffer = dword ptr 14h +dummy = dword ptr 18h +pcbOutBuffer = dword ptr 1Ch +pfnAllocateMemory= dword ptr 20h +pfnFreeMemory = dword ptr 24h +pfnGiveData = dword ptr 28h + + push 0FFFFFFFFh + push offset loc_4DA0FB + mov eax, dword ptr fs:[0] + push eax + sub esp, 4Ch + push ebx + push ebp + push esi + push edi + mov eax, dword_544960 + xor eax, esp + push eax + lea eax, [esp+6Ch+var_C] + mov dword ptr fs:[0], eax + mov eax, dword_553598 + xor ebx, ebx + cmp eax, ebx + jnz short loc_4D04A1 + push 0Ch ; Size + call _operator_new ; operator new(uint) + add esp, 4 + cmp eax, ebx + jz short loc_4D049A + mov [eax], ebx + mov [eax+4], ebx + mov [eax+8], ebx + jmp short loc_4D049C +; --------------------------------------------------------------------------- + +loc_4D049A: ; CODE XREF: Compress_lzma_internal+3Ej + xor eax, eax + +loc_4D049C: ; CODE XREF: Compress_lzma_internal+48j + mov dword ptr dword_553598, eax + +loc_4D04A1: ; CODE XREF: Compress_lzma_internal+30j + cmp [eax], ebx + jnz short loc_4D04B3 + mov ecx, [esp+6Ch+pfnAllocateMemory] + mov [eax], ecx + mov eax, dword_553598 + +loc_4D04B3: ; CODE XREF: Compress_lzma_internal+53j + cmp eax, ebx + jnz short loc_4D04D6 + push 0Ch ; Size + call _operator_new ; operator new(uint) + add esp, 4 + cmp eax, ebx + jz short loc_4D04CF + mov [eax], ebx + mov [eax+4], ebx + mov [eax+8], ebx + jmp short loc_4D04D1 +; --------------------------------------------------------------------------- + +loc_4D04CF: ; CODE XREF: Compress_lzma_internal+73j + xor eax, eax + +loc_4D04D1: ; CODE XREF: Compress_lzma_internal+7Dj + mov dword_553598, eax + +loc_4D04D6: ; CODE XREF: Compress_lzma_internal+65j + cmp [eax+4], ebx + jnz short loc_4D04EA + mov edx, [esp+6Ch+pfnFreeMemory] + mov [eax+4], edx + mov eax, dword_553598 + +loc_4D04EA: ; CODE XREF: Compress_lzma_internal+89j + cmp [eax+8], ebx + jnz short loc_4D04F9 + mov ecx, [esp+6Ch+pfnGiveData] + mov [eax+8], ecx + +loc_4D04F9: ; CODE XREF: Compress_lzma_internal+9Dj + mov edx, [esp+6Ch+pcbOutBuffer] + mov ebp, [esp+6Ch+pcbInBuffer] + cmp ebp, ebx + mov esi, [esp+6Ch+cbInBuffer] + mov [edx], ebx + mov edx, 1 + mov eax, esi + mov ecx, ebp + ja short loc_4D0520 + cmp esi, ebx + jbe short loc_4D053A + jmp short loc_4D0520 +; --------------------------------------------------------------------------- + align 10h + +loc_4D0520: ; CODE XREF: Compress_lzma_internal+C5j + ; Compress_lzma_internal+CBj ... + shrd eax, ecx, 1 + add edx, edx + shr ecx, 1 + cmp edx, 2000000h + ja short loc_4D053A + cmp ecx, ebx + ja short loc_4D0520 + jb short loc_4D053A + cmp eax, ebx + ja short loc_4D0520 + +loc_4D053A: ; CODE XREF: Compress_lzma_internal+C9j + ; Compress_lzma_internal+DEj ... + mov eax, 13h + push 33B98h ; Size + mov [esp+70h+var_48], 470h + mov [esp+70h+var_44], 400h + mov [esp+70h+var_40], 450h + mov [esp+70h+var_3C], ax + mov [esp+70h+var_2C], ax + mov word ptr [esp+70h+var_1C], ax + mov [esp+70h+var_34], 2 + mov [esp+70h+var_24], edx + mov [esp+70h+var_14], 40h + mov [esp+70h+var_58], ebx + call _operator_new ; operator new(uint) + add esp, 4 + mov [esp+6Ch+var_4C], eax + cmp eax, ebx + mov [esp+6Ch+var_4], ebx + jz short loc_4D05A4 + mov ecx, eax + call NCompress_NLZMA_CEncoder_CEncoder + mov [esp+6Ch+var_54], eax + jmp short loc_4D05AA +; --------------------------------------------------------------------------- + +loc_4D05A4: ; CODE XREF: Compress_lzma_internal+145j + mov [esp+6Ch+var_54], ebx + mov eax, ebx + +loc_4D05AA: ; CODE XREF: Compress_lzma_internal+152j + or edi, 0FFFFFFFFh + cmp eax, ebx + mov [esp+6Ch+var_4], edi + jz short loc_4D05D1 + mov ecx, [eax+8] + push 3 + lea edx, [esp+70h+var_3C] + push edx + add eax, 8 + lea edx, [esp+74h+var_48] + push edx + push eax + mov eax, [ecx+0Ch] + call eax ; ICompressSetCodeProperties::SetCoderProperties + test eax, eax + jz short loc_4D05D5 + +loc_4D05D1: ; CODE XREF: Compress_lzma_internal+163j + mov [esp+6Ch+var_58], edi + +loc_4D05D5: ; CODE XREF: Compress_lzma_internal+17Fj + push 28h ; Size + call _operator_new ; operator new(uint) + add esp, 4 + cmp eax, ebx + jz short loc_4D060E + mov ecx, [esp+6Ch+pbInBuffer] + mov [eax+4], ebx + add dword ptr [eax+4], 1 + mov dword ptr [eax], offset off_517A90 + mov [eax+8], ecx + mov [eax+10h], esi + mov [eax+14h], ebp + mov [eax+18h], ebx + mov [eax+1Ch], ebx + mov [eax+20h], bl + mov edi, eax ; EDI = pInStreamMemory + mov [esp+6Ch+var_50], eax + jmp short loc_4D0614 +; --------------------------------------------------------------------------- + +loc_4D060E: ; CODE XREF: Compress_lzma_internal+191j + xor edi, edi + mov [esp+6Ch+var_50], edi + +loc_4D0614: ; CODE XREF: Compress_lzma_internal+1BCj + push 28h ; Size + call _operator_new ; operator new(uint) + add esp, 4 + cmp eax, ebx + jz short loc_4D0657 + mov edx, [esp+6Ch+pbOutBuffer] + mov ecx, [esp+6Ch+cbOutBuffer] + mov [eax+4], ebx + add dword ptr [eax+4], 1 + mov [eax+8], edx + mov edx, [esp+6Ch+dummy] + mov dword ptr [eax], offset off_517AA4 + mov [eax+10h], ecx + mov [eax+14h], edx + mov [eax+18h], ebx + mov [eax+1Ch], ebx + mov [eax+20h], bl + mov esi, eax ; ESI = pOutStreamMemory + jmp short loc_4D0659 +; --------------------------------------------------------------------------- + +loc_4D0657: ; CODE XREF: Compress_lzma_internal+1D0j + xor esi, esi + +loc_4D0659: ; CODE XREF: Compress_lzma_internal+205j + cmp edi, ebx + jz short loc_4D0661 + cmp esi, ebx + jnz short loc_4D0669 + +loc_4D0661: ; CODE XREF: Compress_lzma_internal+20Bj + mov [esp+6Ch+var_58], 0FFFFFFFFh + +loc_4D0669: ; CODE XREF: Compress_lzma_internal+20Fj + mov eax, [esi] ; EAX = pOutStreamMemory->vftable + mov ecx, [eax+10h] ; ECX = + push ebx + mov edi, 1 + push edi + push ebx + push esi + call ecx + test eax, eax + jz short loc_4D0681 + mov [esp+6Ch+var_58], edi + +loc_4D0681: ; CODE XREF: Compress_lzma_internal+22Bj + mov eax, [esp+6Ch+var_54] + mov edx, [eax+0Ch] + add eax, 0Ch + push esi + push eax + mov eax, [edx+0Ch] + call eax + test eax, eax + jz short loc_4D069A + mov [esp+6Ch+var_58], edi + +loc_4D069A: ; CODE XREF: Compress_lzma_internal+244j + xor edi, edi + jmp short loc_4D06A4 +; --------------------------------------------------------------------------- + align 10h + +loc_4D06A0: ; CODE XREF: Compress_lzma_internal+27Fj + mov ebp, [esp+6Ch+pcbInBuffer] + +loc_4D06A4: ; CODE XREF: Compress_lzma_internal+24Cj + mov eax, [esp+6Ch+cbInBuffer] + push ebx + push 1 + mov edx, ebp + mov ecx, edi + call __allshr ; Microsoft VisualC 2-8/net runtime + push eax + mov eax, [esi] + mov ecx, [eax+10h] + push esi + call ecx + test eax, eax + jz short loc_4D06C9 + mov [esp+6Ch+var_58], 1 + +loc_4D06C9: ; CODE XREF: Compress_lzma_internal+26Fj + add edi, 8 + cmp edi, 40h + jl short loc_4D06A0 + mov ebp, [esp+6Ch+var_54] + xor edi, edi + cmp [esp+6Ch+var_58], ebx + jnz short loc_4D0723 + mov eax, [esp+6Ch+var_50] + mov edx, [ebp+0] + mov ecx, [edx+0Ch] + push ebx + push ebx + push ebx + push esi + push eax + push ebp + call ecx + mov ecx, [esi+18h] + mov edi, eax + mov eax, [esi+1Ch] + cmp eax, ebx + ja short loc_4D0700 + cmp ecx, 0FFFFFFFFh + jbe short loc_4D0709 + +loc_4D0700: ; CODE XREF: Compress_lzma_internal+2A9j + or ecx, 0FFFFFFFFh + mov [esp+6Ch+pcbInBuffer], ebx + jmp short loc_4D070D +; --------------------------------------------------------------------------- + +loc_4D0709: ; CODE XREF: Compress_lzma_internal+2AEj + mov [esp+6Ch+pcbInBuffer], eax + +loc_4D070D: ; CODE XREF: Compress_lzma_internal+2B7j + mov edx, [esp+6Ch+pcbOutBuffer] + mov [edx], ecx + cmp [esi+20h], bl + jz short loc_4D0723 + mov [esp+6Ch+var_58], 1 + +loc_4D0723: ; CODE XREF: Compress_lzma_internal+28Bj + ; Compress_lzma_internal+2C9j + mov eax, [esp+6Ch+var_50] + cmp eax, ebx + jz short loc_4D0733 + mov ecx, [eax] + mov edx, [ecx+8] + push eax + call edx + +loc_4D0733: ; CODE XREF: Compress_lzma_internal+2D9j + mov eax, [esi] + mov ecx, [eax+8] + push esi + call ecx + mov edx, [ebp+0] + mov eax, [edx+10h] + push 1 + mov ecx, ebp + call eax + mov eax, [esp+6Ch+var_58] + cmp eax, ebx + jnz short loc_4D0755 + neg edi + sbb edi, edi + mov eax, edi + +loc_4D0755: ; CODE XREF: Compress_lzma_internal+2FDj + mov ecx, [esp+6Ch+var_C] + mov dword ptr fs:[0], ecx + pop ecx + pop edi + pop esi + pop ebp + pop ebx + add esp, 58h + retn +_starcraft_compress_lzma endp +;Compress_lzma_internal endp + +; =============== S U B R O U T I N E ======================================= + +Compress_lzma proc near ; DATA XREF: .rdata:00509684o + +pbOutBuffer = dword ptr 4 +pcbOutBuffer = dword ptr 8 +pbInBuffer = dword ptr 0Ch +cbInBuffer = dword ptr 10h + + push esi + push edi +; call sub_47F198 + mov esi, [esp+8+pcbOutBuffer] ; ESI = pcbOutBuffer + mov edi, [esp+8+cbInBuffer] ; EDI = cbInBuffer +; push offset GiveDataToCompress +; push offset FreeMemory_47F3AB +; push offset AllocateMemory_47F396 + push esi ; pcbOutBuffer + push 0 + mov [eax+493E0h], eax + push dword ptr [esi] ; cbOutBuffer + push [esp+20h+pbOutBuffer] ; pbOutBuffer + push 0 + push edi ; cbInBuffer + push [esp+2Ch+pbInBuffer] ; pbInBuffer +; call Compress_lzma_internal + add esp, 28h + sub eax, 0 + jz short loc_47F401 + mov [esi], edi + dec eax + +loc_47F401: ; CODE XREF: Compress_lzma+3Fj + pop edi + pop esi + retn +Compress_lzma endp + +; =============== S U B R O U T I N E ======================================= + +sub_4D0770 proc near ; CODE XREF: CEncoder_Flush+1Ap + +arg_0 = dword ptr 4 + + push edi + mov edi, ecx + cmp byte ptr [edi+33B94h], 0 + jz loc_4D0881 + movzx eax, byte ptr [edi+10h] + mov ecx, [edi+38h] + shl eax, 4 + push ebx + mov ebx, [esp+8+arg_0] + add eax, ebx + lea edx, [edi+eax*4+280F0h] + push ebp + push esi + lea esi, [edi+28h] + mov eax, ecx + shr eax, 0Bh + imul eax, [edx] + add [esi+8], eax + adc dword ptr [esi+0Ch], 0 + sub ecx, eax + mov [esi+10h], ecx + mov eax, [edx] + mov ecx, eax + shr ecx, 5 + sub eax, ecx + mov [edx], eax + mov eax, [esi+10h] + cmp eax, 1000000h + jnb short loc_4D07D3 + shl eax, 8 + mov ecx, esi + mov [esi+10h], eax + call loc_4CF640 + +loc_4D07D3: ; CODE XREF: sub_4D0770+54j + movzx edx, byte ptr [edi+10h] + mov ecx, [esi+10h] + lea eax, [edi+edx*4+283F0h] + shr ecx, 0Bh + imul ecx, [eax] + mov [esi+10h], ecx + mov ecx, [eax] + mov edx, 800h + sub edx, ecx + shr edx, 5 + add edx, ecx + mov [eax], edx + mov eax, [esi+10h] + cmp eax, 1000000h + jnb short loc_4D0811 + shl eax, 8 + mov ecx, esi + mov [esi+10h], eax + call loc_4CF640 + +loc_4D0811: ; CODE XREF: sub_4D0770+92j + movzx eax, byte ptr [edi+10h] + mov cl, ds:kMatchNextStates[eax] + push ebx + mov [edi+10h], cl + cmp byte ptr [edi+32EF4h], 0 + push 0 + lea ebp, [edi+28DB8h] + push esi + mov ecx, ebp + setz byte ptr [esp+1Ch+arg_0] + call sub_4D0020 + cmp byte ptr [esp+10h+arg_0], 0 + jz short loc_4D0854 + add dword ptr [ebp+ebx*4+4C0Ch], 0FFFFFFFFh + jnz short loc_4D0854 + push ebx + mov ecx, ebp + call sub_4CF740 + +loc_4D0854: ; CODE XREF: sub_4D0770+D0j + ; sub_4D0770+DAj + push 3Fh + push esi + lea ecx, [edi+287B0h] + call sub_4CFC60 + push 1Ah + push 3FFFFFFh + mov ecx, esi + call sub_4CF6E0 + push 0Fh + push esi + lea ecx, [edi+28D78h] + call sub_4CFD00 + pop esi + pop ebp + pop ebx + +loc_4D0881: ; CODE XREF: sub_4D0770+Aj + pop edi + retn 4 +sub_4D0770 endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +CEncoder_Flush proc near ; CODE XREF: CEncoder_CodeOneBlock+BAp + ; CEncoder_CodeOneBlock+1D0p ... + +arg_0 = dword ptr 4 + + push esi + mov esi, ecx + mov eax, [esi+0ECh] + test eax, eax + jnz short loc_4D08E5 + mov eax, [esi+33B60h] + and eax, [esp+4+arg_0] + push ebx + push edi + push eax + call sub_4D0770 + lea ebx, [esi+28h] + mov edi, 5 + +loc_4D08B7: ; CODE XREF: CEncoder_Flush+31j + mov ecx, ebx + call loc_4CF640 + sub edi, 1 + jnz short loc_4D08B7 + mov ecx, [esi+4Ch] + add esi, 40h + cmp ecx, [esi+4] + pop edi + pop ebx + jz short loc_4D08E3 + +loc_4D08D0: ; CODE XREF: CEncoder_Flush+51j + mov ecx, esi + call sub_4CF450 + test eax, eax + jnz short loc_4D08E5 + mov edx, [esi+0Ch] + cmp edx, [esi+4] + jnz short loc_4D08D0 + +loc_4D08E3: ; CODE XREF: CEncoder_Flush+3Ej + xor eax, eax + +loc_4D08E5: ; CODE XREF: CEncoder_Flush+Bj + ; CEncoder_Flush+49j + pop esi + retn 4 +CEncoder_Flush endp + +; --------------------------------------------------------------------------- + align 10h +; =============== S U B R O U T I N E ======================================= + +CEncoder_CodeOneBlock proc near ; CODE XREF: CEncoder_CodeReal+B1p + ; CEncoder_CodeReal+F5p + +var_20 = byte ptr -20h +var_1C = dword ptr -1Ch +var_18 = dword ptr -18h +var_14 = dword ptr -14h +var_10 = dword ptr -10h +var_C = dword ptr -0Ch +var_8 = dword ptr -8 +var_4 = dword ptr -4 +arg_0 = dword ptr 4 +arg_4 = dword ptr 8 +arg_8 = dword ptr 0Ch + + sub esp, 20h + push ebp + push esi + mov esi, ecx + push edi + mov edi, [esi+33B84h] + xor ebp, ebp + cmp edi, ebp + jz short loc_4D0952 + mov eax, [edi] + mov ecx, [eax+4] + push edi + call ecx + mov eax, [esi+33B8Ch] + cmp eax, ebp + jz short loc_4D091E + mov edx, [eax] + push eax + mov eax, [edx+8] + call eax + +loc_4D091E: ; CODE XREF: CEncoder_CodeOneBlock+24j + mov [esi+33B8Ch], edi + mov ecx, [esi+80h] + mov edx, [esi+68h] + lea eax, [esi+33B88h] + push ecx + mov dword ptr [eax], offset loc_4CF210 + mov [esi+0B8h], eax + call edx + add esp, 4 + mov byte ptr [esi+33B95h], 1 + mov [esi+33B84h], ebp + +loc_4D0952: ; CODE XREF: CEncoder_CodeOneBlock+12j + mov eax, [esp+2Ch+arg_8] + mov dword ptr [eax], 1 + cmp byte ptr [esi+33B80h], 0 + jz short loc_4D0974 + mov eax, [esi+0ECh] + pop edi + pop esi + pop ebp + add esp, 20h + retn 0Ch +; --------------------------------------------------------------------------- + +loc_4D0974: ; CODE XREF: CEncoder_CodeOneBlock+73j + mov ecx, [esi+33B78h] + or ecx, [esi+33B7Ch] + push ebx + mov byte ptr [esi+33B80h], 1 + jnz loc_4D0A9C + mov edx, [esi+80h] + mov eax, [esi+70h] + push edx + call eax + add esp, 4 + test eax, eax + jnz short loc_4D09B9 + mov ecx, [esi+33B78h] + push ecx + mov ecx, esi + call CEncoder_Flush + pop ebx + pop edi + pop esi + pop ebp + add esp, 20h + retn 0Ch +; --------------------------------------------------------------------------- + +loc_4D09B9: ; CODE XREF: CEncoder_CodeOneBlock+AFj + lea edx, [esp+30h+var_4] + push edx + mov ecx, esi + call sub_4CB3B0 + movzx ecx, byte ptr [esi+10h] + mov eax, [esi+33B60h] + and eax, [esi+33B78h] + mov edx, [esi+38h] + lea edi, [esi+28h] + shl ecx, 4 + add eax, ecx + shr edx, 0Bh + imul edx, [esi+eax*4+280F0h] + lea eax, [esi+eax*4+280F0h] + mov [edi+10h], edx + mov ecx, [eax] + mov edx, 800h + sub edx, ecx + shr edx, 5 + add edx, ecx + mov [eax], edx + mov eax, [edi+10h] + cmp eax, 1000000h + jnb short loc_4D0A1C + shl eax, 8 + mov ecx, edi + mov [edi+10h], eax + call loc_4CF640 + +loc_4D0A1C: ; CODE XREF: CEncoder_CodeOneBlock+11Dj + movzx eax, byte ptr [esi+10h] + mov cl, ds:kLiteralNextStates[eax] + mov [esi+10h], cl + mov edx, [esi+32F04h] + mov eax, [esi+80h] + mov ecx, [esi+6Ch] + neg edx + push edx + push eax + call ecx + mov bl, al + mov eax, [esi+32654h] + add esp, 8 + mov byte ptr [esp+30h+var_10], bl + mov edx, [esp+30h+var_10] + push edx + movzx edx, byte ptr [esi+11h] + push edi + mov edi, [esi+3265Ch] + and edi, [esi+33B78h] + mov ecx, 8 + sub cl, al + shr edx, cl + mov ecx, eax + shl edi, cl + add edx, edi + imul edx, 0C00h + add edx, [esi+32650h] + mov ecx, edx + call sub_4CFE30 + add dword ptr [esi+32F04h], 0FFFFFFFFh + add dword ptr [esi+33B78h], 1 + mov [esi+11h], bl + adc [esi+33B7Ch], ebp + +loc_4D0A9C: ; CODE XREF: CEncoder_CodeOneBlock+98j + mov edi, [esi+33B78h] + mov eax, [esi+80h] + mov ecx, [esi+70h] + push eax + mov [esp+34h+var_14], edi + mov [esp+34h+var_4], edi + call ecx + add esp, 4 + test eax, eax + jnz short loc_4D0AD4 + push edi + mov ecx, esi + call CEncoder_Flush + pop ebx + pop edi + pop esi + pop ebp + add esp, 20h + retn 0Ch +; --------------------------------------------------------------------------- + align 10h + +loc_4D0AD0: ; CODE XREF: CEncoder_CodeOneBlock+735j + ; CEncoder_CodeOneBlock+78Bj + mov edi, [esp+30h+var_14] + +loc_4D0AD4: ; CODE XREF: CEncoder_CodeOneBlock+1CBj + cmp byte ptr [esi+32EF4h], 0 + mov ecx, esi + jz short loc_4D0AEB + lea edx, [esp+30h+var_1C] + push edx + call CEncoder_GetOptimumFast + jmp short loc_4D0AF6 +; --------------------------------------------------------------------------- + +loc_4D0AEB: ; CODE XREF: CEncoder_CodeOneBlock+1EDj + lea eax, [esp+30h+var_1C] + push eax + push edi + call CEncoder_GetOptimum + +loc_4D0AF6: ; CODE XREF: CEncoder_CodeOneBlock+1F9j + mov ebx, [esi+33B60h] + and ebx, edi + cmp eax, 1 + mov [esp+30h+var_18], eax + jnz loc_4D0C0E + cmp [esp+30h+var_1C], 0FFFFFFFFh + jnz loc_4D0C0E + movzx ecx, byte ptr [esi+10h] + mov edx, [esi+38h] + lea ebp, [esi+28h] + shl ecx, 4 + shr edx, 0Bh + add ecx, ebx + imul edx, [esi+ecx*4+280F0h] + lea eax, [esi+ecx*4+280F0h] + mov [ebp+10h], edx + mov ecx, [eax] + mov edx, 800h + sub edx, ecx + shr edx, 5 + add edx, ecx + mov [eax], edx + mov eax, [ebp+10h] + cmp eax, 1000000h + jnb short loc_4D0B61 + shl eax, 8 + mov ecx, ebp + mov [ebp+10h], eax + call loc_4CF640 + +loc_4D0B61: ; CODE XREF: CEncoder_CodeOneBlock+262j + mov eax, [esi+32F04h] + mov ecx, [esi+80h] + mov edx, [esi+6Ch] + neg eax + push eax + push ecx + call edx + movzx edi, byte ptr [esi+11h] + mov edx, [esi+3265Ch] + and edx, [esp+38h+var_14] + mov bl, al + mov eax, [esi+32654h] + mov ecx, 8 + sub cl, al + shr edi, cl + mov ecx, eax + shl edx, cl + add esp, 8 + mov byte ptr [esp+30h+var_10], bl + add edi, edx + imul edi, 0C00h + add edi, [esi+32650h] + cmp byte ptr [esi+10h], 7 + jnb short loc_4D0BC3 + mov eax, [esp+30h+var_10] + push eax + push ebp + mov ecx, edi + call sub_4CFE30 + jmp short loc_4D0BF5 +; --------------------------------------------------------------------------- + +loc_4D0BC3: ; CODE XREF: CEncoder_CodeOneBlock+2C2j + mov edx, [esi+80h] + mov eax, [esi+6Ch] + or ecx, 0FFFFFFFFh + sub ecx, [esi+14h] + sub ecx, [esi+32F04h] + push ecx + push edx + call eax + mov ecx, [esp+38h+var_10] + add esp, 8 + mov byte ptr [esp+30h+var_C], al + mov edx, [esp+30h+var_C] + push ecx + push edx + push ebp + mov ecx, edi + call sub_4CFED0 + +loc_4D0BF5: ; CODE XREF: CEncoder_CodeOneBlock+2D1j + movzx eax, byte ptr [esi+10h] + mov cl, ds:kLiteralNextStates[eax] + mov ebp, [esp+30h+var_18] + mov [esi+10h], cl + mov [esi+11h], bl + jmp loc_4D1013 +; --------------------------------------------------------------------------- + +loc_4D0C0E: ; CODE XREF: CEncoder_CodeOneBlock+215j + ; CEncoder_CodeOneBlock+220j + movzx edx, byte ptr [esi+10h] + mov ecx, [esi+38h] + lea edi, [esi+28h] + shl edx, 4 + mov eax, ecx + shr eax, 0Bh + add edx, ebx + imul eax, [esi+edx*4+280F0h] + add [edi+8], eax + lea edx, [esi+edx*4+280F0h] + mov ebp, 0 + adc [edi+0Ch], ebp + sub ecx, eax + mov [edi+10h], ecx + mov eax, [edx] + mov ecx, eax + shr ecx, 5 + sub eax, ecx + mov [edx], eax + mov eax, [edi+10h] + cmp eax, 1000000h + jnb short loc_4D0C63 + shl eax, 8 + mov ecx, edi + mov [edi+10h], eax + call loc_4CF640 + +loc_4D0C63: ; CODE XREF: CEncoder_CodeOneBlock+364j + cmp [esp+30h+var_1C], 4 + movzx edx, byte ptr [esi+10h] + mov ecx, [edi+10h] + jnb loc_4D0E91 + mov eax, ecx + shr eax, 0Bh + imul eax, [esi+edx*4+283F0h] + add [edi+8], eax + lea edx, [esi+edx*4+283F0h] + adc [edi+0Ch], ebp + sub ecx, eax + mov [edi+10h], ecx + mov eax, [edx] + mov ecx, eax + shr ecx, 5 + sub eax, ecx + mov [edx], eax + mov eax, [edi+10h] + cmp eax, 1000000h + jnb short loc_4D0CB6 + shl eax, 8 + mov ecx, edi + mov [edi+10h], eax + call loc_4CF640 + +loc_4D0CB6: ; CODE XREF: CEncoder_CodeOneBlock+3B7j + mov eax, [esp+30h+var_1C] + cmp eax, ebp + mov ecx, [edi+10h] + jnz short loc_4D0D24 + movzx edx, byte ptr [esi+10h] + lea eax, [esi+edx*4+28420h] + shr ecx, 0Bh + imul ecx, [eax] + mov [edi+10h], ecx + mov ecx, [eax] + mov edx, 800h + sub edx, ecx + shr edx, 5 + add edx, ecx + mov [eax], edx + mov eax, [edi+10h] + cmp eax, 1000000h + jnb short loc_4D0CFC + shl eax, 8 + mov ecx, edi + mov [edi+10h], eax + call loc_4CF640 + +loc_4D0CFC: ; CODE XREF: CEncoder_CodeOneBlock+3FDj + mov ebp, [esp+30h+var_18] + movzx ecx, byte ptr [esi+10h] + xor eax, eax + cmp ebp, 1 + setnz al + shl ecx, 4 + add ecx, ebx + lea ecx, [esi+ecx*4+284B0h] + push eax + push edi + call sub_4CFAC0 + jmp loc_4D0E2E +; --------------------------------------------------------------------------- + +loc_4D0D24: ; CODE XREF: CEncoder_CodeOneBlock+3CFj + mov edx, [esi+eax*4+14h] + movzx eax, byte ptr [esi+10h] + mov [esp+30h+var_8], edx + lea edx, [esi+eax*4+28420h] + mov eax, ecx + shr eax, 0Bh + imul eax, [edx] + add [edi+8], eax + adc [edi+0Ch], ebp + sub ecx, eax + mov [edi+10h], ecx + mov eax, [edx] + mov ecx, eax + shr ecx, 5 + sub eax, ecx + mov [edx], eax + mov eax, [edi+10h] + cmp eax, 1000000h + jnb short loc_4D0D6C + shl eax, 8 + mov ecx, edi + mov [edi+10h], eax + call loc_4CF640 + +loc_4D0D6C: ; CODE XREF: CEncoder_CodeOneBlock+46Dj + cmp [esp+30h+var_1C], 1 + mov ecx, [edi+10h] + jnz short loc_4D0DB3 + movzx edx, byte ptr [esi+10h] + lea eax, [esi+edx*4+28450h] + shr ecx, 0Bh + imul ecx, [eax] + mov [edi+10h], ecx + mov ecx, [eax] + mov edx, 800h + sub edx, ecx + shr edx, 5 + add edx, ecx + mov [eax], edx + mov eax, [edi+10h] + cmp eax, 1000000h + jnb short loc_4D0E1D + shl eax, 8 + mov ecx, edi + mov [edi+10h], eax + call loc_4CF640 + jmp short loc_4D0E1D +; --------------------------------------------------------------------------- + +loc_4D0DB3: ; CODE XREF: CEncoder_CodeOneBlock+484j + movzx eax, byte ptr [esi+10h] + lea edx, [esi+eax*4+28450h] + mov eax, ecx + shr eax, 0Bh + imul eax, [edx] + add [edi+8], eax + adc [edi+0Ch], ebp + sub ecx, eax + mov [edi+10h], ecx + mov eax, [edx] + mov ecx, eax + shr ecx, 5 + sub eax, ecx + mov [edx], eax + mov eax, [edi+10h] + cmp eax, 1000000h + jnb short loc_4D0DF3 + shl eax, 8 + mov ecx, edi + mov [edi+10h], eax + call loc_4CF640 + +loc_4D0DF3: ; CODE XREF: CEncoder_CodeOneBlock+4F4j + mov ebp, [esp+30h+var_1C] + movzx eax, byte ptr [esi+10h] + lea edx, [ebp-2] + push edx + push edi + lea ecx, [esi+eax*4+28480h] + call sub_4CFAC0 + cmp ebp, 3 + jnz short loc_4D0E17 + mov ecx, [esi+1Ch] + mov [esi+20h], ecx + +loc_4D0E17: ; CODE XREF: CEncoder_CodeOneBlock+51Fj + mov edx, [esi+18h] + mov [esi+1Ch], edx + +loc_4D0E1D: ; CODE XREF: CEncoder_CodeOneBlock+4B2j + ; CEncoder_CodeOneBlock+4C1j + mov eax, [esi+14h] + mov ecx, [esp+30h+var_8] + mov ebp, [esp+30h+var_18] + mov [esi+18h], eax + mov [esi+14h], ecx + +loc_4D0E2E: ; CODE XREF: CEncoder_CodeOneBlock+42Fj + cmp ebp, 1 + jnz short loc_4D0E45 + movzx edx, byte ptr [esi+10h] + mov al, ds:kShortRepNextStates[edx] + mov [esi+10h], al + jmp loc_4D0FF5 +; --------------------------------------------------------------------------- + +loc_4D0E45: ; CODE XREF: CEncoder_CodeOneBlock+541j + cmp byte ptr [esi+32EF4h], 0 + push ebx + lea edx, [ebp-2] + push edx + lea ecx, [esi+2DA04h] + push edi + setz [esp+3Ch+var_20] + call sub_4D0020 + cmp [esp+30h+var_20], 0 + jz short loc_4D0E7F + add dword ptr [esi+ebx*4+32610h], 0FFFFFFFFh + lea ecx, [esi+2DA04h] + jnz short loc_4D0E7F + push ebx + call sub_4CF740 + +loc_4D0E7F: ; CODE XREF: CEncoder_CodeOneBlock+577j + ; CEncoder_CodeOneBlock+587j + movzx eax, byte ptr [esi+10h] + mov cl, ds:kRepNextStates[eax] + mov [esi+10h], cl + jmp loc_4D0FF5 +; --------------------------------------------------------------------------- + +loc_4D0E91: ; CODE XREF: CEncoder_CodeOneBlock+37Fj + lea eax, [esi+edx*4+283F0h] + shr ecx, 0Bh + imul ecx, [eax] + mov [edi+10h], ecx + mov ecx, [eax] + mov edx, 800h + sub edx, ecx + shr edx, 5 + add edx, ecx + mov [eax], edx + mov eax, [edi+10h] + cmp eax, 1000000h + jnb short loc_4D0EC8 + shl eax, 8 + mov ecx, edi + mov [edi+10h], eax + call loc_4CF640 + +loc_4D0EC8: ; CODE XREF: CEncoder_CodeOneBlock+5C9j + movzx eax, byte ptr [esi+10h] + mov cl, ds:kMatchNextStates[eax] + mov eax, [esp+30h+var_18] + mov [esi+10h], cl + cmp byte ptr [esi+32EF4h], 0 + push ebx + setz [esp+34h+var_20] + add eax, 0FFFFFFFEh + push eax + lea ebp, [esi+28DB8h] + push edi + mov ecx, ebp + call sub_4D0020 + cmp [esp+30h+var_20], 0 + jz short loc_4D0F11 + add dword ptr [ebp+ebx*4+4C0Ch], 0FFFFFFFFh + jnz short loc_4D0F11 + push ebx + mov ecx, ebp + call sub_4CF740 + +loc_4D0F11: ; CODE XREF: CEncoder_CodeOneBlock+60Dj + ; CEncoder_CodeOneBlock+617j + mov eax, [esp+30h+var_1C] + sub eax, 4 + cmp eax, 2000h + mov [esp+30h+var_1C], eax + jnb short loc_4D0F2C + movzx ebp, byte ptr dword_551198[eax] + jmp short loc_4D0F4F +; --------------------------------------------------------------------------- + +loc_4D0F2C: ; CODE XREF: CEncoder_CodeOneBlock+631j + cmp eax, 2000000h + jnb short loc_4D0F42 + shr eax, 0Ch + movzx ebp, byte ptr dword_551198[eax] + add ebp, 18h + jmp short loc_4D0F4F +; --------------------------------------------------------------------------- + +loc_4D0F42: ; CODE XREF: CEncoder_CodeOneBlock+641j + shr eax, 18h + movzx ebp, byte ptr dword_551198[eax] + add ebp, 30h + +loc_4D0F4F: ; CODE XREF: CEncoder_CodeOneBlock+63Aj + ; CEncoder_CodeOneBlock+650j + mov eax, [esp+30h+var_18] + add eax, 0FFFFFFFEh + cmp eax, 4 + jb short loc_4D0F60 + mov eax, 3 + +loc_4D0F60: ; CODE XREF: CEncoder_CodeOneBlock+669j + push ebp + shl eax, 8 + push edi + lea ecx, [eax+esi+287B0h] + call sub_4CFC60 + cmp ebp, 4 + jb short loc_4D0FD1 + mov ebx, [esp+30h+var_1C] + mov ecx, ebp + mov eax, ebp + and eax, 1 + shr ecx, 1 + sub ecx, 1 + or eax, 2 + shl eax, cl + sub ebx, eax + cmp ebp, 0Eh + jnb short loc_4D0FA9 + push ebx + push ecx + sub eax, ebp + lea edx, [esi+eax*4+28BACh] + push edi + push edx + call sub_4CFD90 + add esp, 10h + jmp short loc_4D0FD1 +; --------------------------------------------------------------------------- + +loc_4D0FA9: ; CODE XREF: CEncoder_CodeOneBlock+6A0j + add ecx, 0FFFFFFFCh + push ecx + mov eax, ebx + shr eax, 4 + push eax + mov ecx, edi + call sub_4CF6E0 + and ebx, 0Fh + push ebx + push edi + lea ecx, [esi+28D78h] + call sub_4CFD00 + add dword ptr [esi+33B54h], 1 + +loc_4D0FD1: ; CODE XREF: CEncoder_CodeOneBlock+684j + ; CEncoder_CodeOneBlock+6B7j + mov ecx, [esi+1Ch] + mov edx, [esi+18h] + mov eax, [esi+14h] + add dword ptr [esi+33B70h], 1 + mov ebp, [esp+30h+var_18] + mov [esi+20h], ecx + mov ecx, [esp+30h+var_1C] + mov [esi+1Ch], edx + mov [esi+18h], eax + mov [esi+14h], ecx + +loc_4D0FF5: ; CODE XREF: CEncoder_CodeOneBlock+550j + ; CEncoder_CodeOneBlock+59Cj + mov eax, [esi+80h] + mov ecx, [esi+6Ch] + mov edx, ebp + sub edx, [esi+32F04h] + sub edx, 1 + push edx + push eax + call ecx + add esp, 8 + mov [esi+11h], al + +loc_4D1013: ; CODE XREF: CEncoder_CodeOneBlock+319j + sub [esi+32F04h], ebp + mov eax, [esi+32F04h] + add [esp+30h+var_14], ebp + test eax, eax + jnz loc_4D0AD0 + cmp [esi+32EF4h], al + jnz short loc_4D1056 + cmp dword ptr [esi+33B70h], 80h + jb short loc_4D1046 + mov ecx, esi + call CEncoder_FillDistancesPrices + +loc_4D1046: ; CODE XREF: CEncoder_CodeOneBlock+74Dj + cmp dword ptr [esi+33B54h], 10h + jb short loc_4D1056 + mov ecx, esi + call CEncoder_FillAlignPrices + +loc_4D1056: ; CODE XREF: CEncoder_CodeOneBlock+741j + ; CEncoder_CodeOneBlock+75Dj + mov edx, [esi+80h] + mov eax, [esi+70h] + push edx + call eax + add esp, 4 + test eax, eax + mov eax, [esp+30h+var_14] + jz short loc_4D10D7 + mov ecx, [esp+30h+var_4] + mov edx, eax + sub edx, ecx + cmp edx, 4000h + jb loc_4D0AD0 + sub eax, ecx + add [esi+33B78h], eax + mov ecx, [esi+33B78h] + mov eax, [esp+30h+arg_0] + adc dword ptr [esi+33B7Ch], 0 + mov [eax], ecx + mov edx, [esi+33B7Ch] + lea ecx, [esi+28h] + mov [eax+4], edx + call sub_4CD8B0 + mov ecx, [esp+30h+arg_4] + mov [ecx], eax + mov eax, [esp+30h+arg_8] + mov [ecx+4], edx + pop ebx + mov byte ptr [esi+33B80h], 0 + pop edi + mov dword ptr [eax], 0 + mov eax, [esi+0ECh] + pop esi + pop ebp + add esp, 20h + retn 0Ch +; --------------------------------------------------------------------------- + +loc_4D10D7: ; CODE XREF: CEncoder_CodeOneBlock+77Bj + push eax + mov ecx, esi + call CEncoder_Flush + pop ebx + pop edi + pop esi + pop ebp + add esp, 20h + retn 0Ch +CEncoder_CodeOneBlock endp + +; --------------------------------------------------------------------------- + align 10h +CEncoder_CodeReal proc near ; CODE XREF: CEncoder_Code+49p + +var_20 = dword ptr -20h +processedOutSize= byte ptr -1Ch +processedInSize = byte ptr -14h +var_C = dword ptr -0Ch +var_4 = dword ptr -4 +inStream = dword ptr 4 +outStream = dword ptr 8 +inSize = dword ptr 0Ch +outSize = dword ptr 10h +progress = dword ptr 14h + + push 0FFFFFFFFh + push offset loc_4DA128 + mov eax, dword ptr fs:[0] + push eax + sub esp, 14h + push ebp + push esi + push edi + mov eax, dword_544960 + xor eax, esp + push eax + lea eax, [esp+30h+var_C] + mov dword ptr fs:[0], eax + mov esi, ecx + mov [esp+30h+var_20], esi + mov eax, [esp+30h+outSize] + mov ecx, [esp+30h+inSize] + mov edx, [esp+30h+outStream] + push eax + mov eax, [esp+34h+inStream] + push ecx + push edx + push eax + mov ecx, esi + mov [esp+40h+var_4], 0 + call CEncoder_SetStreams + mov edi, eax + test edi, edi + jz short loc_4D1190 + cmp dword ptr [esi+80h], 0 + mov [esp+30h+var_4], 0FFFFFFFFh + jz short loc_4D1166 + cmp byte ptr [esi+33B95h], 0 + jz short loc_4D1166 + mov byte ptr [esi+33B95h], 0 + +loc_4D1166: ; CODE XREF: CEncoder_CodeReal+64j + ; CEncoder_CodeReal+6Dj + mov eax, [esi+33B8Ch] + test eax, eax + jz short loc_4D1182 + mov ecx, [eax] + mov edx, [ecx+8] + push eax + call edx + mov dword ptr [esi+33B8Ch], 0 + +loc_4D1182: ; CODE XREF: CEncoder_CodeReal+7Ej + mov ecx, [esi+4] + mov edx, [ecx+10h] + lea eax, [esi+4] + push eax + call edx + jmp short loc_4D1201 +; --------------------------------------------------------------------------- + +loc_4D1190: ; CODE XREF: CEncoder_CodeReal+53j + lea eax, [esp+30h+outSize] + push eax + lea ecx, [esp+34h+processedOutSize] + push ecx + lea edx, [esp+38h+processedInSize] + push edx + mov ecx, esi + call CEncoder_CodeOneBlock + mov edi, eax + test edi, edi + jnz short loc_4D11F0 + mov ebp, [esp+30h+progress] + +loc_4D11B0: ; CODE XREF: CEncoder_CodeReal+FEj + cmp [esp+30h+outSize], 0 + jnz short loc_4D1218 + test ebp, ebp + jz short loc_4D11D4 + mov eax, [ebp+0] + mov eax, [eax+0Ch] + lea ecx, [esp+30h+processedOutSize] + push ecx + lea edx, [esp+34h+processedInSize] + push edx + push ebp + call eax ; SetRatioInfo + mov edi, eax + test edi, edi + jnz short loc_4D11F0 + +loc_4D11D4: ; CODE XREF: CEncoder_CodeReal+C9j + lea ecx, [esp+30h+outSize] + push ecx + lea edx, [esp+34h+processedOutSize] + push edx + lea eax, [esp+38h+processedInSize] + push eax + mov ecx, esi + call CEncoder_CodeOneBlock + mov edi, eax + test edi, edi + jz short loc_4D11B0 + +loc_4D11F0: ; CODE XREF: CEncoder_CodeReal+BAj + ; CEncoder_CodeReal+E2j + lea ecx, [esp+30h+var_20] + mov [esp+30h+var_4], 0FFFFFFFFh + call sub_4CDA70 + +loc_4D1201: ; CODE XREF: CEncoder_CodeReal+9Ej + mov eax, edi + mov ecx, [esp+30h+var_C] + mov dword ptr fs:[0], ecx + pop ecx + pop edi + pop esi + pop ebp + add esp, 20h + retn 14h +; --------------------------------------------------------------------------- + +loc_4D1218: ; CODE XREF: CEncoder_CodeReal+C5j + lea ecx, [esp+30h+var_20] + mov [esp+30h+var_4], 0FFFFFFFFh + call sub_4CDA70 + xor eax, eax + mov ecx, [esp+30h+var_C] + mov dword ptr fs:[0], ecx + pop ecx + pop edi + pop esi + pop ebp + add esp, 20h + retn 14h +CEncoder_CodeReal endp + +; =============== S U B R O U T I N E ======================================= +; Attributes: bp-based frame + +CEncoder_Code proc near ; DATA XREF: .rdata:00517B08o +; sub_4D1240 + +var_10 = dword ptr -10h +var_C = dword ptr -0Ch +var_4 = dword ptr -4 +pThis = dword ptr 8 +pInStream = dword ptr 0Ch +pOutStream = dword ptr 10h +pInSize = dword ptr 14h +pOutSize = dword ptr 18h +progress = dword ptr 1Ch + + push ebp + mov ebp, esp + push 0FFFFFFFFh + push offset loc_4DA150 + mov eax, dword ptr fs:[0] + push eax + sub esp, 8 + push ebx + push esi + push edi + mov eax, dword_544960 + xor eax, ebp + push eax + lea eax, [ebp+var_C] + mov dword ptr fs:[0], eax + mov [ebp+var_10], esp + mov eax, [ebp+progress] + mov ecx, [ebp+pOutSize] + mov edx, [ebp+pInSize] + push eax + mov eax, [ebp+pOutStream] + push ecx + mov ecx, [ebp+pInStream] + push edx + push eax + push ecx + mov ecx, [ebp+pThis] + mov [ebp+var_4], 0 + call CEncoder_CodeReal + mov ecx, [ebp+var_C] + mov dword ptr fs:[0], ecx + pop ecx + pop edi + pop esi + pop ebx + mov esp, ebp + pop ebp + retn 18h +CEncoder_Code endp + +; --------------------------------------------------------------------------- + +loc_4DA0FB: ; DATA XREF: Compress_lzma_internal+2o + mov edx, [esp+8] + lea eax, [edx-5Ch] + mov ecx, [edx-60h] + xor ecx, eax + call sub_4A0686 + mov eax, 0 ; offset dword_526E44 + int 3; +; jmp ___CxxFrameHandler3 + +loc_4DA0C9: ; DATA XREF: sub_4CF810+2o + mov edx, [esp+8] + lea eax, [edx-0Ch] + mov ecx, [edx-10h] + xor ecx, eax + call sub_4A0686 + mov eax, 0 ; offset dword_526E18 + int 3; +; jmp ___CxxFrameHandler3 + +loc_4DA128: ; DATA XREF: CEncoder_CodeReal+2o + mov edx, [esp+8] + lea eax, [edx-20h] + mov ecx, [edx-24h] + xor ecx, eax + call sub_4A0686 + mov eax, 0 ; offset unk_526E70 + int 3; +; jmp ___CxxFrameHandler3 + +loc_4DA150: ; DATA XREF: CEncoder_Code+5o + mov edx, [esp+8] + lea eax, [edx+0Ch] + mov ecx, [edx-18h] + xor ecx, eax + call sub_4A0686 + mov eax, 0 ; offset unk_526ED8 + int 3; +; jmp ___CxxFrameHandler3 + +END |
