Advertisement
fastman92

SCMlimits.cpp

Feb 22nd, 2015
343
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.76 KB | None | 0 0
  1. #include "SCMlimits.h"
  2. #include "LimitAdjuster.h"
  3.  
  4. namespace Game_GTASA
  5. {
  6.     unsigned int SCMlimits::iMAINsegmentSize = 200000; 
  7.     unsigned int SCMlimits::iMissionSize = 69000;
  8.     unsigned __int8* SCMlimits::CTheScripts__ScriptSpace = (unsigned __int8*)0xA49960;
  9.  
  10.     // Returns script space size
  11.     unsigned int SCMlimits::GetScriptSpaceSize()
  12.     {
  13.         return SCMlimits::iMAINsegmentSize + SCMlimits::iMissionSize;
  14.     }
  15.  
  16.     // Sets max size of main.scm
  17.     void SCMlimits::SetMaxMAINsegmentSize(int maxMAINsegmentSize)
  18.     {
  19.         SCMlimits::iMAINsegmentSize = maxMAINsegmentSize;
  20.     }
  21.  
  22.     // Sets max size of mission
  23.     void SCMlimits::SetMaxMissionSize(int iMaxMissionSize)
  24.     {
  25.         SCMlimits::iMissionSize = iMaxMissionSize;
  26.     }
  27.  
  28.     // Patches script space limits, should be executed when limits are set.
  29.     void SCMlimits::PatchScriptLimits()
  30.     {
  31.         // CPatch::EnableDebugMode();
  32.  
  33.         if(CPatch::IsDebugModeActive())
  34.         {
  35.             SCMlimits::iMAINsegmentSize = 200000;
  36.             SCMlimits::iMissionSize = 69000;
  37.         }
  38.         else
  39.         {
  40.             if(SCMlimits::iMAINsegmentSize == 200000
  41.                 && SCMlimits::iMissionSize == 69000)
  42.                 return;
  43.         }
  44.  
  45.         // See if sizes are multiplies of 4
  46.         if (SCMlimits::iMAINsegmentSize % 4 != 0 || SCMlimits::iMissionSize % 4 != 0)
  47.         {          
  48.             printf_MessageBox(
  49.                 "'Max size of MAIN segment' and 'Max mission size' have to be multiplies of 4\n"
  50.                 "Given values:\n"
  51.                 "SCMlimits::iMAINsegmentSize = %d\n"
  52.                 "SCMlimits::iMissionSize = %d",
  53.  
  54.                 SCMlimits::iMAINsegmentSize,
  55.                 SCMlimits::iMissionSize
  56.  
  57.                 );
  58.            
  59.             pLimitAdjuster -> TerminateProcess();
  60.         }
  61.        
  62.         unsigned int ScriptSpaceSize = SCMlimits::GetScriptSpaceSize();
  63.  
  64.         if(ScriptSpaceSize > 269000)
  65.             SCMlimits::CTheScripts__ScriptSpace = new unsigned __int8[ScriptSpaceSize];
  66.  
  67.         // Patch references to CTheScripts::ScriptSpace
  68.         #if TRUE
  69.         {
  70.             CPatch::PatchPointer(0x44CA42 + 2, CTheScripts__ScriptSpace);   // mov     edx, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[eax]; CTheScripts::ScriptSpace
  71.             CPatch::PatchPointer(0x44CA92 + 2, CTheScripts__ScriptSpace);   // mov     eax, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[eax]; CTheScripts::ScriptSpace
  72.             CPatch::PatchPointer(0x44CAB1 + 2, CTheScripts__ScriptSpace);   // mov     esi, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[esi]; CTheScripts::ScriptSpace
  73.             CPatch::PatchPointer(0x44CB36 + 2, CTheScripts__ScriptSpace);   // mov     ecx, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[edi]; CTheScripts::ScriptSpace
  74.             CPatch::PatchPointer(0x44CB58 + 2, CTheScripts__ScriptSpace);   // mov     dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[edi], ecx; CTheScripts::ScriptSpace
  75.             CPatch::PatchPointer(0x44CB60 + 2, CTheScripts__ScriptSpace);   // mov     ecx, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[eax]; CTheScripts::ScriptSpace
  76.             CPatch::PatchPointer(0x44CB6B + 2, CTheScripts__ScriptSpace);   // mov     dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[eax], 0; CTheScripts::ScriptSpace
  77.             CPatch::PatchPointer(0x44CBAD + 2, CTheScripts__ScriptSpace);   // mov     dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[edi], ecx; CTheScripts::ScriptSpace
  78.             CPatch::PatchPointer(0x463DAD + 1, CTheScripts__ScriptSpace);   // add     eax, offset _ZN11CTheScripts11ScriptSpaceE; CTheScripts::ScriptSpace
  79.             CPatch::PatchPointer(0x463E00 + 3, CTheScripts__ScriptSpace);   // lea     eax, _ZN11CTheScripts11ScriptSpaceE[ecx+edx*8]; CTheScripts::ScriptSpace
  80.             CPatch::PatchPointer(0x463E38 + 3, CTheScripts__ScriptSpace);   // lea     edx, _ZN11CTheScripts11ScriptSpaceE[eax+ecx]; CTheScripts::ScriptSpace
  81.             CPatch::PatchPointer(0x463E51 + 3, CTheScripts__ScriptSpace);   // lea     eax, _ZN11CTheScripts11ScriptSpaceE[ecx+edx]; CTheScripts::ScriptSpace
  82.             CPatch::PatchPointer(0x463FC7 + 2, CTheScripts__ScriptSpace);   // add     ecx, offset _ZN11CTheScripts11ScriptSpaceE; CTheScripts::ScriptSpace
  83.             CPatch::PatchPointer(0x463FE9 + 1, CTheScripts__ScriptSpace);   // add     eax, offset _ZN11CTheScripts11ScriptSpaceE; CTheScripts::ScriptSpace
  84.             CPatch::PatchPointer(0x4640DE + 2, CTheScripts__ScriptSpace);   // mov     edx, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[eax]; CTheScripts::ScriptSpace
  85.             CPatch::PatchPointer(0x464159 + 2, CTheScripts__ScriptSpace);   // mov     edx, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[edx]; CTheScripts::ScriptSpace
  86.             CPatch::PatchPointer(0x464165 + 3, CTheScripts__ScriptSpace);   // mov     edx, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[eax+edx*4]; CTheScripts::ScriptSpace
  87.             CPatch::PatchPointer(0x464191 + 3, CTheScripts__ScriptSpace);   // mov     edx, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[eax+edx*4]; CTheScripts::ScriptSpace
  88.             CPatch::PatchPointer(0x4641BA + 2, CTheScripts__ScriptSpace);   // mov     edx, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[edx]; CTheScripts::ScriptSpace
  89.             CPatch::PatchPointer(0x46429A + 2, CTheScripts__ScriptSpace);   // mov     eax, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[eax]; CTheScripts::ScriptSpace
  90.             CPatch::PatchPointer(0x464310 + 3, CTheScripts__ScriptSpace);   // mov     eax, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[eax+edx*4]; CTheScripts::ScriptSpace
  91.             CPatch::PatchPointer(0x4643C0 + 2, CTheScripts__ScriptSpace);   // mov     dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[eax], edx; CTheScripts::ScriptSpace
  92.             CPatch::PatchPointer(0x464412 + 2, CTheScripts__ScriptSpace);   // mov     edx, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[edx]; CTheScripts::ScriptSpace
  93.             CPatch::PatchPointer(0x464420 + 3, CTheScripts__ScriptSpace);   // mov     dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[eax+edx*4], esi; CTheScripts::ScriptSpace
  94.             CPatch::PatchPointer(0x46444C + 3, CTheScripts__ScriptSpace);   // mov     dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[eax+edx*4], esi; CTheScripts::ScriptSpace
  95.             CPatch::PatchPointer(0x464473 + 2, CTheScripts__ScriptSpace);   // mov     edx, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[edx]; CTheScripts::ScriptSpace
  96.             CPatch::PatchPointer(0x464555 + 2, CTheScripts__ScriptSpace);   // mov     edx, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[eax]; CTheScripts::ScriptSpace
  97.             CPatch::PatchPointer(0x4645D0 + 2, CTheScripts__ScriptSpace);   // mov     edx, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[edx]; CTheScripts::ScriptSpace
  98.             CPatch::PatchPointer(0x4645DC + 3, CTheScripts__ScriptSpace);   // mov     edx, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[eax+edx*4]; CTheScripts::ScriptSpace
  99.             CPatch::PatchPointer(0x464608 + 3, CTheScripts__ScriptSpace);   // mov     edx, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[eax+edx*4]; CTheScripts::ScriptSpace
  100.             CPatch::PatchPointer(0x464631 + 2, CTheScripts__ScriptSpace);   // mov     edx, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[edx]; CTheScripts::ScriptSpace
  101.             CPatch::PatchPointer(0x4647CA + 1, CTheScripts__ScriptSpace);   // add     eax, offset _ZN11CTheScripts11ScriptSpaceE; CTheScripts::ScriptSpace
  102.             CPatch::PatchPointer(0x46482A + 3, CTheScripts__ScriptSpace);   // lea     eax, _ZN11CTheScripts11ScriptSpaceE[ecx+edx]; CTheScripts::ScriptSpace
  103.             CPatch::PatchPointer(0x464846 + 3, CTheScripts__ScriptSpace);   // lea     eax, _ZN11CTheScripts11ScriptSpaceE[eax+ecx*8]; CTheScripts::ScriptSpace
  104.             CPatch::PatchPointer(0x46485D + 3, CTheScripts__ScriptSpace);   // lea     eax, _ZN11CTheScripts11ScriptSpaceE[edx+eax*4]; CTheScripts::ScriptSpace
  105.             CPatch::PatchPointer(0x466834 + 2, CTheScripts__ScriptSpace);   // lea     eax, _ZN11CTheScripts11ScriptSpaceE[eax]; CTheScripts::ScriptSpace
  106.             CPatch::PatchPointer(0x468D5D + 1, CTheScripts__ScriptSpace);   // mov     edi, offset _ZN11CTheScripts11ScriptSpaceE; CTheScripts::ScriptSpace
  107.             CPatch::PatchPointer(0x468E79 + 1, CTheScripts__ScriptSpace);   // push    offset _ZN11CTheScripts11ScriptSpaceE; CTheScripts::ScriptSpace
  108.             CPatch::PatchPointer(0x468ED5 + 1, CTheScripts__ScriptSpace);   // push    offset _ZN11CTheScripts11ScriptSpaceE; CTheScripts::ScriptSpace
  109.             CPatch::PatchPointer(0x469448 + 2, CTheScripts__ScriptSpace);   // lea     ecx, _ZN11CTheScripts11ScriptSpaceE[eax]; CTheScripts::ScriptSpace
  110.             CPatch::PatchPointer(0x5D4C43 + 1, CTheScripts__ScriptSpace + 3);   // mov     eax, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE+3
  111.             CPatch::PatchPointer(0x5D4C92 + 2, CTheScripts__ScriptSpace);   // lea     ecx, _ZN11CTheScripts11ScriptSpaceE[edi]; CTheScripts::ScriptSpace
  112.             CPatch::PatchPointer(0x5D4CAF + 2, CTheScripts__ScriptSpace);   // lea     edx, _ZN11CTheScripts11ScriptSpaceE[edi]; CTheScripts::ScriptSpace
  113.             CPatch::PatchPointer(0x5D4F6A + 1, CTheScripts__ScriptSpace);   // sub     eax, offset _ZN11CTheScripts11ScriptSpaceE; CTheScripts::ScriptSpace
  114.             CPatch::PatchPointer(0x5D4F92 + 1, CTheScripts__ScriptSpace);   // sub     eax, offset _ZN11CTheScripts11ScriptSpaceE; CTheScripts::ScriptSpace
  115.             CPatch::PatchPointer(0x5D5020 + 2, CTheScripts__ScriptSpace);   // lea     ecx, _ZN11CTheScripts11ScriptSpaceE[edi]; CTheScripts::ScriptSpace
  116.             CPatch::PatchPointer(0x5D503D + 2, CTheScripts__ScriptSpace);   // lea     edx, _ZN11CTheScripts11ScriptSpaceE[edi]; CTheScripts::ScriptSpace
  117.             CPatch::PatchPointer(0x5D534F + 2, CTheScripts__ScriptSpace);   // lea     eax, _ZN11CTheScripts11ScriptSpaceE[edx]; CTheScripts::ScriptSpace
  118.             CPatch::PatchPointer(0x5D537E + 2, CTheScripts__ScriptSpace);   // lea     edx, _ZN11CTheScripts11ScriptSpaceE[eax]; CTheScripts::ScriptSpace
  119.             CPatch::PatchPointer(0x15620C3 + 2, CTheScripts__ScriptSpace);  // lea     eax, _ZN11CTheScripts11ScriptSpaceE[eax]; CTheScripts::ScriptSpace
  120.             CPatch::PatchPointer(0x1564F1E + 2, CTheScripts__ScriptSpace);  // mov     ecx, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[eax]; CTheScripts::ScriptSpace
  121.             CPatch::PatchPointer(0x1564FB2 + 2, CTheScripts__ScriptSpace);  // mov     dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[edx], 0; CTheScripts::ScriptSpace
  122.             CPatch::PatchPointer(0x1565610 + 1, CTheScripts__ScriptSpace);  // push    offset _ZN11CTheScripts11ScriptSpaceE; CTheScripts::ScriptSpace
  123.             CPatch::PatchPointer(0x1565E20 + 1, CTheScripts__ScriptSpace+3);    // mov     eax, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE+3
  124.             CPatch::PatchPointer(0x1565E25 + 2, CTheScripts__ScriptSpace + 3);  // mov     eax, dword ptr ds:(_ZN11CTheScripts11ScriptSpaceE+3)[eax]
  125.             CPatch::PatchPointer(0x1565E2B + 1, CTheScripts__ScriptSpace + 8);  // add     eax, (offset _ZN11CTheScripts11ScriptSpaceE+8)
  126.             CPatch::PatchPointer(0x1569FF2 + 2, CTheScripts__ScriptSpace);  // mov     ecx, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[eax]; CTheScripts::ScriptSpace
  127.             CPatch::PatchPointer(0x156A082 + 2, CTheScripts__ScriptSpace);  // mov     eax, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[eax]; CTheScripts::ScriptSpace
  128.             CPatch::PatchPointer(0x156A09F + 2, CTheScripts__ScriptSpace);  // mov     ebx, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[eax]; CTheScripts::ScriptSpace
  129.             CPatch::PatchPointer(0x156AA19 + 2, CTheScripts__ScriptSpace);  // cmp     dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[eax], 1; CTheScripts::ScriptSpace
  130.             CPatch::PatchPointer(0x156E375 + 2, CTheScripts__ScriptSpace);  // mov     edx, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[edx]; CTheScripts::ScriptSpace
  131.             CPatch::PatchPointer(0x156F378 + 2, CTheScripts__ScriptSpace);  // mov     edx, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE[edx]; CTheScripts::ScriptSpace
  132.             CPatch::PatchPointer(0x156F453 + 1, CTheScripts__ScriptSpace + 3);  // mov     eax, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE+3
  133.             CPatch::PatchPointer(0x156F45C + 2, CTheScripts__ScriptSpace + 3);  // mov     ecx, dword ptr ds:(_ZN11CTheScripts11ScriptSpaceE+3)[eax]
  134.             CPatch::PatchPointer(0x156F462 + 2, CTheScripts__ScriptSpace + 3);  // mov     esi, dword ptr ds:(_ZN11CTheScripts11ScriptSpaceE+3)[ecx]
  135.             CPatch::PatchPointer(0x156F468 + 2, CTheScripts__ScriptSpace + 8);  // add     esi, (offset _ZN11CTheScripts11ScriptSpaceE+8)
  136.             CPatch::PatchPointer(0x156F5A0 + 2, CTheScripts__ScriptSpace + 3);  // mov     ecx, dword ptr ds:_ZN11CTheScripts11ScriptSpaceE+3
  137.             CPatch::PatchPointer(0x156F5A6 + 3, CTheScripts__ScriptSpace + 8);  // mov     ax, word ptr ds:(_ZN11CTheScripts11ScriptSpaceE+8)[ecx]
  138.             CPatch::PatchPointer(0x156F5AD + 2, CTheScripts__ScriptSpace + 8);  // lea     ecx, (_ZN11CTheScripts11ScriptSpaceE+8)[ecx]
  139.         }
  140.         #endif
  141.  
  142.         // Patch sizes of MAIN segment size
  143.         #if TRUE
  144.         {
  145.             CPatch::PatchDWORD(0x468E74 + 1, iMAINsegmentSize); // push    200000          ; len
  146.             CPatch::PatchDWORD(0x468ECE + 1, iMAINsegmentSize); // push    200000          ; len
  147.         }
  148.         #endif
  149.  
  150.         // Patch references to CTheScripts::ScriptSpace + iMissionSize
  151.         #if TRUE
  152.         {
  153.             CPatch::PatchPointer(0x4899D6 + 1, CTheScripts__ScriptSpace + iMAINsegmentSize);    // push    offset unk_A7A6A0
  154.             CPatch::PatchPointer(0x4899F5 + 1, CTheScripts__ScriptSpace + iMAINsegmentSize);    // push    offset unk_A7A6A0
  155.             CPatch::PatchPointer(0x489A0B + 3, CTheScripts__ScriptSpace + iMAINsegmentSize);    // mov     dword ptr [eax+10h], offset unk_A7A6A0
  156.             CPatch::PatchPointer(0x489A5F + 1, CTheScripts__ScriptSpace + iMAINsegmentSize);    // push    offset unk_A7A6A0
  157.             CPatch::PatchPointer(0x489A75 + 1, CTheScripts__ScriptSpace + iMAINsegmentSize);    // push    offset unk_A7A6A0
  158.             CPatch::PatchPointer(0x489A8B + 3, CTheScripts__ScriptSpace + iMAINsegmentSize);    // mov     dword ptr [eax+10h], offset unk_A7A6A0
  159.         }
  160.         #endif
  161.  
  162.         // Patch sizes of mission space
  163.         #if TRUE
  164.         {
  165.             CPatch::PatchDWORD(0x4899D1 + 1, iMissionSize); // push    69000
  166.             CPatch::PatchDWORD(0x489A5A + 1, iMissionSize); // push    69000
  167.              
  168.         }
  169.         #endif
  170.  
  171.         // Patch sizes of CTheScripts::ScriptSpace
  172.         #if TRUE
  173.         {
  174.             CPatch::PatchDWORD(
  175.                 0x401CF8 + 1,
  176.                 ScriptSpaceSize / sizeof(DWORD)
  177.                 );  // mov     ecx, 106B2h
  178.  
  179.         }
  180.         #endif
  181.  
  182.         CPatch::DisableDebugMode();
  183.         CGenericLogStorage::SaveFormattedTextLn(
  184.             "Modified SCM limits:\n"
  185.             " - max size of MAIN segment from main.scm: %d bytes\n"
  186.             " - max size of mission from main.scm: %d bytes\n"
  187.             "Total size of CTheScripts::ScriptSpace: %d bytes"
  188.             ,
  189.             SCMlimits::iMAINsegmentSize,
  190.             SCMlimits::iMissionSize,
  191.             ScriptSpaceSize);
  192.         CGenericLogStorage::WriteLineSeparator();
  193.     }
  194. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement