From: Thomas Faber Date: Fri, 16 Oct 2015 15:30:35 +0000 (+0000) Subject: [WIN32K:NTUSER] X-Git-Tag: ReactOS-0.4.0~499 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=4367fbf372fbc64a1cdae6e606fd79bb3e920450 [WIN32K:NTUSER] - Terminate the RawInputThread on shutdown CORE-10217 #resolve svn path=/trunk/; revision=69556 --- diff --git a/reactos/win32ss/user/ntuser/input.c b/reactos/win32ss/user/ntuser/input.c index 902e0a39145..62ab66ec21b 100644 --- a/reactos/win32ss/user/ntuser/input.c +++ b/reactos/win32ss/user/ntuser/input.c @@ -132,10 +132,12 @@ RawInputThreadMain(VOID) PFILE_OBJECT pKbdDevice = NULL, pMouDevice = NULL; LARGE_INTEGER ByteOffset; //LARGE_INTEGER WaitTimeout; - PVOID WaitObjects[3], pSignaledObject = NULL; - ULONG cWaitObjects = 0, cMaxWaitObjects = 1; + PVOID WaitObjects[4], pSignaledObject = NULL; + KWAIT_BLOCK WaitBlockArray[RTL_NUMBER_OF(WaitObjects)]; + ULONG cWaitObjects = 0, cMaxWaitObjects = 2; MOUSE_INPUT_DATA MouseInput; KEYBOARD_INPUT_DATA KeyInput; + PVOID ShutdownEvent; ByteOffset.QuadPart = (LONGLONG)0; //WaitTimeout.QuadPart = (LONGLONG)(-10000000); @@ -156,6 +158,7 @@ RawInputThreadMain(VOID) NT_ASSERT(ghMouseDevice == NULL); NT_ASSERT(ghKeyboardDevice == NULL); + PoRequestShutdownEvent(&ShutdownEvent); for (;;) { if (!ghMouseDevice) @@ -189,6 +192,7 @@ RawInputThreadMain(VOID) /* Reset WaitHandles array */ cWaitObjects = 0; + WaitObjects[cWaitObjects++] = ShutdownEvent; WaitObjects[cWaitObjects++] = MasterTimer; if (ghMouseDevice) @@ -241,7 +245,7 @@ RawInputThreadMain(VOID) KernelMode, TRUE, NULL,//&WaitTimeout, - NULL); + WaitBlockArray); if ((Status >= STATUS_WAIT_0) && (Status < (STATUS_WAIT_0 + (LONG)cWaitObjects))) @@ -264,6 +268,10 @@ RawInputThreadMain(VOID) { ProcessTimers(); } + else if (pSignaledObject == ShutdownEvent) + { + break; + } else ASSERT(FALSE); } } @@ -302,6 +310,23 @@ RawInputThreadMain(VOID) else if (KbdStatus != STATUS_PENDING) ERR("Failed to read from keyboard: %x.\n", KbdStatus); } + + if (ghMouseDevice) + { + (void)ZwCancelIoFile(ghMouseDevice, &MouIosb); + ObCloseHandle(ghMouseDevice, KernelMode); + ObDereferenceObject(pMouDevice); + ghMouseDevice = NULL; + } + + if (ghKeyboardDevice) + { + (void)ZwCancelIoFile(ghKeyboardDevice, &KbdIosb); + ObCloseHandle(ghKeyboardDevice, KernelMode); + ObDereferenceObject(pKbdDevice); + ghKeyboardDevice = NULL; + } + ERR("Raw Input Thread Exit!\n"); } diff --git a/reactos/win32ss/user/winsrv/usersrv/init.c b/reactos/win32ss/user/winsrv/usersrv/init.c index 156683bf6cf..2e9ac5a66fd 100644 --- a/reactos/win32ss/user/winsrv/usersrv/init.c +++ b/reactos/win32ss/user/winsrv/usersrv/init.c @@ -102,7 +102,7 @@ NTAPI CreateSystemThreads(PVOID pParam) { NtUserCallOneParam((DWORD)pParam, ONEPARAM_ROUTINE_CREATESYSTEMTHREADS); - DPRINT1("This thread should not terminate!\n"); + RtlExitUserThread(0); return 0; }