[NTUSER] Check IME-like after WNDS_DESTROYED check (#5005)
authorKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Mon, 23 Jan 2023 03:22:54 +0000 (12:22 +0900)
committerGitHub <noreply@github.com>
Mon, 23 Jan 2023 03:22:54 +0000 (12:22 +0900)
The guilty commit a2c6af0 enabled the IMM mode. So we have to take care of the default IME windows.
Using IS_WND_IMELIKE against WNDS_DESTROYED window was the cause of BSoD. CORE-18777

win32ss/user/ntuser/window.c

index 2bdc64f..142815a 100644 (file)
@@ -2953,7 +2953,7 @@ BOOLEAN co_UserDestroyWindow(PVOID Object)
     * Check if this window is the Shell's Desktop Window. If so set hShellWindow to NULL
     */
 
-   if ((ti != NULL) && (ti->pDeskInfo != NULL))
+   if (ti->pDeskInfo != NULL)
    {
       if (ti->pDeskInfo->hShellWindow == hWnd)
       {
@@ -2987,9 +2987,10 @@ BOOLEAN co_UserDestroyWindow(PVOID Object)
    /* Send destroy messages */
    IntSendDestroyMsg(UserHMGetHandle(Window));
 
-   // Destroy the default IME window if necessary
+   /* Destroy the default IME window if necessary */
    if (IS_IMM_MODE() && !(ti->TIF_flags & TIF_INCLEANUP) &&
-       ti->spwndDefaultIme && !IS_WND_IMELIKE(Window) && !(Window->state & WNDS_DESTROYED))
+       ti->spwndDefaultIme && (ti->spwndDefaultIme != Window) &&
+       !(Window->state & WNDS_DESTROYED) && !IS_WND_IMELIKE(Window))
    {
        if (IS_WND_CHILD(Window))
        {