[atl]
authorGiannis Adamopoulos <gadamopoulos@reactos.org>
Thu, 6 Feb 2014 13:07:37 +0000 (13:07 +0000)
committerGiannis Adamopoulos <gadamopoulos@reactos.org>
Thu, 6 Feb 2014 13:07:37 +0000 (13:07 +0000)
- Fix atl thunks to be allocated in executable memory and not from the stack in order to run libraries that use atl (such as browseui) in windows with DEP enabled

svn path=/branches/shell-experiments/; revision=62011

lib/atl/atlwin.h

index cc92575..47bda88 100644 (file)
@@ -153,21 +153,32 @@ struct thunkCode
 class CWndProcThunk
 {
 public:
-       thunkCode                                                               m_thunk;
+       thunkCode                                                               *m_pthunk;
        _AtlCreateWndData                                               cd;
 public:
+
+    CWndProcThunk()
+    {
+        m_pthunk = (thunkCode*)VirtualAlloc(NULL, sizeof(thunkCode), MEM_COMMIT, PAGE_EXECUTE_READWRITE);
+    }
+
+    ~CWndProcThunk()
+    {
+        VirtualFree(m_pthunk, sizeof(thunkCode), MEM_RELEASE);
+    }
+
        BOOL Init(WNDPROC proc, void *pThis)
        {
-               m_thunk.m_mov = 0x042444C7;
-               m_thunk.m_this = PtrToUlong(pThis);
-               m_thunk.m_jmp = 0xe9;
-               m_thunk.m_relproc = DWORD(reinterpret_cast<char *>(proc) - (reinterpret_cast<char *>(this) + sizeof(thunkCode)));
+               m_pthunk->m_mov = 0x042444C7;
+               m_pthunk->m_this = PtrToUlong(pThis);
+               m_pthunk->m_jmp = 0xe9;
+               m_pthunk->m_relproc = DWORD(reinterpret_cast<char *>(proc) - (reinterpret_cast<char *>(m_pthunk) + sizeof(thunkCode)));
                return TRUE;
        }
 
        WNDPROC GetWNDPROC()
        {
-               return reinterpret_cast<WNDPROC>(&m_thunk);
+               return reinterpret_cast<WNDPROC>(m_pthunk);
        }
 };