[ros-dev] [ros-diffs] [gadamopoulos] 62011: [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

Jerome Gardou jerome.gardou at reactos.org
Thu Feb 6 19:02:07 UTC 2014


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 at 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);
>  	}
>  };




More information about the Ros-dev mailing list