Advertisement
BitEmE

GTA V - ASM PPC [PS3] - Call function (not finished yet)...

Jun 22nd, 2014
424
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 10.62 KB | None | 0 0
  1. // Register natives in gta 4 (assembly x86 - win32)
  2. .text:00B82EB7                 push    offset loc_B82010    ; push the offset from the native function address
  3. .text:00B82EBC                 push    10237666h            ; push the hash code for the native function
  4. .text:00B82EC1                 call    sub_5A6200           ; register native to script machine
  5.  
  6. // Regiser natives in gta 5 (assembly ppc - ps3)
  7. seg001:003A40C8                 lis       r3, 0x30B5 # 0x30B51753 ; load immediate shift hash code from native function
  8. seg001:003A40CC                 lis       r4, MAY_FINISH_HEIST_OFFSET@h ; load immediate shift function address
  9. seg001:003A40D0                 ori       r3, r3, 0x1753 # 0x30B51753  ; OR2 0x1753 with r3 and store in r3
  10. seg001:003A40D4                 addic     r4, r4, MAY_FINISH_HEIST_OFFSET@l ; add immediate r4 with may_finish.. and store in r4
  11. seg001:003A40D8                 bl        REGISTER_NATIVE_TO_SCRIPT_MACHINE ; register native to script machine
  12.  
  13. // How to call natives in c++ (created for x86 - win32 // with ps3 addresses/offsets) - WON'T WORK - JUST AN EXAMPLE!!!
  14. enum NativeHashes {
  15.     NATIVE_FINISH_HEIST = 817174355, // 0x30B51753
  16. };
  17.  
  18. class VNativeCallContext {
  19. protected:
  20.     void * m_pReturn;              // 00-04
  21.     unsigned int m_nArgCount;      // 04-08
  22.     void * m_pArgs;                // 08-0C
  23.     unsigned int m_nDataCount;     // 0C-10
  24.     CVector3 * m_pOriginalData[4]; // 10-20
  25.     Vector4 m_TemporaryData[4];    // 20-60
  26. };
  27.  
  28. class NativeContext : public VNativeCallContext {
  29. private:
  30.     // Configuration
  31.     enum {
  32.         MaxNativeParams = 16,
  33.         ArgSize = 4,
  34.     };
  35.    
  36.     // Anything temporary that we need
  37.     unsigned char m_TempStack[MaxNativeParams * ArgSize];
  38.  
  39. public:
  40.     inline NativeContext() {
  41.         m_pArgs = &m_TempStack;
  42.         m_pReturn = &m_TempStack;
  43.         m_nArgCount = 0;
  44.         m_nDataCount = 0;
  45.     }
  46.  
  47.     template <typename T>
  48.     inline void Push(T value) {
  49.            
  50.         // Have we reached our argument count?
  51.         if(m_nArgCount == MaxNativeParams){
  52.             // We can only store 16 arguments
  53.             return;
  54.         }
  55.  
  56.         // Is the argument too big?
  57.         if(sizeof(T) > ArgSize) {
  58.             // We only accept 4 byte or less arguments
  59.             return;
  60.         }
  61.         else if(sizeof(T) < ArgSize) // Is the argument too small? {
  62.             // Reset the argument data
  63.             *(unsigned int *)(m_TempStack + ArgSize * m_nArgCount) = 0;
  64.         }
  65.  
  66.         // Add to argument to the argument stack
  67.         *(T *)(m_TempStack + ArgSize * m_nArgCount) = value;
  68.  
  69.         // Increment the total argument count
  70.         m_nArgCount++;
  71.     }
  72. };
  73.  
  74. class NativeInvoke {
  75. private:
  76.     typedef void (_cdecl * NativeCall)(VNativeCallContext * pNativeContext);
  77.  
  78.     static inline void Invoke(unsigned int uiHash, NativeContext * pNativeContext)
  79.     {
  80.         DWORD dwFunc = NULL; // TODO FIND
  81.         DWORD dwNativeFunc = NULL;
  82.        
  83.         // x86 asm - TODO: convert to ppc and find address
  84.         _asm {
  85.             push esi
  86.             mov esi, uiHash
  87.             call dwFunc
  88.             pop esi
  89.             mov dwNativeFunc, eax
  90.         }
  91.  
  92.         if(dwNativeFunc != NULL)
  93.             ((NativeCall)dwNativeFunc)(pNativeContext);
  94.     }
  95.  
  96. public:
  97.     template <typename R>
  98.     static inline R Invoke(unsigned int hash)
  99.     {
  100.         NativeContext cxt;
  101.         Invoke(hash, &cxt);
  102.         return cxt.GetResult<R>();
  103.     }
  104.  
  105.     template <typename R, typename T1>
  106.     static inline R Invoke(unsigned int hash, T1 p1)
  107.     {
  108.         NativeContext cxt;
  109.         cxt.Push(p1);
  110.         Invoke(hash, &cxt);
  111.         return cxt.GetResult<R>();
  112.     }
  113.  
  114.     template <typename R, typename T1, typename T2>
  115.     static inline R Invoke(unsigned int hash, T1 p1, T2 p2)
  116.     {
  117.         NativeContext cxt;
  118.         cxt.Push(p1);
  119.         cxt.Push(p2);
  120.         Invoke(hash, &cxt);
  121.         return cxt.GetResult<R>();
  122.     }
  123.  
  124.     template <typename R, typename T1, typename T2, typename T3>
  125.     static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3)
  126.     {
  127.         NativeContext cxt;
  128.         cxt.Push(p1);
  129.         cxt.Push(p2);
  130.         cxt.Push(p3);
  131.         Invoke(hash, &cxt);
  132.         return cxt.GetResult<R>();
  133.     }
  134.  
  135.     template <typename R, typename T1, typename T2, typename T3, typename T4>
  136.     static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4)
  137.     {
  138.         NativeContext cxt;
  139.         cxt.Push(p1);
  140.         cxt.Push(p2);
  141.         cxt.Push(p3);
  142.         cxt.Push(p4);
  143.         Invoke(hash, &cxt);
  144.         return cxt.GetResult<R>();
  145.     }
  146.  
  147.     template <typename R, typename T1, typename T2, typename T3, typename T4,
  148.         typename T5>
  149.         static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5)
  150.     {
  151.         NativeContext cxt;
  152.         cxt.Push(p1);
  153.         cxt.Push(p2);
  154.         cxt.Push(p3);
  155.         cxt.Push(p4);
  156.         cxt.Push(p5);
  157.         Invoke(hash, &cxt);
  158.         return cxt.GetResult<R>();
  159.     }
  160.  
  161.     template <typename R, typename T1, typename T2, typename T3, typename T4,
  162.         typename T5, typename T6>
  163.         static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6)
  164.     {
  165.         NativeContext cxt;
  166.         cxt.Push(p1);
  167.         cxt.Push(p2);
  168.         cxt.Push(p3);
  169.         cxt.Push(p4);
  170.         cxt.Push(p5);
  171.         cxt.Push(p6);
  172.         Invoke(hash, &cxt);
  173.         return cxt.GetResult<R>();
  174.     }
  175.  
  176.     template <typename R, typename T1, typename T2, typename T3, typename T4,
  177.         typename T5, typename T6, typename T7>
  178.         static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7)
  179.     {
  180.         NativeContext cxt;
  181.         cxt.Push(p1);
  182.         cxt.Push(p2);
  183.         cxt.Push(p3);
  184.         cxt.Push(p4);
  185.         cxt.Push(p5);
  186.         cxt.Push(p6);
  187.         cxt.Push(p7);
  188.         Invoke(hash, &cxt);
  189.         return cxt.GetResult<R>();
  190.     }
  191.  
  192.     template <typename R, typename T1, typename T2, typename T3, typename T4,
  193.         typename T5, typename T6, typename T7, typename T8>
  194.         static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8)
  195.     {
  196.         NativeContext cxt;
  197.         cxt.Push(p1);
  198.         cxt.Push(p2);
  199.         cxt.Push(p3);
  200.         cxt.Push(p4);
  201.         cxt.Push(p5);
  202.         cxt.Push(p6);
  203.         cxt.Push(p7);
  204.         cxt.Push(p8);
  205.         Invoke(hash, &cxt);
  206.         return cxt.GetResult<R>();
  207.     }
  208.  
  209.     template <typename R, typename T1, typename T2, typename T3, typename T4,
  210.         typename T5, typename T6, typename T7, typename T8, typename T9>
  211.         static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8,
  212.         T9 p9)
  213.     {
  214.         NativeContext cxt;
  215.         cxt.Push(p1);
  216.         cxt.Push(p2);
  217.         cxt.Push(p3);
  218.         cxt.Push(p4);
  219.         cxt.Push(p5);
  220.         cxt.Push(p6);
  221.         cxt.Push(p7);
  222.         cxt.Push(p8);
  223.         cxt.Push(p9);
  224.         Invoke(hash, &cxt);
  225.         return cxt.GetResult<R>();
  226.     }
  227.  
  228.     template <typename R, typename T1, typename T2, typename T3, typename T4,
  229.         typename T5, typename T6, typename T7, typename T8, typename T9,
  230.         typename T10>
  231.         static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8,
  232.         T9 p9, T10 p10)
  233.     {
  234.         NativeContext cxt;
  235.         cxt.Push(p1);
  236.         cxt.Push(p2);
  237.         cxt.Push(p3);
  238.         cxt.Push(p4);
  239.         cxt.Push(p5);
  240.         cxt.Push(p6);
  241.         cxt.Push(p7);
  242.         cxt.Push(p8);
  243.         cxt.Push(p9);
  244.         cxt.Push(p10);
  245.         Invoke(hash, &cxt);
  246.         return cxt.GetResult<R>();
  247.     }
  248.  
  249.     template <typename R, typename T1, typename T2, typename T3, typename T4,
  250.         typename T5, typename T6, typename T7, typename T8, typename T9,
  251.         typename T10, typename T11>
  252.         static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8,
  253.         T9 p9, T10 p10, T11 p11)
  254.     {
  255.         NativeContext cxt;
  256.         cxt.Push(p1);
  257.         cxt.Push(p2);
  258.         cxt.Push(p3);
  259.         cxt.Push(p4);
  260.         cxt.Push(p5);
  261.         cxt.Push(p6);
  262.         cxt.Push(p7);
  263.         cxt.Push(p8);
  264.         cxt.Push(p9);
  265.         cxt.Push(p10);
  266.         cxt.Push(p11);
  267.         Invoke(hash, &cxt);
  268.         return cxt.GetResult<R>();
  269.     }
  270.  
  271.     template <typename R, typename T1, typename T2, typename T3, typename T4,
  272.         typename T5, typename T6, typename T7, typename T8, typename T9,
  273.         typename T10, typename T11, typename T12>
  274.         static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8,
  275.         T9 p9, T10 p10, T11 p11, T12 p12)
  276.     {
  277.         NativeContext cxt;
  278.         cxt.Push(p1);
  279.         cxt.Push(p2);
  280.         cxt.Push(p3);
  281.         cxt.Push(p4);
  282.         cxt.Push(p5);
  283.         cxt.Push(p6);
  284.         cxt.Push(p7);
  285.         cxt.Push(p8);
  286.         cxt.Push(p9);
  287.         cxt.Push(p10);
  288.         cxt.Push(p11);
  289.         cxt.Push(p12);
  290.         Invoke(hash, &cxt);
  291.         return cxt.GetResult<R>();
  292.     }
  293.  
  294.     template <typename R, typename T1, typename T2, typename T3, typename T4,
  295.         typename T5, typename T6, typename T7, typename T8, typename T9,
  296.         typename T10, typename T11, typename T12, typename T13>
  297.         static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8,
  298.         T9 p9, T10 p10, T11 p11, T12 p12, T13 p13)
  299.     {
  300.         NativeContext cxt;
  301.         cxt.Push(p1);
  302.         cxt.Push(p2);
  303.         cxt.Push(p3);
  304.         cxt.Push(p4);
  305.         cxt.Push(p5);
  306.         cxt.Push(p6);
  307.         cxt.Push(p7);
  308.         cxt.Push(p8);
  309.         cxt.Push(p9);
  310.         cxt.Push(p10);
  311.         cxt.Push(p11);
  312.         cxt.Push(p12);
  313.         cxt.Push(p13);
  314.         Invoke(hash, &cxt);
  315.         return cxt.GetResult<R>();
  316.     }
  317.  
  318.     template <typename R, typename T1, typename T2, typename T3, typename T4,
  319.         typename T5, typename T6, typename T7, typename T8, typename T9,
  320.         typename T10, typename T11, typename T12, typename T13, typename T14>
  321.         static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8,
  322.         T9 p9, T10 p10, T11 p11, T12 p12, T13 p13, T14 p14)
  323.     {
  324.         NativeContext cxt;
  325.         cxt.Push(p1);
  326.         cxt.Push(p2);
  327.         cxt.Push(p3);
  328.         cxt.Push(p4);
  329.         cxt.Push(p5);
  330.         cxt.Push(p6);
  331.         cxt.Push(p7);
  332.         cxt.Push(p8);
  333.         cxt.Push(p9);
  334.         cxt.Push(p10);
  335.         cxt.Push(p11);
  336.         cxt.Push(p12);
  337.         cxt.Push(p13);
  338.         cxt.Push(p14);
  339.         Invoke(hash, &cxt);
  340.         return cxt.GetResult<R>();
  341.     }
  342.  
  343.     template <typename R, typename T1, typename T2, typename T3, typename T4,
  344.         typename T5, typename T6, typename T7, typename T8, typename T9,
  345.         typename T10, typename T11, typename T12, typename T13, typename T14,
  346.         typename T15>
  347.         static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8,
  348.         T9 p9, T10 p10, T11 p11, T12 p12, T13 p13, T14 p14, T15 p15)
  349.     {
  350.         NativeContext cxt;
  351.         cxt.Push(p1);
  352.         cxt.Push(p2);
  353.         cxt.Push(p3);
  354.         cxt.Push(p4);
  355.         cxt.Push(p5);
  356.         cxt.Push(p6);
  357.         cxt.Push(p7);
  358.         cxt.Push(p8);
  359.         cxt.Push(p9);
  360.         cxt.Push(p10);
  361.         cxt.Push(p11);
  362.         cxt.Push(p12);
  363.         cxt.Push(p13);
  364.         cxt.Push(p14);
  365.         cxt.Push(p15);
  366.         Invoke(hash, &cxt);
  367.         return cxt.GetResult<R>();
  368.     }
  369.  
  370.  
  371.     template <typename R, typename T1, typename T2, typename T3, typename T4,
  372.         typename T5, typename T6, typename T7, typename T8, typename T9,
  373.         typename T10, typename T11, typename T12, typename T13, typename T14,
  374.         typename T15, typename T16>
  375.         static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8,
  376.         T9 p9, T10 p10, T11 p11, T12 p12, T13 p13, T14 p14, T15 p15, T16 p16)
  377.     {
  378.         NativeContext cxt;
  379.         cxt.Push(p1);
  380.         cxt.Push(p2);
  381.         cxt.Push(p3);
  382.         cxt.Push(p4);
  383.         cxt.Push(p5);
  384.         cxt.Push(p6);
  385.         cxt.Push(p7);
  386.         cxt.Push(p8);
  387.         cxt.Push(p9);
  388.         cxt.Push(p10);
  389.         cxt.Push(p11);
  390.         cxt.Push(p12);
  391.         cxt.Push(p13);
  392.         cxt.Push(p14);
  393.         cxt.Push(p15);
  394.         cxt.Push(p16);
  395.         Invoke(hash, &cxt);
  396.         return cxt.GetResult<R>();
  397.     }
  398. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement