- 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
This commit is contained in:
Giannis Adamopoulos 2014-02-06 13:07:37 +00:00
parent 1724ea64fb
commit f0aee80fcb

View file

@ -153,21 +153,32 @@ struct thunkCode
class CWndProcThunk class CWndProcThunk
{ {
public: public:
thunkCode m_thunk; thunkCode *m_pthunk;
_AtlCreateWndData cd; _AtlCreateWndData cd;
public: 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) BOOL Init(WNDPROC proc, void *pThis)
{ {
m_thunk.m_mov = 0x042444C7; m_pthunk->m_mov = 0x042444C7;
m_thunk.m_this = PtrToUlong(pThis); m_pthunk->m_this = PtrToUlong(pThis);
m_thunk.m_jmp = 0xe9; m_pthunk->m_jmp = 0xe9;
m_thunk.m_relproc = DWORD(reinterpret_cast<char *>(proc) - (reinterpret_cast<char *>(this) + sizeof(thunkCode))); m_pthunk->m_relproc = DWORD(reinterpret_cast<char *>(proc) - (reinterpret_cast<char *>(m_pthunk) + sizeof(thunkCode)));
return TRUE; return TRUE;
} }
WNDPROC GetWNDPROC() WNDPROC GetWNDPROC()
{ {
return reinterpret_cast<WNDPROC>(&m_thunk); return reinterpret_cast<WNDPROC>(m_pthunk);
} }
}; };