Index: pch.h =================================================================== --- win32ss/pch.h (revision 69259) +++ win32ss/pch.h (working copy) @@ -19,6 +19,7 @@ #include #include #include +#include #include #include #include Index: user/ntuser/input.c =================================================================== --- user/ntuser/input.c (revision 69259) +++ user/ntuser/input.c (working copy) @@ -132,10 +132,12 @@ 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 @@ NT_ASSERT(ghMouseDevice == NULL); NT_ASSERT(ghKeyboardDevice == NULL); + PoRequestShutdownEvent(&ShutdownEvent); for (;;) { if (!ghMouseDevice) @@ -189,6 +192,7 @@ /* Reset WaitHandles array */ cWaitObjects = 0; + WaitObjects[cWaitObjects++] = ShutdownEvent; WaitObjects[cWaitObjects++] = MasterTimer; if (ghMouseDevice) @@ -241,7 +245,7 @@ KernelMode, TRUE, NULL,//&WaitTimeout, - NULL); + WaitBlockArray); if ((Status >= STATUS_WAIT_0) && (Status < (STATUS_WAIT_0 + (LONG)cWaitObjects))) @@ -264,6 +268,10 @@ { ProcessTimers(); } + else if (pSignaledObject == ShutdownEvent) + { + break; + } else ASSERT(FALSE); } } @@ -302,6 +310,23 @@ 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"); } Index: user/winsrv/usersrv/init.c =================================================================== --- user/winsrv/usersrv/init.c (revision 69259) +++ user/winsrv/usersrv/init.c (working copy) @@ -102,7 +102,7 @@ CreateSystemThreads(PVOID pParam) { NtUserCallOneParam((DWORD)pParam, ONEPARAM_ROUTINE_CREATESYSTEMTHREADS); - DPRINT1("This thread should not terminate!\n"); + RtlExitUserThread(0); return 0; }