static DWORD WINAPI PumpConsoleInput(LPVOID Parameter) { HANDLE ConsoleInput = (HANDLE)Parameter; INPUT_RECORD InputRecord; DWORD Count; while (VdmRunning) { /* Make sure the task event is signaled */ WaitForSingleObject(VdmTaskEvent, INFINITE); /* Wait for an input record */ if (!ReadConsoleInput(ConsoleInput, &InputRecord, 1, &Count)) { DWORD LastError = GetLastError(); DPRINT1("Error reading console input (0x%p, %lu) - Error %lu\n", ConsoleInput, Count, LastError); return LastError; } ASSERT(Count != 0); /* Check the event type */ switch (InputRecord.EventType) { /* * Hardware events */ case KEY_EVENT: KeyboardEventHandler(&InputRecord.Event.KeyEvent); break; case MOUSE_EVENT: MouseEventHandler(&InputRecord.Event.MouseEvent); break; case WINDOW_BUFFER_SIZE_EVENT: ScreenEventHandler(&InputRecord.Event.WindowBufferSizeEvent); break; /* * Interface events */ case MENU_EVENT: MenuEventHandler(&InputRecord.Event.MenuEvent); break; case FOCUS_EVENT: FocusEventHandler(&InputRecord.Event.FocusEvent); break; default: break; } } return 0; }
static DWORD WINAPI ConsoleEventThread(LPVOID Parameter) { HANDLE ConsoleInput = (HANDLE)Parameter; HANDLE WaitHandles[2]; DWORD WaitResult; /* * For optimization purposes, Windows (and hence ReactOS, too, for * compatibility reasons) uses a static buffer if no more than five * input records are read. Otherwise a new buffer is used. * The client-side expects that we know this behaviour. * See consrv/coninput.c * * We exploit here this optimization by also using a buffer of 5 records. */ INPUT_RECORD InputRecords[5]; ULONG NumRecords, i; WaitHandles[0] = VdmTaskEvent; WaitHandles[1] = GetConsoleInputWaitHandle(); while (VdmRunning) { /* Make sure the task event is signaled */ WaitResult = WaitForMultipleObjects(ARRAYSIZE(WaitHandles), WaitHandles, TRUE, INFINITE); switch (WaitResult) { case WAIT_OBJECT_0 + 0: case WAIT_OBJECT_0 + 1: break; default: return GetLastError(); } /* Wait for an input record */ if (!ReadConsoleInputExW(ConsoleInput, InputRecords, ARRAYSIZE(InputRecords), &NumRecords, CONSOLE_READ_CONTINUE)) { DWORD LastError = GetLastError(); DPRINT1("Error reading console input (0x%p, %lu) - Error %lu\n", ConsoleInput, NumRecords, LastError); return LastError; } // ASSERT(NumRecords != 0); if (NumRecords == 0) { DPRINT1("Got NumRecords == 0!\n"); continue; } /* Dispatch the events */ for (i = 0; i < NumRecords; i++) { /* Check the event type */ switch (InputRecords[i].EventType) { /* * Hardware events */ case KEY_EVENT: KeyboardEventHandler(&InputRecords[i].Event.KeyEvent); break; case MOUSE_EVENT: MouseEventHandler(&InputRecords[i].Event.MouseEvent); break; case WINDOW_BUFFER_SIZE_EVENT: ScreenEventHandler(&InputRecords[i].Event.WindowBufferSizeEvent); break; /* * Interface events */ case MENU_EVENT: MenuEventHandler(&InputRecords[i].Event.MenuEvent); break; case FOCUS_EVENT: FocusEventHandler(&InputRecords[i].Event.FocusEvent); break; default: DPRINT1("Unknown input event type 0x%04x\n", InputRecords[i].EventType); break; } } /* Let the console subsystem queue some new events */ Sleep(10); } return 0; }