Advertisement
Brick

datCallback

Jun 11th, 2017
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.05 KB | None | 0 0
  1. // OLD        -> NEW        | BYTES       | ADDRESSES
  2. // 0x01000000 -> 0x40000000 | 00 00 00 40 | 4C7A5B + 2, 4C7AC8 + 2, 4C7B70 + 1, 4C7BA6 + 1
  3. // 0x02000000 -> 0x80000000 | 00 00 00 80 | 4C7A90 + 2, 4C7AFB + 2, 4C7B7E + 1, 4C7BB4 + 1
  4. // 0x03000000 -> 0xC0000000 | 00 00 00 C0 | 4C7AB0 + 2, 4C7B2B + 2, 4C7B90 + 1, 4C7BC9 + 1, 4C7B61 + 1
  5. // 0xFCFFFFFF -> 0x3FFFFFFF | FF FF FF 3F | 4C7B5B + 2
  6.  
  7. // InstallPatch("datCallback Fix 1", { 0x00, 0x00, 0x00, 0x40 }, { 0x4C7A5B + 2, 0x4C7AC8 + 2, 0x4C7B70 + 1, 0x4C7BA6 + 1 });
  8. // InstallPatch("datCallback Fix 2", { 0x00, 0x00, 0x00, 0x80 }, { 0x4C7A90 + 2, 0x4C7AFB + 2, 0x4C7B7E + 1, 0x4C7BB4 + 1 });
  9. // InstallPatch("datCallback Fix 3", { 0x00, 0x00, 0x00, 0xC0 }, { 0x4C7AB0 + 2, 0x4C7B2B + 2, 0x4C7B90 + 1, 0x4C7BC9 + 1, 0x4C7B61 + 1 });
  10. // InstallPatch("datCallback Fix 4", { 0xFF, 0xFF, 0xFF, 0x3F }, { 0x4C7B5B + 2 });
  11.  
  12. struct datCallback
  13. {
  14. public:
  15.     class Base;
  16.  
  17. protected:
  18.     enum Flags
  19.     {
  20.         ParamCount0 = 0x40000000,
  21.         ParamCount1 = 0x80000000,
  22.         ParamCount2 = 0xC0000000,
  23.         ParamCountFlags = ParamCount0 | ParamCount1 | ParamCount2
  24.     };
  25.    
  26.     Base* _class;
  27.     unsigned int _callback;
  28.     void* _parameter;
  29.  
  30.     unsigned int _get_flags()
  31.     {
  32.         return _callback & ParamCountFlags;
  33.     }
  34.  
  35.     unsigned int _get_callback()
  36.     {
  37.         return _callback & ~ParamCountFlags;
  38.     }
  39.  
  40.     unsigned int _combine_callback(void* callback, unsigned int flags)
  41.     {
  42.         return reinterpret_cast<unsigned int&>(callback) | flags;
  43.     }
  44.    
  45. public:
  46.     datCallback()
  47.         : _class(NULL)
  48.         , _callback(NULL)
  49.         , _parameter(NULL)
  50.     { }
  51.  
  52.     datCallback(void(*callback)())
  53.         : _class(NULL)
  54.         , _callback(reinterpret_cast<unsigned int&>(callback) | ParamCount0)
  55.         , _parameter(NULL)
  56.     { }
  57.  
  58.     datCallback(void(*callback)(void*), void* param)
  59.         : _class(NULL)
  60.         , _callback(reinterpret_cast<unsigned int&>(callback) | ParamCount1)
  61.         , _parameter(param)
  62.     { }
  63.  
  64.     datCallback(void(*callback)(void*, void*), void* param)
  65.         : _class(NULL)
  66.         , _callback(reinterpret_cast<unsigned int&>(callback) | ParamCount2)
  67.         , _parameter(param)
  68.     { }
  69.  
  70.     datCallback(void(Base::*callback)(), Base* base)
  71.         : _class(base)
  72.         , _callback(reinterpret_cast<unsigned int&>(callback) | ParamCount0)
  73.         , _parameter(NULL)
  74.     { }
  75.  
  76.     datCallback(void(Base::*callback)(void*), Base* base, void* param)
  77.         : _class(base)
  78.         , _callback(reinterpret_cast<unsigned int&>(callback) | ParamCount1)
  79.         , _parameter(param)
  80.     { }
  81.  
  82.     datCallback(void(Base::*callback)(void*, void*), Base* base, void* param)
  83.         : _class(base)
  84.         , _callback(reinterpret_cast<unsigned int&>(callback) | ParamCount2)
  85.         , _parameter(param)
  86.     { }
  87.  
  88.     datCallback(const datCallback& rhs)
  89.         : _class(rhs._class)
  90.         , _callback(rhs._callback)
  91.         , _parameter(rhs._parameter)
  92.     { }
  93.  
  94.     void Call(void* parameter)
  95.     {
  96.         auto callback = _get_callback();
  97.         auto flags    = _get_flags();
  98.  
  99.         if (flags)
  100.         {
  101.             if (_class)
  102.             {
  103.                 switch (flags)
  104.                 {
  105.                     case ParamCount0: return (_class->*reinterpret_cast<void(Base::*&)()>(callback))();
  106.                     case ParamCount1: return (_class->*reinterpret_cast<void(Base::*&)(void*)>(callback))(_parameter);
  107.                     case ParamCount2: return (_class->*reinterpret_cast<void(Base::*&)(void*, void*)>(callback))(_parameter, parameter);
  108.                 }
  109.             }
  110.             else
  111.             {
  112.                 switch (flags)
  113.                 {
  114.                     case ParamCount0: return reinterpret_cast<void(*&)()>(callback)();
  115.                     case ParamCount1: return reinterpret_cast<void(*&)(void*)>(callback)(_parameter);
  116.                     case ParamCount2: return reinterpret_cast<void(*&)(void*, void*)>(callback)(_parameter, parameter);
  117.                 }
  118.             }
  119.         }
  120.     }
  121. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement