Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // Register natives in gta 4 (assembly x86 - win32)
- .text:00B82EB7 push offset loc_B82010 ; push the offset from the native function address
- .text:00B82EBC push 10237666h ; push the hash code for the native function
- .text:00B82EC1 call sub_5A6200 ; register native to script machine
- // Regiser natives in gta 5 (assembly ppc - ps3)
- seg001:003A40C8 lis r3, 0x30B5 # 0x30B51753 ; load immediate shift hash code from native function
- seg001:003A40CC lis r4, MAY_FINISH_HEIST_OFFSET@h ; load immediate shift function address
- seg001:003A40D0 ori r3, r3, 0x1753 # 0x30B51753 ; OR2 0x1753 with r3 and store in r3
- seg001:003A40D4 addic r4, r4, MAY_FINISH_HEIST_OFFSET@l ; add immediate r4 with may_finish.. and store in r4
- seg001:003A40D8 bl REGISTER_NATIVE_TO_SCRIPT_MACHINE ; register native to script machine
- // How to call natives in c++ (created for x86 - win32 // with ps3 addresses/offsets) - WON'T WORK - JUST AN EXAMPLE!!!
- enum NativeHashes {
- NATIVE_FINISH_HEIST = 817174355, // 0x30B51753
- };
- class VNativeCallContext {
- protected:
- void * m_pReturn; // 00-04
- unsigned int m_nArgCount; // 04-08
- void * m_pArgs; // 08-0C
- unsigned int m_nDataCount; // 0C-10
- CVector3 * m_pOriginalData[4]; // 10-20
- Vector4 m_TemporaryData[4]; // 20-60
- };
- class NativeContext : public VNativeCallContext {
- private:
- // Configuration
- enum {
- MaxNativeParams = 16,
- ArgSize = 4,
- };
- // Anything temporary that we need
- unsigned char m_TempStack[MaxNativeParams * ArgSize];
- public:
- inline NativeContext() {
- m_pArgs = &m_TempStack;
- m_pReturn = &m_TempStack;
- m_nArgCount = 0;
- m_nDataCount = 0;
- }
- template <typename T>
- inline void Push(T value) {
- // Have we reached our argument count?
- if(m_nArgCount == MaxNativeParams){
- // We can only store 16 arguments
- return;
- }
- // Is the argument too big?
- if(sizeof(T) > ArgSize) {
- // We only accept 4 byte or less arguments
- return;
- }
- else if(sizeof(T) < ArgSize) // Is the argument too small? {
- // Reset the argument data
- *(unsigned int *)(m_TempStack + ArgSize * m_nArgCount) = 0;
- }
- // Add to argument to the argument stack
- *(T *)(m_TempStack + ArgSize * m_nArgCount) = value;
- // Increment the total argument count
- m_nArgCount++;
- }
- };
- class NativeInvoke {
- private:
- typedef void (_cdecl * NativeCall)(VNativeCallContext * pNativeContext);
- static inline void Invoke(unsigned int uiHash, NativeContext * pNativeContext)
- {
- DWORD dwFunc = NULL; // TODO FIND
- DWORD dwNativeFunc = NULL;
- // x86 asm - TODO: convert to ppc and find address
- _asm {
- push esi
- mov esi, uiHash
- call dwFunc
- pop esi
- mov dwNativeFunc, eax
- }
- if(dwNativeFunc != NULL)
- ((NativeCall)dwNativeFunc)(pNativeContext);
- }
- public:
- template <typename R>
- static inline R Invoke(unsigned int hash)
- {
- NativeContext cxt;
- Invoke(hash, &cxt);
- return cxt.GetResult<R>();
- }
- template <typename R, typename T1>
- static inline R Invoke(unsigned int hash, T1 p1)
- {
- NativeContext cxt;
- cxt.Push(p1);
- Invoke(hash, &cxt);
- return cxt.GetResult<R>();
- }
- template <typename R, typename T1, typename T2>
- static inline R Invoke(unsigned int hash, T1 p1, T2 p2)
- {
- NativeContext cxt;
- cxt.Push(p1);
- cxt.Push(p2);
- Invoke(hash, &cxt);
- return cxt.GetResult<R>();
- }
- template <typename R, typename T1, typename T2, typename T3>
- static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3)
- {
- NativeContext cxt;
- cxt.Push(p1);
- cxt.Push(p2);
- cxt.Push(p3);
- Invoke(hash, &cxt);
- return cxt.GetResult<R>();
- }
- template <typename R, typename T1, typename T2, typename T3, typename T4>
- static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4)
- {
- NativeContext cxt;
- cxt.Push(p1);
- cxt.Push(p2);
- cxt.Push(p3);
- cxt.Push(p4);
- Invoke(hash, &cxt);
- return cxt.GetResult<R>();
- }
- template <typename R, typename T1, typename T2, typename T3, typename T4,
- typename T5>
- static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5)
- {
- NativeContext cxt;
- cxt.Push(p1);
- cxt.Push(p2);
- cxt.Push(p3);
- cxt.Push(p4);
- cxt.Push(p5);
- Invoke(hash, &cxt);
- return cxt.GetResult<R>();
- }
- template <typename R, typename T1, typename T2, typename T3, typename T4,
- typename T5, typename T6>
- static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6)
- {
- NativeContext cxt;
- cxt.Push(p1);
- cxt.Push(p2);
- cxt.Push(p3);
- cxt.Push(p4);
- cxt.Push(p5);
- cxt.Push(p6);
- Invoke(hash, &cxt);
- return cxt.GetResult<R>();
- }
- template <typename R, typename T1, typename T2, typename T3, typename T4,
- typename T5, typename T6, typename T7>
- static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7)
- {
- NativeContext cxt;
- cxt.Push(p1);
- cxt.Push(p2);
- cxt.Push(p3);
- cxt.Push(p4);
- cxt.Push(p5);
- cxt.Push(p6);
- cxt.Push(p7);
- Invoke(hash, &cxt);
- return cxt.GetResult<R>();
- }
- template <typename R, typename T1, typename T2, typename T3, typename T4,
- typename T5, typename T6, typename T7, typename T8>
- static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8)
- {
- NativeContext cxt;
- cxt.Push(p1);
- cxt.Push(p2);
- cxt.Push(p3);
- cxt.Push(p4);
- cxt.Push(p5);
- cxt.Push(p6);
- cxt.Push(p7);
- cxt.Push(p8);
- Invoke(hash, &cxt);
- return cxt.GetResult<R>();
- }
- template <typename R, typename T1, typename T2, typename T3, typename T4,
- typename T5, typename T6, typename T7, typename T8, typename T9>
- static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8,
- T9 p9)
- {
- NativeContext cxt;
- cxt.Push(p1);
- cxt.Push(p2);
- cxt.Push(p3);
- cxt.Push(p4);
- cxt.Push(p5);
- cxt.Push(p6);
- cxt.Push(p7);
- cxt.Push(p8);
- cxt.Push(p9);
- Invoke(hash, &cxt);
- return cxt.GetResult<R>();
- }
- template <typename R, typename T1, typename T2, typename T3, typename T4,
- typename T5, typename T6, typename T7, typename T8, typename T9,
- typename T10>
- static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8,
- T9 p9, T10 p10)
- {
- NativeContext cxt;
- cxt.Push(p1);
- cxt.Push(p2);
- cxt.Push(p3);
- cxt.Push(p4);
- cxt.Push(p5);
- cxt.Push(p6);
- cxt.Push(p7);
- cxt.Push(p8);
- cxt.Push(p9);
- cxt.Push(p10);
- Invoke(hash, &cxt);
- return cxt.GetResult<R>();
- }
- template <typename R, typename T1, typename T2, typename T3, typename T4,
- typename T5, typename T6, typename T7, typename T8, typename T9,
- typename T10, typename T11>
- static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8,
- T9 p9, T10 p10, T11 p11)
- {
- NativeContext cxt;
- cxt.Push(p1);
- cxt.Push(p2);
- cxt.Push(p3);
- cxt.Push(p4);
- cxt.Push(p5);
- cxt.Push(p6);
- cxt.Push(p7);
- cxt.Push(p8);
- cxt.Push(p9);
- cxt.Push(p10);
- cxt.Push(p11);
- Invoke(hash, &cxt);
- return cxt.GetResult<R>();
- }
- template <typename R, typename T1, typename T2, typename T3, typename T4,
- typename T5, typename T6, typename T7, typename T8, typename T9,
- typename T10, typename T11, typename T12>
- static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8,
- T9 p9, T10 p10, T11 p11, T12 p12)
- {
- NativeContext cxt;
- cxt.Push(p1);
- cxt.Push(p2);
- cxt.Push(p3);
- cxt.Push(p4);
- cxt.Push(p5);
- cxt.Push(p6);
- cxt.Push(p7);
- cxt.Push(p8);
- cxt.Push(p9);
- cxt.Push(p10);
- cxt.Push(p11);
- cxt.Push(p12);
- Invoke(hash, &cxt);
- return cxt.GetResult<R>();
- }
- template <typename R, typename T1, typename T2, typename T3, typename T4,
- typename T5, typename T6, typename T7, typename T8, typename T9,
- typename T10, typename T11, typename T12, typename T13>
- static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8,
- T9 p9, T10 p10, T11 p11, T12 p12, T13 p13)
- {
- NativeContext cxt;
- cxt.Push(p1);
- cxt.Push(p2);
- cxt.Push(p3);
- cxt.Push(p4);
- cxt.Push(p5);
- cxt.Push(p6);
- cxt.Push(p7);
- cxt.Push(p8);
- cxt.Push(p9);
- cxt.Push(p10);
- cxt.Push(p11);
- cxt.Push(p12);
- cxt.Push(p13);
- Invoke(hash, &cxt);
- return cxt.GetResult<R>();
- }
- template <typename R, typename T1, typename T2, typename T3, typename T4,
- typename T5, typename T6, typename T7, typename T8, typename T9,
- typename T10, typename T11, typename T12, typename T13, typename T14>
- static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8,
- T9 p9, T10 p10, T11 p11, T12 p12, T13 p13, T14 p14)
- {
- NativeContext cxt;
- cxt.Push(p1);
- cxt.Push(p2);
- cxt.Push(p3);
- cxt.Push(p4);
- cxt.Push(p5);
- cxt.Push(p6);
- cxt.Push(p7);
- cxt.Push(p8);
- cxt.Push(p9);
- cxt.Push(p10);
- cxt.Push(p11);
- cxt.Push(p12);
- cxt.Push(p13);
- cxt.Push(p14);
- Invoke(hash, &cxt);
- return cxt.GetResult<R>();
- }
- template <typename R, typename T1, typename T2, typename T3, typename T4,
- typename T5, typename T6, typename T7, typename T8, typename T9,
- typename T10, typename T11, typename T12, typename T13, typename T14,
- typename T15>
- static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8,
- T9 p9, T10 p10, T11 p11, T12 p12, T13 p13, T14 p14, T15 p15)
- {
- NativeContext cxt;
- cxt.Push(p1);
- cxt.Push(p2);
- cxt.Push(p3);
- cxt.Push(p4);
- cxt.Push(p5);
- cxt.Push(p6);
- cxt.Push(p7);
- cxt.Push(p8);
- cxt.Push(p9);
- cxt.Push(p10);
- cxt.Push(p11);
- cxt.Push(p12);
- cxt.Push(p13);
- cxt.Push(p14);
- cxt.Push(p15);
- Invoke(hash, &cxt);
- return cxt.GetResult<R>();
- }
- template <typename R, typename T1, typename T2, typename T3, typename T4,
- typename T5, typename T6, typename T7, typename T8, typename T9,
- typename T10, typename T11, typename T12, typename T13, typename T14,
- typename T15, typename T16>
- static inline R Invoke(unsigned int hash, T1 p1, T2 p2, T3 p3, T4 p4, T5 p5, T6 p6, T7 p7, T8 p8,
- T9 p9, T10 p10, T11 p11, T12 p12, T13 p13, T14 p14, T15 p15, T16 p16)
- {
- NativeContext cxt;
- cxt.Push(p1);
- cxt.Push(p2);
- cxt.Push(p3);
- cxt.Push(p4);
- cxt.Push(p5);
- cxt.Push(p6);
- cxt.Push(p7);
- cxt.Push(p8);
- cxt.Push(p9);
- cxt.Push(p10);
- cxt.Push(p11);
- cxt.Push(p12);
- cxt.Push(p13);
- cxt.Push(p14);
- cxt.Push(p15);
- cxt.Push(p16);
- Invoke(hash, &cxt);
- return cxt.GetResult<R>();
- }
- };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement