Author: mjmartin Date: Sat May 1 14:02:23 2010 New Revision: 47073
URL: http://svn.reactos.org/svn/reactos?rev=47073&view=rev Log: [win32k] - Revert the hack done in 47059 to apply a better solution. - co_IntCreateWindowEx: Add the WNDS2_WMCREATEMSGPROCESSED flag to state2 member of WND after sending the WM_CREATE message. - By setting this flag it can be examined elsewhere to determine if the window was created successfully. - co_UserDestroyWindow: Examine above mentioned flag to make sure the windows was created before calling hook procedure to inform of destroying window.
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/window.c
Modified: trunk/reactos/subsystems/win32/win32k/ntuser/window.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/subsystems/win32/win32k/ntu... ============================================================================== --- trunk/reactos/subsystems/win32/win32k/ntuser/window.c [iso-8859-1] (original) +++ trunk/reactos/subsystems/win32/win32k/ntuser/window.c [iso-8859-1] Sat May 1 14:02:23 2010 @@ -2333,6 +2333,11 @@
IntNotifyWinEvent(EVENT_OBJECT_CREATE, Window->Wnd, OBJID_WINDOW, 0);
+ /* By setting the flag below it can be examined to determine if the window + was created successfully and a valid pwnd was passed back to caller since + from here the function has to succeed. */ + Window->Wnd->state2 |= WNDS2_WMCREATEMSGPROCESSED; + /* Send move and size messages. */ if (!(Window->state & WINDOWOBJECT_NEED_SIZE)) { @@ -2468,23 +2473,7 @@
CLEANUP: if (!_ret_ && Window && Window->Wnd && ti) - { - ULONG SavedHooks; - /* HACK: co_UserDestroyWindow will call CBT proc with code HCBT_DESTROYWND. - Applications can choke on this as a hwnd was never returned from this call */ - /* Save the flags */ - SavedHooks = ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->fsHooks; - - /* Temporary remove the flag */ - ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->fsHooks &= ~HOOKID_TO_FLAG(WH_CBT); - - /* Destroy the window */ co_UserDestroyWindow(Window); - - /* Restore the flag */ - ((PTHREADINFO)PsGetCurrentThreadWin32Thread())->fsHooks = SavedHooks; - } - // UserFreeWindowInfo(ti, Window); if (Window) { @@ -2649,8 +2638,8 @@ return FALSE; }
- /* Call hooks */ - if (ISITHOOKED(WH_CBT)) + /* If window was created successfully and it is hooked */ + if ((Wnd->state2 & WNDS2_WMCREATEMSGPROCESSED) && (ISITHOOKED(WH_CBT))) { if (co_HOOK_CallHooks(WH_CBT, HCBT_DESTROYWND, (WPARAM) hWnd, 0)) return FALSE; }