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);
NT_ASSERT(ghMouseDevice == NULL);
NT_ASSERT(ghKeyboardDevice == NULL);
+ PoRequestShutdownEvent(&ShutdownEvent);
for (;;)
{
if (!ghMouseDevice)
/* Reset WaitHandles array */
cWaitObjects = 0;
+ WaitObjects[cWaitObjects++] = ShutdownEvent;
WaitObjects[cWaitObjects++] = MasterTimer;
if (ghMouseDevice)
KernelMode,
TRUE,
NULL,//&WaitTimeout,
- NULL);
+ WaitBlockArray);
if ((Status >= STATUS_WAIT_0) &&
(Status < (STATUS_WAIT_0 + (LONG)cWaitObjects)))
{
ProcessTimers();
}
+ else if (pSignaledObject == ShutdownEvent)
+ {
+ break;
+ }
else ASSERT(FALSE);
}
}
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");
}