diff options
author | Tycho <work.tycho+git@gmail.com> | 2014-09-17 19:47:33 +0200 |
---|---|---|
committer | Tycho <work.tycho+git@gmail.com> | 2014-09-17 19:47:33 +0200 |
commit | 045d54e0e28a9338b171c93c5bbc9ccba4c79ef1 (patch) | |
tree | 58e083f5b1f97baf6de712485d3629bdcac275a8 /Tools/BiomeVisualiser/WndProcThunk.h | |
parent | Added first test to show the object can be created (diff) | |
parent | BungeeCord compatibility: don't overwrite UUID / properties. (diff) | |
download | cuberite-045d54e0e28a9338b171c93c5bbc9ccba4c79ef1.tar cuberite-045d54e0e28a9338b171c93c5bbc9ccba4c79ef1.tar.gz cuberite-045d54e0e28a9338b171c93c5bbc9ccba4c79ef1.tar.bz2 cuberite-045d54e0e28a9338b171c93c5bbc9ccba4c79ef1.tar.lz cuberite-045d54e0e28a9338b171c93c5bbc9ccba4c79ef1.tar.xz cuberite-045d54e0e28a9338b171c93c5bbc9ccba4c79ef1.tar.zst cuberite-045d54e0e28a9338b171c93c5bbc9ccba4c79ef1.zip |
Diffstat (limited to 'Tools/BiomeVisualiser/WndProcThunk.h')
-rw-r--r-- | Tools/BiomeVisualiser/WndProcThunk.h | 143 |
1 files changed, 0 insertions, 143 deletions
diff --git a/Tools/BiomeVisualiser/WndProcThunk.h b/Tools/BiomeVisualiser/WndProcThunk.h deleted file mode 100644 index da995eb5f..000000000 --- a/Tools/BiomeVisualiser/WndProcThunk.h +++ /dev/null @@ -1,143 +0,0 @@ - -// WndProcThunk.h - -// Interfaces to the CWndProcThunk class responsible for WNDPROC class-thunking -// For details, see http://www.hackcraft.net/cpp/windowsThunk/thiscall/ -// Also available is a CDlgProcThunk class doing the same work for DIALOGPROC - -// MD: Made NX-compat by allocating the code structure using VirtualAlloc(..., PAGE_EXECUTE_READWRITE) - - - - - -// fwd: -template <class W> class CWndProcThunk; - - - - - -#ifndef WNDPROCTHUNK_H_INCLUDED -#define WNDPROCTHUNK_H_INCLUDED - - - - -template<typename To, typename From> inline To union_cast(From fr) throw() -{ - union - { - From f; - To t; - } uc; - uc.f = fr; - return uc.t; -} - - - - - -#pragma warning(push) -#pragma warning(disable : 4355) - -#if defined(_M_IX86) - -#pragma pack(push,1) - -template <class W> class CWndProcThunk -{ - typedef ::LRESULT (W::* WndProc)(::HWND, ::UINT, ::WPARAM, ::LPARAM); - typedef CWndProcThunk ThisClass; - - struct SCode - { - BYTE m_mov; // mov ECX, m_this - W * m_this; // - BYTE m_jmp; // jmp m_relproc - ptrdiff_t m_relproc; // relative jmp - }; - - SCode * Code; - -public: - ThisClass(WndProc proc, W * obj) - { - Code = (SCode *)VirtualAlloc(NULL, sizeof(SCode), MEM_COMMIT, PAGE_EXECUTE_READWRITE); - Code->m_mov = 0xB9, - Code->m_this = obj, - Code->m_jmp = 0xE9, - Code->m_relproc = union_cast<char *>(proc) - reinterpret_cast<char *>(Code) - sizeof(*Code); - ::FlushInstructionCache(::GetCurrentProcess(), Code, sizeof(*Code)); - } - - virtual ~CWndProcThunk() - { - VirtualFree(Code, sizeof(*Code), MEM_RELEASE); - Code = NULL; - } - - operator ::WNDPROC() const {return reinterpret_cast<::WNDPROC>(Code); } - operator ::LONG_PTR() const {return reinterpret_cast<::LONG_PTR>(Code); } -} ; - - - - - -template <class W> class CDlgProcThunk -{ - typedef ::BOOL (W::* DlgProc)(::HWND, ::UINT, ::WPARAM, ::LPARAM); - typedef CDlgProcThunk ThisClass; - - struct SCode - { - BYTE m_mov; // mov ECX, m_this - W * m_this; // - BYTE m_jmp; // jmp m_relproc - ptrdiff_t m_relproc; // relative jmp - }; - - SCode * Code; - -public: - CDlgProcThunk(DlgProc proc, W * obj) - { - Code = (SCode *)VirtualAlloc(NULL, sizeof(SCode), MEM_COMMIT, PAGE_EXECUTE_READWRITE); - Code->m_mov = 0xB9, - Code->m_this = obj, - Code->m_jmp = 0xE9, - Code->m_relproc = union_cast<char *>(proc) - reinterpret_cast<char *>(Code) - sizeof(*Code); - ::FlushInstructionCache(::GetCurrentProcess(), Code, sizeof(*Code)); - } - - virtual ~CDlgProcThunk() - { - VirtualFree(Code, sizeof(*Code), MEM_RELEASE); - Code = NULL; - } - - operator ::DLGPROC() const {return reinterpret_cast<::DLGPROC>(Code); } - operator ::LONG_PTR() const {return reinterpret_cast<::LONG_PTR>(Code); } -} ; - - - - - - #pragma pack(pop) - -#else // _M_IX86 - #error Only X86 supported -#endif - - - - - -#endif // WNDPROCTHUNK_H_INCLUDED - - - - |