Hey Giannis.
How big qre the thunks ? A whole page for each of them looks like a lot of
resources. What about a special heap ?
Keep it up!
Regards
Jérôme
Le jeudi 6 février 2014, 13:07:37 gadamopoulos(a)svn.reactos.org a écrit :
  Author: gadamopoulos
 Date: Thu Feb  6 13:07:37 2014
 New Revision: 62011
 URL: 
http://svn.reactos.org/svn/reactos?rev=62011&view=rev
 Log:
 [atl]
 - 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
 Modified:
     branches/shell-experiments/lib/atl/atlwin.h
 Modified: branches/shell-experiments/lib/atl/atlwin.h
 URL:
 
http://svn.reactos.org/svn/reactos/branches/shell-experiments/lib/atl/atlwi
 n.h?rev=62011&r1=62010&r2=62011&view=diff
 ===========================================================================
 === --- branches/shell-experiments/lib/atl/atlwin.h    [iso-8859-1] (original)
 +++ branches/shell-experiments/lib/atl/atlwin.h        [iso-8859-1] Thu Feb  6
 13:07:37 2014 @@ -153,21 +153,32 @@
  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);
        }
  };