Advertisement
Miseryk

C++ Vector Enhancement

Apr 6th, 2021
604
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 13.00 KB | None | 0 0
  1. /*
  2. Debug it to understand it, else it will crash and you won't get it why, you must restore the struct to avoid STL crash so can clean it when leave scope, also it was made for int (4 bytes) so you would have to replace the ASM part in Erase_By1_position (rep mosvd) and few things more, it is a sample to show you how you can do it, you loose memory or processing, your choice.
  3. */
  4.  
  5. #include <iostream>
  6. #include <Windows.h>
  7. #include <vector>
  8. #include <list>
  9.  
  10. enum eModes
  11. {
  12.     m_1b = 1,
  13.     m_2b = m_1b * 2,
  14.     m_4b = m_2b * 2,
  15.     m_8b = m_4b * 2
  16. };
  17.  
  18. //testing purposes, did not use it
  19. _declspec(naked) void M_memsetx4(DWORD Dest, DWORD Orig, DWORD zSize, DWORD Rev)
  20. {
  21.     _asm
  22.     {
  23.         push ebp
  24.         mov ebp, esp
  25.         sub esp, __LOCAL_SIZE
  26.  
  27.         nop
  28.         int 3
  29.         nop
  30.  
  31.         mov eax, Rev
  32.         test eax, eax
  33.         je _clear
  34.         std
  35.         jmp _logic
  36.  
  37.     _clear:
  38.         cld
  39.     _logic :
  40.         mov ecx, zSize
  41.         mov esi, Orig
  42.         mov edi, Dest
  43.         rep movsd
  44.  
  45.         mov esp, ebp
  46.         pop ebp
  47.         ret
  48.     }
  49. }
  50.  
  51. //testing purposes, did not use it
  52. _declspec(naked) void M_memsetx1(DWORD Dest, DWORD Orig, DWORD zSize, DWORD Rev)
  53. {
  54.     _asm
  55.     {
  56.         push ebp
  57.         mov ebp, esp
  58.         ; sub esp, __LOCAL_SIZE
  59.  
  60.         nop
  61.         int 3
  62.         nop
  63.  
  64.         mov eax, Rev
  65.         test eax, eax
  66.         je _clear
  67.         std
  68.         jmp _logic
  69.  
  70.     _clear :
  71.         cld
  72.     _logic :
  73.         mov ecx, zSize
  74.         mov esi, Orig
  75.         mov edi, Dest
  76.         rep movsb
  77.  
  78.         mov esp, ebp
  79.         pop ebp
  80.         ret
  81.     }
  82. }
  83.  
  84. //testing purposes, did not use it
  85. _declspec(naked) void asmfunc(DWORD Dest, DWORD Orig, DWORD zSize, DWORD Block)
  86. {
  87.     _asm
  88.     {
  89.         push ebp
  90.         mov ebp, esp
  91.         ; sub esp, __LOCAL_SIZE
  92.  
  93.         cld
  94.         mov ecx, zSize
  95.         mov esi, Orig
  96.         mov edi, Dest
  97.  
  98.         cmp Block, 0x4
  99.         jne _check_21
  100.         rep movsd
  101.         jmp _pass
  102.  
  103.     _check_21 :
  104.         cmp Block, 0x2
  105.         jne _check_1
  106.         rep movsw
  107.         jmp _pass
  108.  
  109.     _check_1 :
  110.         rep movsb
  111.  
  112.     _pass :
  113.         mov esp, ebp
  114.         pop ebp
  115.         ret
  116.     }
  117. }
  118.  
  119. //testing purposes, did not use it
  120. void WINAPI M_memset(DWORD Dest, DWORD Orig, DWORD zSize, bool Rev)
  121. {
  122.     /*eModes Mode = eModes::m_2b; //movsw
  123.  
  124.     if (zSize % 2 == 1)
  125.     {
  126.         Mode = eModes::m_1b; //movsb
  127.     }
  128.     else if (zSize % 8 == 0)
  129.     {
  130.         Mode = eModes::m_8b; //movsq
  131.     }
  132.     else if (zSize % 4 == 0)
  133.     {
  134.         Mode = eModes::m_4b; //movsd
  135.     }
  136.  
  137.     if (Mode == eModes::m_8b) Mode = eModes::m_4b;*/
  138.  
  139.     DWORD HardBlock;
  140.     DWORD HardBlock_Mod;
  141.  
  142.     HardBlock = (int)(zSize / 4);
  143.     HardBlock_Mod = zSize % 4;
  144.  
  145.     std::cout << "HardBlock: " << HardBlock << " (0x" << std::hex << HardBlock << ")" << std::endl;
  146.     std::cout << "HardBlock_Mod: " << HardBlock_Mod << " (0x" << std::hex << HardBlock_Mod << ")" << std::endl;
  147.     std::cout << std::hex << "Dest: " << Dest << std::endl;
  148.     std::cout << std::hex << "Orig: " << Orig << std::endl;
  149.     std::cout << std::hex << "zSize: " << zSize << std::endl;
  150.  
  151.     if (HardBlock > 0)
  152.     {
  153.         std::cout << "HardBlock" << std::endl;
  154.         std::cin.get();
  155.  
  156.         M_memsetx4(Dest, Orig, HardBlock, Rev);
  157.         if (HardBlock_Mod > 0) M_memsetx1(Orig, Dest, HardBlock_Mod, Rev);
  158.     }
  159.     else
  160.     {
  161.         std::cout << "By BYTE" << std::endl;
  162.         std::cin.get();
  163.  
  164.         if (HardBlock_Mod > 0) M_memsetx1(Dest, Orig, HardBlock_Mod, Rev);
  165.     }
  166.     /*std::cout << std::hex << "Dest: " << Dest << std::endl;
  167.     std::cout << std::hex << "Orig: " << Orig << std::endl;*/
  168.  
  169.     /*std::cin.get();
  170.     __asm
  171.     {
  172.         nop
  173.         int 3
  174.         nop
  175.     }*/
  176.     //asmfunc(Dest, Orig, zSize / Mode, Mode);
  177.     /*__asm
  178.     {
  179.         nop
  180.         int 3
  181.         nop
  182.     }*/
  183. }
  184.  
  185. //testing purposes, did not use it
  186. void WINAPI M_memset2_Rev(DWORD Dest, DWORD Orig, DWORD zSize)
  187. {
  188.     for (int i = 0; i < zSize; i++)
  189.     {
  190.         /*std::cout << std::hex << "Dest: " << Dest << std::endl;
  191.         std::cout << std::hex << "Orig: " << Orig << std::endl;
  192.  
  193.         std::cin.get();*/
  194.  
  195.         *(DWORD*)Dest = *(DWORD*)Orig;
  196.         Dest -= 4;
  197.         Orig -= 4;
  198.     }
  199.  
  200.     //std::cout << "OUT" << std::endl;
  201.     //std::cin.get();
  202. }
  203.  
  204. //testing purposes, did not use it
  205. void WINAPI M_memset2(DWORD Dest, DWORD Orig, DWORD zSize)
  206. {
  207.     for (int i = 0; i < zSize; i++)
  208.     {
  209.         /*std::cout << std::hex << "Dest: " << Dest << std::endl;
  210.         std::cout << std::hex << "Orig: " << Orig << std::endl;
  211.  
  212.         std::cin.get();*/
  213.  
  214.         *(DWORD*)Dest = *(DWORD*)Orig;
  215.         Dest += 4;
  216.         Orig += 4;
  217.     }
  218.  
  219.     //std::cout << "OUT" << std::endl;
  220.     //std::cin.get();
  221. }
  222.  
  223. DWORD ReadInProcessDWORD(DWORD Address)
  224. {
  225.     return *(DWORD*)Address;
  226. }
  227.  
  228. enum eMode
  229. {
  230.     eVector,
  231.     eList
  232. };
  233.  
  234. eMode ArrayMode;
  235.  
  236. void PushAmount(std::vector<int>& vVector, std::list<int>& vList, DWORD vSize)
  237. {
  238.     switch (ArrayMode)
  239.     {
  240.         case eMode::eVector:
  241.             for (DWORD i = 0; i < vSize; i++)
  242.             {
  243.                 vVector.push_back(i);
  244.             }
  245.  
  246.             break;
  247.         case eMode::eList:
  248.             for (DWORD i = 0; i < vSize; i++)
  249.             {
  250.                 vList.push_back(i);
  251.             }
  252.  
  253.             break;
  254.         default:
  255.             break;
  256.     }
  257. }
  258.  
  259. void Erase_By1_position(std::vector<int>& vVector, std::list<int>& vList, double vIndexPercent, DWORD vTimes, BOOL Enhancement = FALSE)
  260. {
  261.     DWORD Dest;
  262.     DWORD Orig;
  263.     DWORD zSize;
  264.     DWORD Address;
  265.     DWORD BkVal;
  266.     std::list<int>::iterator it1;
  267.     int mid;
  268.  
  269.     Address = (DWORD)&vVector;
  270.     BkVal = *(DWORD*)(Address);
  271.  
  272.     switch (ArrayMode)
  273.     {
  274.         case eMode::eVector:
  275.             for (int i = vTimes; i > 0; i--)
  276.             {
  277.                 if (vIndexPercent == 0)
  278.                 {
  279.                     if (Enhancement)
  280.                     {
  281.                         *(DWORD*)(Address) += 0x04;
  282.                     }
  283.                     else
  284.                     {
  285.                         vVector.erase(vVector.begin());
  286.                     }
  287.                 }
  288.                 else
  289.                 {
  290.                     if (vIndexPercent == 1)
  291.                     {
  292.                         vVector.erase(vVector.end() - 1);
  293.                     }
  294.                     else
  295.                     {
  296.                         if (Enhancement)
  297.                         {
  298.                             mid = (int)((vVector.size() - 1) * vIndexPercent);
  299.  
  300.                             //std::cout << "mid: " << mid << std::endl;
  301.  
  302.                             mid++;
  303.  
  304.                             if (vIndexPercent >= 0.50)
  305.                             {
  306.                                 //M_memset2((*(DWORD*)(Address)) + (mid * sizeof(int)), (*(DWORD*)(Address)) + ((mid + 1) * sizeof(int)), (vVector.size() - 1) - mid);
  307.  
  308.                                 Dest = (*(DWORD*)(Address)) + (mid * sizeof(int));
  309.                                 Orig = (*(DWORD*)(Address)) + ((mid + 1) * sizeof(int));
  310.                                 zSize = (vVector.size() - 1) - mid;
  311.  
  312.                                 /*std::cout << std::hex << "Dest: " << Dest << std::endl;
  313.                                 std::cout << std::hex << "Orig: " << Orig << std::endl;
  314.                                 std::cout << std::hex << "zSize: " << zSize << std::endl;
  315.  
  316.                                 std::cin.get();*/
  317.  
  318.                                 /*for (int i = 0; i < zSize; i++)
  319.                                 {
  320.                                     *(DWORD*)Dest = *(DWORD*)Orig;
  321.                                     Dest += 4;
  322.                                     Orig += 4;
  323.                                 }*/
  324.  
  325.                                 __asm
  326.                                 {
  327.                                     push ecx
  328.                                     push esi
  329.                                     push edi
  330.                                     pushfd
  331.  
  332.                                     cld
  333.                                     mov ecx, zSize
  334.                                     mov edi, Dest
  335.                                     mov esi, Orig
  336.                                     rep movsd
  337.  
  338.                                     popfd
  339.                                     pop edi
  340.                                     pop esi
  341.                                     pop ecx
  342.                                 }
  343.  
  344.                                 *(DWORD*)(Address + 0x4) -= 0x04;
  345.                             }
  346.                             else
  347.                             {
  348.                                 //M_memset((*(DWORD*)(Address)) + (mid * sizeof(int)), (*(DWORD*)(Address)) + ((mid - 1) * sizeof(int)), (mid - 1) * sizeof(int), true);
  349.                                 //M_memset2_Rev((*(DWORD*)(Address)) + (mid * sizeof(int)), (*(DWORD*)(Address)) + ((mid - 1) * sizeof(int)), mid);
  350.  
  351.                                 Dest = (*(DWORD*)(Address)) + (mid * sizeof(int));
  352.                                 Orig = (*(DWORD*)(Address)) + ((mid - 1) * sizeof(int));
  353.                                 zSize = mid;
  354.  
  355.                                 /*std::cout << std::hex << "Dest: " << Dest << std::endl;
  356.                                 std::cout << std::hex << "Orig: " << Orig << std::endl;
  357.                                 std::cout << std::hex << "zSize: " << zSize << std::endl;
  358.  
  359.                                 std::cin.get();*/
  360.  
  361.                                 /*for (int i = 0; i < zSize; i++)
  362.                                 {
  363.                                     *(DWORD*)Dest = *(DWORD*)Orig;
  364.                                     Dest -= 4;
  365.                                     Orig -= 4;
  366.                                 }*/
  367.  
  368.                                 __asm
  369.                                 {
  370.                                     push ecx
  371.                                     push esi
  372.                                     push edi
  373.                                     pushfd
  374.  
  375.                                     std
  376.                                     mov ecx, zSize
  377.                                     mov edi, Dest
  378.                                     mov esi, Orig
  379.                                     rep movsd
  380.  
  381.                                     popfd
  382.                                     pop edi
  383.                                     pop esi
  384.                                     pop ecx
  385.                                 }
  386.  
  387.                                 *(DWORD*)(Address) += 0x04;
  388.                             }
  389.                         }
  390.                         else
  391.                         {
  392.                             mid = (int)((vVector.size() - 1) * vIndexPercent);
  393.                             vVector.erase(vVector.begin() + mid);
  394.                         }
  395.                     }
  396.                 }
  397.             }
  398.  
  399.             break;
  400.         case eMode::eList:
  401.             for (int i = vTimes; i > 0; i--)
  402.             {
  403.                 if (vIndexPercent == 0)
  404.                 {
  405.                     vList.pop_front(); //tList.erase(tList.begin()); //could be both
  406.                 }
  407.                 else
  408.                 {
  409.                     if (vIndexPercent == 1)
  410.                     {
  411.                         it1 = vList.end();
  412.                         --it1;
  413.                         vList.erase(it1);
  414.                     }
  415.                     else
  416.                     {
  417.                         it1 = vList.begin();
  418.                         mid = (int)((vList.size() - 1) * vIndexPercent);
  419.                         std::advance(it1, mid);
  420.                         vList.erase(it1);
  421.                     }
  422.                 }
  423.             }
  424.  
  425.             break;
  426.         default:
  427.             break;
  428.     }
  429. }
  430.  
  431. int main()
  432. {
  433.     ArrayMode = eMode::eVector;
  434.  
  435.     std::list<int> tList;
  436.     //std::vector<int> tVec;
  437.     std::vector<int> tVec;
  438.     //std::vector<int>* tVec = new std::vector<int>;
  439.     DWORD Address;
  440.     DWORD BkVal;
  441.  
  442.     std::cin.get();
  443.  
  444.     DWORD GTC = GetTickCount();
  445.  
  446.     DWORD zSize = 0x05000000; //0x05000000;
  447.  
  448.     PushAmount(tVec, tList, zSize);
  449.  
  450.     if (tList.size() > 0) std::cout << tList.size() << " => " << GetTickCount() - GTC << std::endl;
  451.     if (tVec.size() > 0) std::cout << tVec.size() << " => " << GetTickCount() - GTC << std::endl;
  452.  
  453.     Address = (DWORD)&tVec;
  454.     BkVal = *(DWORD*)(Address);
  455.  
  456.     //std::cout << std::hex << &tVec << std::endl;
  457.     //std::cout << std::hex << ReadInProcessDWORD(Address) << std::endl;
  458.  
  459.     //Address = ReadInProcessDWORD(Address);
  460.  
  461.     //std::cin.get();
  462.  
  463.     /*tVec->erase(tVec->begin());
  464.  
  465.     std::cin.get();*/
  466.  
  467.     //std::cout << std::hex << &tVec << std::endl;
  468.  
  469.     int TotSize = zSize / 0x010000;
  470.  
  471.     /* 0%
  472.     Vector:
  473.                 83886080 => 359
  474.                 83884800 => 48187
  475.  
  476.             Enhancement
  477.                 83886080 => 312
  478.                 83884800 => 312
  479.     List:
  480.                 83886080 => 4156
  481.                 83884800 => 4156
  482.     */
  483.     Erase_By1_position(tVec, tList, 0, TotSize, TRUE);
  484.  
  485.     /* 3%
  486.     Vector:
  487.                 83886080 => 359
  488.                 83884800 => 48343
  489.  
  490.             Enhancement
  491.                 83886080 => 313
  492.                 83884800 => 1938
  493.     List:
  494.                 83886080 => 4156
  495.                 83884800 => 14203
  496.     */
  497.     //Erase_By1_position(tVec, tList, 0.03, TotSize);
  498.  
  499.     /* 5%
  500.     Vector:
  501.                 83886080 => 344
  502.                 83884800 => 46078
  503.  
  504.             Enhancement
  505.                 83886080 => 312
  506.                 83884800 => 3015
  507.     List:
  508.                 83886080 => 4234
  509.                 83884800 => 20719
  510.     */
  511.     //Erase_By1_position(tVec, tList, 0.05, TotSize);
  512.  
  513.     /* 10%
  514.     Vector:
  515.                 83886080 => 344
  516.                 83884800 => 43922
  517.  
  518.             Enhancement
  519.                 83886080 => 313
  520.                 83884800 => 5688
  521.     List:
  522.                 83886080 => 4218
  523.                 83884800 => 37797
  524.     */
  525.     //Erase_By1_position(tVec, tList, 0.10, TotSize);
  526.  
  527.     /* 15%
  528.     Vector:
  529.                 83886080 => 344
  530.                 83884800 => 42000
  531.  
  532.             Enhancement
  533.                 83886080 => 312
  534.                 83884800 => 8218
  535.     List:
  536.                 83886080 => 4281
  537.                 83884800 => 53140
  538.     */
  539.     //Erase_By1_position(tVec, tList, 0.15, TotSize);
  540.  
  541.     /* 25%
  542.     Vector:
  543.                 83886080 => 328
  544.                 83884800 => 35375
  545.  
  546.             Enhancement
  547.                 83886080 => 313
  548.                 83884800 => 13657
  549.     List:
  550.                 83886080 => 4125
  551.                 83884800 => 84859
  552.     */
  553.     //Erase_By1_position(tVec, tList, 0.25, TotSize);
  554.  
  555.     /* 45%
  556.     Vector:
  557.                 83886080 => 312
  558.                 83884800 => 25640
  559.  
  560.             Enhancement
  561.                 83886080 => 328
  562.                 83884800 => 24188
  563.     List:
  564.                 83886080 => 4078
  565.                 83884800 => 147860
  566.     */
  567.     //Erase_By1_position(tVec, tList, 0.45, TotSize);
  568.  
  569.     /* 50%
  570.     Vector:
  571.                 83886080 => 375
  572.                 83884800 => 23812
  573.  
  574.             Enhancement
  575.                 83886080 => 312
  576.                 83884800 => 23406
  577.     List:
  578.                 83886080 => 4468
  579.                 83884800 => 172062
  580.     */
  581.     //Erase_By1_position(tVec, tList, 0.50, TotSize);
  582.  
  583.     /* 75%
  584.     Vector:
  585.                 83886080 => 359
  586.                 83884800 => 12218
  587.  
  588.             Enhancement
  589.                 83886080 => 328
  590.                 83884800 => 11953
  591.     List:
  592.                 83886080 => 4204
  593.                 83884800 => 239954
  594.     */
  595.     //Erase_By1_position(tVec, tList, 0.75, TotSize);
  596.  
  597.     /* 85%
  598.     Vector:
  599.                 83886080 => 313
  600.                 83884800 => 7282
  601.  
  602.             Enhancement
  603.                 83886080 => 313
  604.                 83884800 => 7204
  605.     List:
  606.                 83886080 => 4157
  607.                 83884800 => 280016
  608.     */
  609.     //Erase_By1_position(tVec, tList, 0.85, TotSize);
  610.  
  611.     /* 95%
  612.     Vector:
  613.                 83886080 => 312
  614.                 83884800 => 2609
  615.  
  616.             Enhancement
  617.                 83886080 => 312
  618.                 83884800 => 2609
  619.     List:
  620.                 83886080 => 4094
  621.                 83884800 => 295234
  622.     */
  623.     //Erase_By1_position(tVec, tList, 0.95, TotSize);
  624.  
  625.     /* 100%
  626.     Vector:
  627.                 83886080 => 312
  628.                 83884800 => 312
  629.  
  630.             Enhancement
  631.                 83886080 => 313
  632.                 83884800 => 313
  633.     List:
  634.                 83886080 => 4109
  635.                 83884800 => 4109
  636.     */
  637.     //Erase_By1_position(tVec, tList, 1, TotSize);
  638.  
  639.     /*for (it1 = tList.begin(); it1 != tList.end(); ++it1)
  640.     std::cout << ' ' << *it1;*/
  641.  
  642.     //std::cout << "OUT" << std::endl;
  643.     //std::cin.get();
  644.  
  645.     //4203ms
  646.  
  647.     if (tList.size() > 0)
  648.     {
  649.         std::cout << std::dec << tList.size() << " => " << GetTickCount() - GTC << std::endl;
  650.  
  651.         std::list<int>::iterator it_begin = tList.begin();
  652.         std::list<int>::iterator it_last = tList.end();
  653.         --it_last;
  654.         std::cout << *it_begin << " - " << *it_last << std::endl;
  655.     }
  656.  
  657.     if (tVec.size() > 0)
  658.     {
  659.         std::cout << std::dec << tVec.size() << " => " << GetTickCount() - GTC << std::endl;
  660.        
  661.         std::cout << tVec[0] << " - " << tVec[tVec.size() - 1] << std::endl;
  662.         /*for (int i = 0; i < tVec.size(); i++)
  663.         {
  664.             std::cout << tVec[i] << " - ";
  665.         }*/
  666.     }
  667.  
  668.     //Misery working - Restore to avoid leak/crash
  669.     *(DWORD*)(Address) = BkVal;
  670.  
  671.     std::cin.get();
  672.  
  673.     std::cout << "clearing and shrinking" << std::endl;
  674.     tVec.clear();
  675.     tVec.shrink_to_fit();
  676.  
  677.     std::cin.get();
  678.  
  679.     return 0;
  680. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement