ReactOS 0.4.16-dev-2491-g3dc6630
input.c
Go to the documentation of this file.
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS Win32k subsystem
4 * PURPOSE: General input functions
5 * FILE: win32ss/user/ntuser/input.c
6 * PROGRAMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
7 * Rafal Harabien (rafalh@reactos.org)
8 */
9
10#include <win32k.h>
12
13/* LastRITEventTickCount update cycle has been adjusted from 60s to 1s since NT6 */
14#if (NTDDI_VERSION < NTDDI_VISTA)
15#define LAST_RIT_EVENT_UPDATE_INTERVAL 60000UL
16#else
17#define LAST_RIT_EVENT_UPDATE_INTERVAL 1000UL
18#endif
19
20/* GLOBALS *******************************************************************/
21
27
30
31/* FUNCTIONS *****************************************************************/
32
33/*
34 * IntLastInputTick
35 *
36 * Updates or gets last input tick count
37 */
38static DWORD FASTCALL
40{
41 if (bUpdate)
42 {
44 if (gpsi)
45 {
46 gpsi->dwLastRITEventTickCount = LastInputTick;
47 if (gpsi->dwLastRITEventTickCount - gpsi->dwLastSystemRITEventTickCountUpdate >
49 {
50 SharedUserData->LastSystemRITEventTickCount = LastInputTick;
51 gpsi->dwLastSystemRITEventTickCountUpdate = LastInputTick;
52 }
53 }
54 }
55 return LastInputTick;
56}
57
58/*
59 * DoTheScreenSaver
60 *
61 * Check if screensaver should be started and sends message to SAS window
62 */
65{
66 DWORD Test, TO;
67
68 if (gspv.iScrSaverTimeout > 0) // Zero means Off.
69 {
72 TO = 1000 * gspv.iScrSaverTimeout;
73 if (Test > TO)
74 {
75 TRACE("Screensaver Message Start! Tick %lu Timeout %d \n", Test, gspv.iScrSaverTimeout);
76
77 if (ppiScrnSaver) // We are or we are not the screensaver, prevent reentry...
78 {
79 if (!(ppiScrnSaver->W32PF_flags & W32PF_IDLESCREENSAVER))
80 {
81 ppiScrnSaver->W32PF_flags |= W32PF_IDLESCREENSAVER;
82 ERR("Screensaver is Idle\n");
83 }
84 }
85 else
86 {
88 if (ForegroundQueue && ForegroundQueue->spwndActive)
90 else
92 }
93 }
94 }
95}
96
97/*
98 * OpenInputDevice
99 *
100 * Opens input device for asynchronous access
101 */
102static
104OpenInputDevice(PHANDLE pHandle, PFILE_OBJECT *ppObject, CONST WCHAR *pszDeviceName)
105{
110
111 RtlInitUnicodeString(&DeviceName, pszDeviceName);
112
114 &DeviceName,
116 NULL,
117 NULL);
118
119 Status = ZwOpenFile(pHandle,
122 &Iosb,
123 0,
124 0);
125 if (NT_SUCCESS(Status) && ppObject)
126 {
129 }
130
131 return Status;
132}
133
134/*
135 * RawInputThreadMain
136 *
137 * Reads data from input devices and supports win32 timers
138 */
141{
142 NTSTATUS MouStatus = STATUS_UNSUCCESSFUL, KbdStatus = STATUS_UNSUCCESSFUL, Status;
143 IO_STATUS_BLOCK MouIosb, KbdIosb;
144 PFILE_OBJECT pKbdDevice = NULL, pMouDevice = NULL;
146 //LARGE_INTEGER WaitTimeout;
147 PVOID WaitObjects[4], pSignaledObject = NULL;
149 ULONG cWaitObjects = 0, cMaxWaitObjects = 2;
150 MOUSE_INPUT_DATA MouseInput;
151 KEYBOARD_INPUT_DATA KeyInput;
153 HWINSTA hWinSta;
154
155 ByteOffset.QuadPart = (LONGLONG)0;
156 //WaitTimeout.QuadPart = (LONGLONG)(-10000000);
157
161
162 TRACE("Raw Input Thread %p\n", ptiRawInput);
163
166
168 0,
169 NULL,
172 UserMode,
173 (PHANDLE)&hWinSta);
174 if (NT_SUCCESS(Status))
175 {
177 }
178 else
179 {
180 ASSERT(FALSE);
181 /* Failed to open the interactive winsta! What now? */
182 }
183
186 UserLeave();
187
190
192 for (;;)
193 {
194 if (!ghMouseDevice)
195 {
196 /* Check if mouse device already exists */
197 Status = OpenInputDevice(&ghMouseDevice, &pMouDevice, L"\\Device\\PointerClass0" );
198 if (NT_SUCCESS(Status))
199 {
200 ++cMaxWaitObjects;
201 TRACE("Mouse connected!\n");
202 }
203 }
204 if (!ghKeyboardDevice)
205 {
206 /* Check if keyboard device already exists */
207 Status = OpenInputDevice(&ghKeyboardDevice, &pKbdDevice, L"\\Device\\KeyboardClass0");
208 if (NT_SUCCESS(Status))
209 {
210 ++cMaxWaitObjects;
211 TRACE("Keyboard connected!\n");
212 // Get and load keyboard attributes.
215 // Register the Window hotkey.
217 // Register the Window Snap hotkey.
222 // Register the debug hotkeys.
224 UserLeave();
225 }
226 }
227
228 /* Reset WaitHandles array */
229 cWaitObjects = 0;
230 WaitObjects[cWaitObjects++] = ShutdownEvent;
231 WaitObjects[cWaitObjects++] = MasterTimer;
232
233 if (ghMouseDevice)
234 {
235 /* Try to read from mouse if previous reading is not pending */
236 if (MouStatus != STATUS_PENDING)
237 {
238 MouStatus = ZwReadFile(ghMouseDevice,
239 NULL,
240 NULL,
241 NULL,
242 &MouIosb,
243 &MouseInput,
244 sizeof(MOUSE_INPUT_DATA),
245 &ByteOffset,
246 NULL);
247 }
248
249 if (MouStatus == STATUS_PENDING)
250 WaitObjects[cWaitObjects++] = &pMouDevice->Event;
251 }
252
254 {
255 /* Try to read from keyboard if previous reading is not pending */
256 if (KbdStatus != STATUS_PENDING)
257 {
258 KbdStatus = ZwReadFile(ghKeyboardDevice,
259 NULL,
260 NULL,
261 NULL,
262 &KbdIosb,
263 &KeyInput,
264 sizeof(KEYBOARD_INPUT_DATA),
265 &ByteOffset,
266 NULL);
267
268 }
269 if (KbdStatus == STATUS_PENDING)
270 WaitObjects[cWaitObjects++] = &pKbdDevice->Event;
271 }
272
273 /* If all objects are pending, wait for them */
274 if (cWaitObjects == cMaxWaitObjects)
275 {
276 Status = KeWaitForMultipleObjects(cWaitObjects,
277 WaitObjects,
278 WaitAny,
281 TRUE,
282 NULL,//&WaitTimeout,
284
285 if ((Status >= STATUS_WAIT_0) &&
286 (Status < (STATUS_WAIT_0 + (LONG)cWaitObjects)))
287 {
288 /* Some device has finished reading */
289 pSignaledObject = WaitObjects[Status - STATUS_WAIT_0];
290
291 /* Check if it is mouse or keyboard and update status */
292 if ((MouStatus == STATUS_PENDING) &&
293 (pSignaledObject == &pMouDevice->Event))
294 {
295 MouStatus = MouIosb.Status;
296 }
297 else if ((KbdStatus == STATUS_PENDING) &&
298 (pSignaledObject == &pKbdDevice->Event))
299 {
300 KbdStatus = KbdIosb.Status;
301 }
302 else if (pSignaledObject == MasterTimer)
303 {
305 }
306 else if (pSignaledObject == ShutdownEvent)
307 {
308 break;
309 }
310 else ASSERT(FALSE);
311 }
312 }
313
314 /* Have we successed reading from mouse? */
315 if (NT_SUCCESS(MouStatus) && MouStatus != STATUS_PENDING)
316 {
317 TRACE("MouseEvent\n");
318
319 /* Set LastInputTick */
321
322 /* Process data */
324 UserProcessMouseInput(&MouseInput);
325 UserLeave();
326 }
327 else if (MouStatus != STATUS_PENDING)
328 ERR("Failed to read from mouse: %x.\n", MouStatus);
329
330 /* Have we successed reading from keyboard? */
331 if (NT_SUCCESS(KbdStatus) && KbdStatus != STATUS_PENDING)
332 {
333 TRACE("KeyboardEvent: %s %04x\n",
334 (KeyInput.Flags & KEY_BREAK) ? "up" : "down",
335 KeyInput.MakeCode);
336
337 /* Set LastInputTick */
339
340 /* Process data */
342 UserProcessKeyboardInput(&KeyInput);
343 UserLeave();
344 }
345 else if (KbdStatus != STATUS_PENDING)
346 ERR("Failed to read from keyboard: %x.\n", KbdStatus);
347 }
348
349 if (ghMouseDevice)
350 {
353 ObDereferenceObject(pMouDevice);
355 }
356
358 {
361 ObDereferenceObject(pKbdDevice);
363 }
364
365 ERR("Raw Input Thread Exit!\n");
366}
367
368/*
369 * InitInputImpl
370 *
371 * Inits input implementation
372 */
373CODE_SEG("INIT")
375NTAPI
377{
379 if (!MasterTimer)
380 {
381 ERR("Failed to allocate memory\n");
382 ASSERT(FALSE);
383 return STATUS_UNSUCCESSFUL;
384 }
386
387 return STATUS_SUCCESS;
388}
389
392{
393 PTHREADINFO OldBlock;
394 ASSERT(pti);
395
396 if(!pti->rpdesk || ((pti->TIF_flags & TIF_INCLEANUP) && BlockIt))
397 {
398 /*
399 * Fail blocking if exiting the thread
400 */
401
402 return FALSE;
403 }
404
405 /*
406 * FIXME: Check access rights of the window station
407 * e.g. services running in the service window station cannot block input
408 */
409 if(!ThreadHasInputAccess(pti) ||
411 {
413 return FALSE;
414 }
415
416 ASSERT(pti->rpdesk);
417 OldBlock = pti->rpdesk->BlockInputThread;
418 if(OldBlock)
419 {
420 if(OldBlock != pti)
421 {
423 return FALSE;
424 }
425 pti->rpdesk->BlockInputThread = (BlockIt ? pti : NULL);
426 return OldBlock == NULL;
427 }
428
429 pti->rpdesk->BlockInputThread = (BlockIt ? pti : NULL);
430 return OldBlock == NULL;
431}
432
433BOOL
436 BOOL BlockIt)
437{
438 BOOL ret;
439
440 TRACE("Enter NtUserBlockInput\n");
442
444
445 UserLeave();
446 TRACE("Leave NtUserBlockInput, ret=%i\n", ret);
447
448 return ret;
449}
450
451BOOL
454{
456 PATTACHINFO pai;
457 BOOL Ret = TRUE;
458 PTHREADINFO ptiFrom = NULL, ptiTo = NULL;
459
460 do
461 {
462 if (!gpai) return TRUE;
463
464 pai = gpai; // Bottom of the list.
465
466 do
467 {
468 if (pai->pti2 == pti)
469 {
470 ptiFrom = pai->pti1;
471 ptiTo = pti;
472 break;
473 }
474 if (pai->pti1 == pti)
475 {
476 ptiFrom = pti;
477 ptiTo = pai->pti2;
478 break;
479 }
480 pai = pai->paiNext;
481
482 } while (pai);
483
484 if (!pai && !ptiFrom && !ptiTo) break;
485
486 Status = UserAttachThreadInput(ptiFrom, ptiTo, FALSE);
487 if (!NT_SUCCESS(Status)) Ret = FALSE;
488
489 } while (Ret);
490
491 return Ret;
492}
493
494// Win: zzzAttachThreadInput
497{
498 MSG msg;
499 PATTACHINFO pai;
500 PCURICON_OBJECT CurIcon;
501
502 /* Can not be the same thread. */
503 if (ptiFrom == ptiTo) return STATUS_INVALID_PARAMETER;
504
505 /* Do not attach to system threads or between different desktops. */
506 if (ptiFrom->TIF_flags & TIF_DONTATTACHQUEUE ||
508 ptiFrom->rpdesk != ptiTo->rpdesk)
510
511 /* MSDN Note:
512 Keyboard and mouse events received by both threads are processed by the thread specified by the idAttachTo.
513 */
514
515 /* If Attach set, allocate and link. */
516 if (fAttach)
517 {
519 if (!pai) return STATUS_NO_MEMORY;
520
521 pai->paiNext = gpai;
522 pai->pti1 = ptiFrom;
523 pai->pti2 = ptiTo;
524 gpai = pai;
525 paiCount++;
526 ERR("Attach Allocated! ptiFrom 0x%p ptiTo 0x%p paiCount %d\n",ptiFrom,ptiTo,paiCount);
527
528 if (ptiTo->MessageQueue != ptiFrom->MessageQueue)
529 {
530
531 ptiTo->MessageQueue->iCursorLevel -= ptiFrom->iCursorLevel;
532
533 if (ptiFrom->MessageQueue == gpqForeground)
534 {
535 ERR("ptiFrom is Foreground\n");
536 ptiTo->MessageQueue->spwndActive = ptiFrom->MessageQueue->spwndActive;
537 ptiTo->MessageQueue->spwndFocus = ptiFrom->MessageQueue->spwndFocus;
538 ptiTo->MessageQueue->spwndCapture = ptiFrom->MessageQueue->spwndCapture;
539 ptiTo->MessageQueue->QF_flags ^= ((ptiTo->MessageQueue->QF_flags ^ ptiFrom->MessageQueue->QF_flags) & QF_CAPTURELOCKED);
540 RtlCopyMemory(&ptiTo->MessageQueue->CaretInfo,
541 &ptiFrom->MessageQueue->CaretInfo,
542 sizeof(ptiTo->MessageQueue->CaretInfo));
545 gptiForeground = ptiTo;
546 }
547 else
548 {
549 ERR("ptiFrom NOT Foreground\n");
550 if ( ptiTo->MessageQueue->spwndActive == 0 )
551 ptiTo->MessageQueue->spwndActive = ptiFrom->MessageQueue->spwndActive;
552 if ( ptiTo->MessageQueue->spwndFocus == 0 )
553 ptiTo->MessageQueue->spwndFocus = ptiFrom->MessageQueue->spwndFocus;
554 }
555
556 CurIcon = ptiFrom->MessageQueue->CursorObject;
557
558 MsqDestroyMessageQueue(ptiFrom);
559
560 if (CurIcon)
561 {
562 // Could be global. Keep it above the water line!
563 UserReferenceObject(CurIcon);
564 }
565
566 if (CurIcon && UserObjectInDestroy(UserHMGetHandle(CurIcon)))
567 {
568 UserDereferenceObject(CurIcon);
569 CurIcon = NULL;
570 }
571
572 ptiFrom->MessageQueue = ptiTo->MessageQueue;
573
574 // Pass cursor From if To is null. Pass test_SetCursor parent_id == current pti ID.
575 if (CurIcon && ptiTo->MessageQueue->CursorObject == NULL)
576 {
577 ERR("ptiTo receiving ptiFrom Cursor\n");
578 ptiTo->MessageQueue->CursorObject = CurIcon;
579 }
580
581 ptiFrom->MessageQueue->cThreads++;
582 ERR("ptiTo S Share count %u\n", ptiFrom->MessageQueue->cThreads);
583
585 }
586 else
587 {
588 ERR("Attach Threads are already associated!\n");
589 }
590 }
591 else /* If clear, unlink and free it. */
592 {
593 BOOL Hit = FALSE;
594 PATTACHINFO *ppai;
595
596 if (!gpai) return STATUS_INVALID_PARAMETER;
597
598 /* Search list and free if found or return false. */
599 ppai = &gpai;
600 while (*ppai != NULL)
601 {
602 if ( (*ppai)->pti2 == ptiTo && (*ppai)->pti1 == ptiFrom )
603 {
604 pai = *ppai;
605 /* Remove it from the list */
606 *ppai = (*ppai)->paiNext;
608 paiCount--;
609 Hit = TRUE;
610 break;
611 }
612 ppai = &((*ppai)->paiNext);
613 }
614
615 if (!Hit) return STATUS_INVALID_PARAMETER;
616
617 ERR("Attach Free! ptiFrom 0x%p ptiTo 0x%p paiCount %d\n",ptiFrom,ptiTo,paiCount);
618
619 if (ptiTo->MessageQueue == ptiFrom->MessageQueue)
620 {
621 PWND spwndActive = ptiTo->MessageQueue->spwndActive;
622 PWND spwndFocus = ptiTo->MessageQueue->spwndFocus;
623
624 if (gptiForeground == ptiFrom)
625 {
626 ERR("ptiTo is now pti FG.\n");
627 // MessageQueue foreground is set so switch threads.
628 gptiForeground = ptiTo;
629 }
630 ptiTo->MessageQueue->cThreads--;
631 ERR("ptiTo E Share count %u\n", ptiTo->MessageQueue->cThreads);
632 ASSERT(ptiTo->MessageQueue->cThreads >= 1);
633
635
636 ptiFrom->MessageQueue = MsqCreateMessageQueue(ptiFrom);
637
638 if (spwndActive)
639 {
640 if (spwndActive->head.pti == ptiFrom)
641 {
642 ptiFrom->MessageQueue->spwndActive = spwndActive;
643 ptiTo->MessageQueue->spwndActive = 0;
644 }
645 }
646 if (spwndFocus)
647 {
648 if (spwndFocus->head.pti == ptiFrom)
649 {
650 ptiFrom->MessageQueue->spwndFocus = spwndFocus;
651 ptiTo->MessageQueue->spwndFocus = 0;
652 }
653 }
654 ptiTo->MessageQueue->iCursorLevel -= ptiFrom->iCursorLevel;
655 }
656 else
657 {
658 ERR("Detaching Threads are not associated!\n");
659 }
660 }
661 /* Note that key state, which can be ascertained by calls to the GetKeyState
662 or GetKeyboardState function, is reset after a call to AttachThreadInput.
663 ATM which one?
664 */
665 RtlCopyMemory(ptiTo->MessageQueue->afKeyState, gafAsyncKeyState, sizeof(gafAsyncKeyState));
666
667 ptiTo->MessageQueue->msgDblClk.message = 0;
668
669 /* Generate mouse move message */
670 msg.message = WM_MOUSEMOVE;
671 msg.wParam = UserGetMouseButtonsState();
672 msg.lParam = MAKELPARAM(gpsi->ptCursor.x, gpsi->ptCursor.y);
673 msg.pt = gpsi->ptCursor;
675
676 return STATUS_SUCCESS;
677}
678
679BOOL
682 IN DWORD idAttach,
683 IN DWORD idAttachTo,
684 IN BOOL fAttach)
685{
687 PTHREADINFO pti, ptiTo;
688 BOOL Ret = FALSE;
689
691 TRACE("Enter NtUserAttachThreadInput %s\n",(fAttach ? "TRUE" : "FALSE" ));
692
693 pti = IntTID2PTI(UlongToHandle(idAttach));
694 ptiTo = IntTID2PTI(UlongToHandle(idAttachTo));
695
696 if ( !pti || !ptiTo )
697 {
698 TRACE("AttachThreadInput pti or ptiTo NULL.\n");
700 goto Exit;
701 }
702
703 Status = UserAttachThreadInput( pti, ptiTo, fAttach);
704 if (!NT_SUCCESS(Status))
705 {
706 TRACE("AttachThreadInput Error Status 0x%x. \n",Status);
708 }
709 else Ret = TRUE;
710
711Exit:
712 TRACE("Leave NtUserAttachThreadInput, ret=%d\n",Ret);
713 UserLeave();
714 return Ret;
715}
716
717/*
718 * NtUserSendInput
719 *
720 * Generates input events from software
721 */
722UINT
725 UINT nInputs,
726 LPINPUT pInput,
727 INT cbSize)
728{
729 PTHREADINFO pti;
730 UINT uRet = 0;
731
732 TRACE("Enter NtUserSendInput\n");
734
736 ASSERT(pti);
737
738 if (!pti->rpdesk)
739 {
740 goto cleanup;
741 }
742
743 if (!nInputs || !pInput || cbSize != sizeof(INPUT))
744 {
746 goto cleanup;
747 }
748
749 /*
750 * FIXME: Check access rights of the window station
751 * e.g. services running in the service window station cannot block input
752 */
753 if (!ThreadHasInputAccess(pti) ||
755 {
757 goto cleanup;
758 }
759
760 while (nInputs--)
761 {
762 INPUT SafeInput;
764
765 Status = MmCopyFromCaller(&SafeInput, pInput++, sizeof(INPUT));
766 if (!NT_SUCCESS(Status))
767 {
769 goto cleanup;
770 }
771
772 switch (SafeInput.type)
773 {
774 case INPUT_MOUSE:
775 if (UserSendMouseInput(&SafeInput.mi, TRUE))
776 uRet++;
777 break;
778 case INPUT_KEYBOARD:
779 if (UserSendKeyboardInput(&SafeInput.ki, TRUE))
780 uRet++;
781 break;
782 case INPUT_HARDWARE:
783 FIXME("INPUT_HARDWARE not supported!\n");
784 break;
785 default:
786 ERR("SendInput(): Invalid input type: 0x%x\n", SafeInput.type);
787 break;
788 }
789 }
790
791cleanup:
792 TRACE("Leave NtUserSendInput, ret=%u\n", uRet);
793 UserLeave();
794 return uRet;
795}
796
797/* EOF */
#define CODE_SEG(...)
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
#define msg(x)
Definition: auth_time.c:54
LONG NTSTATUS
Definition: precomp.h:26
#define FIXME(fmt,...)
Definition: precomp.h:53
#define ERR(fmt,...)
Definition: precomp.h:57
#define UlongToHandle(ul)
Definition: basetsd.h:91
#define DBG_DEFAULT_CHANNEL(ch)
Definition: debug.h:106
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
Definition: conport.c:36
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
static HANDLE ShutdownEvent
Definition: dcomlaunch.c:28
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define APIENTRY
Definition: api.h:79
#define ERROR_INVALID_PARAMETER
Definition: compat.h:101
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
static void cleanup(void)
Definition: main.c:1335
return ret
Definition: mutex.c:146
#define L(x)
Definition: resources.c:13
return Iosb
Definition: create.c:4403
#define EngGetTickCount32()
Definition: eng.h:43
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define PsGetCurrentThread()
Definition: env_spec_w32.h:81
#define NonPagedPool
Definition: env_spec_w32.h:307
#define PagedPool
Definition: env_spec_w32.h:308
IN PDCB IN PCCB IN VBO IN OUT PULONG OUT PDIRENT OUT PBCB OUT PVBO ByteOffset
Definition: fatprocs.h:732
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
PUSER_MESSAGE_QUEUE gpqForeground
Definition: focus.c:13
_Must_inspect_result_ _In_ WAIT_TYPE _In_opt_ PLARGE_INTEGER _In_opt_ PKWAIT_BLOCK WaitBlockArray
Definition: fsrtlfuncs.h:1153
Status
Definition: gdiplustypes.h:25
#define IDHK_SNAP_LEFT
Definition: hotkey.h:20
#define IDHK_WINKEY
Definition: hotkey.h:16
#define IDHK_SNAP_UP
Definition: hotkey.h:22
#define IDHK_SNAP_DOWN
Definition: hotkey.h:23
#define IDHK_SNAP_RIGHT
Definition: hotkey.h:21
PSERVERINFO gpsi
Definition: imm.c:18
#define TIF_INCLEANUP
Definition: ntuser.h:263
#define TIF_DONTATTACHQUEUE
Definition: ntuser.h:269
#define UserHMGetHandle(obj)
Definition: ntuser.h:230
#define PWND_BOTTOM
Definition: ntuser.h:769
struct _THREADINFO * GetW32ThreadInfo(VOID)
Definition: misc.c:807
#define TIF_SYSTEMTHREAD
Definition: ntuser.h:265
#define LOW_REALTIME_PRIORITY
#define ASSERT(a)
Definition: mode.c:44
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
#define InitializeObjectAttributes(p, n, a, r, s)
Definition: reg.c:106
VOID FASTCALL co_MsqInsertMouseMessage(MSG *Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: msgqueue.c:580
VOID FASTCALL MsqDestroyMessageQueue(_In_ PTHREADINFO pti)
Definition: msgqueue.c:2423
PUSER_MESSAGE_QUEUE FASTCALL MsqCreateMessageQueue(PTHREADINFO pti)
Definition: msgqueue.c:2396
#define QF_CAPTURELOCKED
Definition: msgqueue.h:111
#define IntReferenceMessageQueue(MsgQueue)
Definition: msgqueue.h:217
#define IntDereferenceMessageQueue(MsgQueue)
Definition: msgqueue.h:220
unsigned int UINT
Definition: ndis.h:50
#define KernelMode
Definition: asm.h:38
#define UserMode
Definition: asm.h:39
NTSYSAPI NTSTATUS NTAPI ZwCancelIoFile(_In_ HANDLE FileHandle, _Out_ PIO_STATUS_BLOCK IoStatusBlock)
NTSYSAPI NTSTATUS NTAPI ZwOpenFile(_Out_ PHANDLE FileHandle, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes, _Out_ PIO_STATUS_BLOCK IoStatusBlock, _In_ ULONG ShareAccess, _In_ ULONG OpenOptions)
#define SYNCHRONIZE
Definition: nt_native.h:61
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
#define FASTCALL
Definition: nt_native.h:50
#define FILE_ALL_ACCESS
Definition: nt_native.h:651
#define MAXIMUM_ALLOWED
Definition: nt_native.h:83
#define KEY_BREAK
Definition: ntddkbd.h:71
@ WaitAny
NTSTATUS NTAPI KeWaitForMultipleObjects(IN ULONG Count, IN PVOID Object[], IN WAIT_TYPE WaitType, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL, OUT PKWAIT_BLOCK WaitBlockArray OPTIONAL)
Definition: wait.c:586
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
PVOID *typedef PHANDLE
Definition: ntsecpkg.h:455
#define STATUS_WAIT_0
Definition: ntstatus.h:330
PWINSTATION_OBJECT InputWindowStation
Definition: winsta.c:21
HWND hwndSAS
Definition: winsta.c:24
BOOL FASTCALL UserSetProcessWindowStation(HWINSTA hWindowStation)
Definition: winsta.c:1393
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:258
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:249
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: obhandle.c:3379
NTSTATUS NTAPI ObOpenObjectByPointer(IN PVOID Object, IN ULONG HandleAttributes, IN PACCESS_STATE PassedAccessState, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PHANDLE Handle)
Definition: obhandle.c:2742
NTSTATUS NTAPI ObReferenceObjectByHandle(IN HANDLE Handle, IN ACCESS_MASK DesiredAccess, IN POBJECT_TYPE ObjectType, IN KPROCESSOR_MODE AccessMode, OUT PVOID *Object, OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL)
Definition: obref.c:494
#define CONST
Definition: pedump.c:81
long LONG
Definition: pedump.c:60
#define MmCopyFromCaller
Definition: polytest.cpp:29
NTSTATUS NTAPI PoRequestShutdownEvent(OUT PVOID *Event)
Definition: poshtdwn.c:384
#define OBJ_KERNEL_HANDLE
Definition: winternl.h:231
#define SharedUserData
#define STATUS_SUCCESS
Definition: shellext.h:65
static void Exit(void)
Definition: sock.c:1330
#define TRACE(s)
Definition: solgame.cpp:4
PTHREADINFO pti2
Definition: input.h:45
struct _ATTACHINFO * paiNext
Definition: input.h:43
PTHREADINFO pti1
Definition: input.h:44
INT iScrSaverTimeout
Definition: sysparams.h:110
struct _CLIENTINFO * pClientInfo
Definition: win32.h:94
INT iCursorLevel
Definition: win32.h:127
FLONG TIF_flags
Definition: win32.h:95
struct _DESKTOP * rpdesk
Definition: win32.h:92
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:89
Definition: ntuser.h:694
THRDESKHEAD head
Definition: ntuser.h:695
KEYBDINPUT ki
Definition: winable.h:62
DWORD type
Definition: winable.h:59
MOUSEINPUT mi
Definition: winable.h:61
#define STATUS_PENDING
Definition: telnetd.h:14
KPRIORITY NTAPI KeSetPriorityThread(IN PKTHREAD Thread, IN KPRIORITY Priority)
Definition: thrdobj.c:1300
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
Definition: timerobj.c:233
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
int64_t LONGLONG
Definition: typedefs.h:68
#define NTAPI
Definition: typedefs.h:36
int32_t INT
Definition: typedefs.h:58
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define IN
Definition: typedefs.h:39
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_ACCESS_DENIED
Definition: udferr_usr.h:145
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define WM_LOGONNOTIFY
Definition: undocuser.h:39
#define LN_START_SCREENSAVE
Definition: undocuser.h:122
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3281
#define W32PF_IDLESCREENSAVER
Definition: win32.h:27
POBJECT_TYPE ExWindowStationObjectType
Definition: win32k.c:21
VOID FASTCALL SetLastNtError(_In_ NTSTATUS Status)
Definition: error.c:31
VOID FASTCALL IntSetFocusMessageQueue(PUSER_MESSAGE_QUEUE NewQueue)
Definition: desktop.c:1336
PUSER_MESSAGE_QUEUE FASTCALL IntGetFocusMessageQueue(VOID)
Definition: desktop.c:1324
#define IntIsActiveDesktop(Desktop)
Definition: desktop.h:172
PTHREADINFO gptiForeground
Definition: focus.c:15
BOOL FASTCALL UserRegisterHotKey(PWND pWnd, int id, UINT fsModifiers, UINT vk)
Definition: hotkey.c:451
VOID FASTCALL SetDebugHotKeys(VOID)
Definition: hotkey.c:46
PATTACHINFO gpai
Definition: input.c:24
BOOL APIENTRY NtUserBlockInput(BOOL BlockIt)
Definition: input.c:435
BOOL FASTCALL IsRemoveAttachThread(PTHREADINFO pti)
Definition: input.c:453
static NTSTATUS NTAPI OpenInputDevice(PHANDLE pHandle, PFILE_OBJECT *ppObject, CONST WCHAR *pszDeviceName)
Definition: input.c:104
static HANDLE ghMouseDevice
Definition: input.c:29
BOOL FASTCALL IntBlockInput(PTHREADINFO pti, BOOL BlockIt)
Definition: input.c:391
UINT APIENTRY NtUserSendInput(UINT nInputs, LPINPUT pInput, INT cbSize)
Definition: input.c:724
VOID FASTCALL DoTheScreenSaver(VOID)
Definition: input.c:64
HANDLE ghKeyboardDevice
Definition: input.c:26
VOID NTAPI RawInputThreadMain(VOID)
Definition: input.c:140
INT paiCount
Definition: input.c:25
PTHREADINFO ptiRawInput
Definition: input.c:22
NTSTATUS FASTCALL UserAttachThreadInput(PTHREADINFO ptiFrom, PTHREADINFO ptiTo, BOOL fAttach)
Definition: input.c:496
NTSTATUS NTAPI InitInputImpl(VOID)
Definition: input.c:376
static DWORD FASTCALL IntLastInputTick(BOOL bUpdate)
Definition: input.c:39
static DWORD LastInputTick
Definition: input.c:28
BOOL APIENTRY NtUserAttachThreadInput(IN DWORD idAttach, IN DWORD idAttachTo, IN BOOL fAttach)
Definition: input.c:681
PKTIMER MasterTimer
Definition: input.c:23
#define LAST_RIT_EVENT_UPDATE_INTERVAL
Definition: input.c:17
VOID NTAPI UserProcessKeyboardInput(PKEYBOARD_INPUT_DATA pKeyInput)
Definition: keyboard.c:1414
VOID NTAPI UserProcessMouseInput(PMOUSE_INPUT_DATA pMouseInputData)
Definition: mouse.c:40
WORD FASTCALL UserGetMouseButtonsState(VOID)
Definition: mouse.c:22
BYTE gafAsyncKeyState[256 *2/8]
Definition: keyboard.c:13
BOOL NTAPI UserSendKeyboardInput(KEYBDINPUT *pKbdInput, BOOL bInjected)
Definition: keyboard.c:1333
#define ThreadHasInputAccess(W32Thread)
Definition: input.h:65
BOOL NTAPI UserSendMouseInput(MOUSEINPUT *pMouseInput, BOOL bInjected)
Definition: mouse.c:168
VOID NTAPI UserInitKeyboard(HANDLE hKeyboardDevice)
Definition: keyboard.c:178
PPROCESSINFO ppiScrnSaver
Definition: main.c:30
BOOL FASTCALL UserPostMessage(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1395
PTHREADINFO FASTCALL IntTID2PTI(HANDLE id)
Definition: misc.c:42
BOOL FASTCALL UserDereferenceObject(PVOID Object)
Definition: object.c:644
BOOL FASTCALL UserObjectInDestroy(HANDLE h)
Definition: object.c:703
VOID FASTCALL UserReferenceObject(PVOID obj)
Definition: object.c:731
SPIVALUES gspv
Definition: sysparams.c:17
#define USERTAG_SYSTEM
Definition: tags.h:282
#define USERTAG_ATTACHINFO
Definition: tags.h:197
VOID FASTCALL ProcessTimers(VOID)
Definition: timer.c:452
VOID FASTCALL StartTheTimers(VOID)
Definition: timer.c:374
#define INPUT_HARDWARE
Definition: winable.h:11
#define INPUT_KEYBOARD
Definition: winable.h:10
#define INPUT_MOUSE
Definition: winable.h:9
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:22
NTSYSAPI ULONG WINAPI RtlNtStatusToDosError(NTSTATUS)
#define MAKELPARAM(l, h)
Definition: winuser.h:4116
#define MOD_WIN
Definition: winuser.h:2686
#define VK_UP
Definition: winuser.h:2261
#define WM_MOUSEMOVE
Definition: winuser.h:1803
#define VK_LEFT
Definition: winuser.h:2260
#define VK_RIGHT
Definition: winuser.h:2262
#define VK_DOWN
Definition: winuser.h:2263
* PFILE_OBJECT
Definition: iotypes.h:1998
@ UserRequest
Definition: ketypes.h:473
#define ObDereferenceObject
Definition: obfuncs.h:203
#define NT_ASSERT
Definition: rtlfuncs.h:3327
__wchar_t WCHAR
Definition: xmlstorage.h:180