ReactOS 0.4.17-dev-1133-gc25e4fd
input.h File Reference
#include <ndk/kbd.h>
#include <hidclass.h>
Include dependency graph for input.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

struct  tagKBDNLSLAYER
 
struct  tagKBDFILE
 
struct  tagKL
 
struct  _ATTACHINFO
 
struct  _MOUSE_DEVICE_INFO
 
struct  _KEYBOARD_DEVICE_INFO
 
struct  _HID_DEVICE_INFO
 
struct  _INPUT_DEVICE_INFO
 

Macros

#define KS_DOWN_BIT   0x80
 
#define KS_LOCK_BIT   0x01
 
#define SC_KEY_UP   0x8000
 
#define LP_DO_NOT_CARE_BIT   (1<<25)
 
#define ThreadHasInputAccess(W32Thread)   (TRUE)
 
#define GET_KS_BYTE(vk)   ((vk) * 2 / 8)
 
#define GET_KS_DOWN_BIT(vk)   (1 << (((vk) % 4)*2))
 
#define GET_KS_LOCK_BIT(vk)   (1 << (((vk) % 4)*2 + 1))
 
#define IS_KEY_DOWN(ks, vk)   (((ks)[GET_KS_BYTE(vk)] & GET_KS_DOWN_BIT(vk)) ? TRUE : FALSE)
 
#define IS_KEY_LOCKED(ks, vk)   (((ks)[GET_KS_BYTE(vk)] & GET_KS_LOCK_BIT(vk)) ? TRUE : FALSE)
 
#define SET_KEY_DOWN(ks, vk, down)
 
#define SET_KEY_LOCKED(ks, vk, down)
 

Typedefs

typedef struct tagKBDNLSLAYER KBDNLSLAYER
 
typedef struct tagKBDNLSLAYER * PKBDNLSLAYER
 
typedef struct tagKBDFILE KBDFILE
 
typedef struct tagKBDFILE * PKBDFILE
 
typedef struct tagKL KL
 
typedef struct tagKL * PKL
 
typedef struct _ATTACHINFO ATTACHINFO
 
typedef struct _ATTACHINFO * PATTACHINFO
 
typedef struct _MOUSE_DEVICE_INFO MOUSE_DEVICE_INFO
 
typedef struct _MOUSE_DEVICE_INFO * PMOUSE_DEVICE_INFO
 
typedef struct _KEYBOARD_DEVICE_INFO KEYBOARD_DEVICE_INFO
 
typedef struct _KEYBOARD_DEVICE_INFO * PKEYBOARD_DEVICE_INFO
 
typedef struct _HID_DEVICE_INFO HID_DEVICE_INFO
 
typedef struct _HID_DEVICE_INFO * PHID_DEVICE_INFO
 
typedef struct _INPUT_DEVICE_INFO INPUT_DEVICE_INFO
 
typedef struct _INPUT_DEVICE_INFO * PINPUT_DEVICE_INFO
 

Functions

 CODE_SEG ("INIT") NTSTATUS NTAPI InitInputImpl(VOID)
 
VOID NTAPI RawInputThreadMain (VOID)
 
BOOL FASTCALL IntBlockInput (PTHREADINFO W32Thread, BOOL BlockIt)
 
NTSTATUS FASTCALL UserAttachThreadInput (PTHREADINFO, PTHREADINFO, BOOL)
 
BOOL FASTCALL IsRemoveAttachThread (PTHREADINFO)
 
VOID FASTCALL DoTheScreenSaver (VOID)
 
VOID NTAPI UserInitKeyboard (HANDLE hKeyboardDevice)
 
PKL W32kGetDefaultKeyLayout (VOID)
 
VOID NTAPI UserProcessKeyboardInput (PINPUT_DEVICE_INFO pDeviceInfo, PKEYBOARD_INPUT_DATA pKeyInput)
 
BOOL NTAPI UserSendKeyboardInput (KEYBDINPUT *pKbdInput, BOOL bInjected)
 
PKL NTAPI UserHklToKbl (HKL hKl)
 
BOOL NTAPI UserSetDefaultInputLang (HKL hKl)
 
WORD FASTCALL UserGetMouseButtonsState (VOID)
 
VOID NTAPI UserProcessMouseInput (PINPUT_DEVICE_INFO pDeviceInfo, PMOUSE_INPUT_DATA pMouseInputData)
 
BOOL NTAPI UserSendMouseInput (MOUSEINPUT *pMouseInput, BOOL bInjected)
 
HRAWINPUT FASTCALL UserCreateRawInput (PTHREADINFO pti, DWORD dwType, HANDLE hDevice, WPARAM wParam, CONST VOID *pData, UINT cbData)
 
BOOL FASTCALL UserGetRawInputTarget (DWORD dwType, PTHREADINFO *ppti, HWND *phwndTarget, WPARAM *pwParam)
 
BOOL FASTCALL UserFreeRawInput (PUSER_MESSAGE_QUEUE MessageQueue, HRAWINPUT hRawInput)
 
VOID FASTCALL UserUpdatePrevRawInput (PTHREADINFO pti, CONST MSG *pMsg)
 
VOID FASTCALL UserCleanupRawInput (PUSER_MESSAGE_QUEUE MessageQueue)
 
UINT FASTCALL IntImmProcessKey (_In_ PUSER_MESSAGE_QUEUE MessageQueue, _In_ PWND pWnd, _In_ UINT uMsg, _In_ WPARAM wParam, _In_ LPARAM lParam)
 
VOID FASTCALL IntFreeImeHotKeys (VOID)
 
FORCEINLINE VOID AcquireDeviceInfoListMutex (VOID)
 
FORCEINLINE VOID ReleaseDeviceInfoListMutex (VOID)
 

Variables

PATTACHINFO gpai
 
DWORD gdwLanguageToggleKey
 
DWORD gdwLayoutToggleKey
 
BOOL gbEnableHexNumpad
 
BOOLEAN RawInputEnabled
 
DWORD gSystemFS
 
UINT gSystemCPCharSet
 
HANDLE ghKeyboardDevice
 
PTHREADINFO ptiRawInput
 
BYTE gafAsyncKeyState [256 *2/8]
 
PINPUT_DEVICE_INFO gpInputDeviceInfo
 
PERESOURCE gpDeviceInfoListMutex
 
PKL gspklBaseLayout
 
KEYBOARD_ATTRIBUTES gKeyboardInfo
 

Macro Definition Documentation

◆ GET_KS_BYTE

#define GET_KS_BYTE (   vk)    ((vk) * 2 / 8)

Definition at line 171 of file input.h.

◆ GET_KS_DOWN_BIT

#define GET_KS_DOWN_BIT (   vk)    (1 << (((vk) % 4)*2))

Definition at line 172 of file input.h.

◆ GET_KS_LOCK_BIT

#define GET_KS_LOCK_BIT (   vk)    (1 << (((vk) % 4)*2 + 1))

Definition at line 173 of file input.h.

◆ IS_KEY_DOWN

#define IS_KEY_DOWN (   ks,
  vk 
)    (((ks)[GET_KS_BYTE(vk)] & GET_KS_DOWN_BIT(vk)) ? TRUE : FALSE)

Definition at line 174 of file input.h.

◆ IS_KEY_LOCKED

#define IS_KEY_LOCKED (   ks,
  vk 
)    (((ks)[GET_KS_BYTE(vk)] & GET_KS_LOCK_BIT(vk)) ? TRUE : FALSE)

Definition at line 175 of file input.h.

◆ KS_DOWN_BIT

#define KS_DOWN_BIT   0x80

Definition at line 88 of file input.h.

◆ KS_LOCK_BIT

#define KS_LOCK_BIT   0x01

Definition at line 89 of file input.h.

◆ LP_DO_NOT_CARE_BIT

#define LP_DO_NOT_CARE_BIT   (1<<25)

Definition at line 93 of file input.h.

◆ SC_KEY_UP

#define SC_KEY_UP   0x8000

Definition at line 91 of file input.h.

◆ SET_KEY_DOWN

#define SET_KEY_DOWN (   ks,
  vk,
  down 
)
Value:
(ks)[GET_KS_BYTE(vk)] = ((down) ? \
((ks)[GET_KS_BYTE(vk)] | GET_KS_DOWN_BIT(vk)) : \
((ks)[GET_KS_BYTE(vk)] & ~GET_KS_DOWN_BIT(vk)))
unsigned short vk
Definition: console.c:118
#define down(mutex)
Definition: glue.h:29
#define GET_KS_DOWN_BIT(vk)
Definition: input.h:172
#define GET_KS_BYTE(vk)
Definition: input.h:171

Definition at line 176 of file input.h.

◆ SET_KEY_LOCKED

#define SET_KEY_LOCKED (   ks,
  vk,
  down 
)
Value:
(ks)[GET_KS_BYTE(vk)] = ((down) ? \
((ks)[GET_KS_BYTE(vk)] | GET_KS_LOCK_BIT(vk)) : \
((ks)[GET_KS_BYTE(vk)] & ~GET_KS_LOCK_BIT(vk)))
#define GET_KS_LOCK_BIT(vk)
Definition: input.h:173

Definition at line 179 of file input.h.

◆ ThreadHasInputAccess

#define ThreadHasInputAccess (   W32Thread)    (TRUE)

Definition at line 103 of file input.h.

Typedef Documentation

◆ ATTACHINFO

◆ HID_DEVICE_INFO

◆ INPUT_DEVICE_INFO

◆ KBDFILE

◆ KBDNLSLAYER

◆ KEYBOARD_DEVICE_INFO

◆ KL

typedef struct tagKL KL

◆ MOUSE_DEVICE_INFO

◆ PATTACHINFO

◆ PHID_DEVICE_INFO

◆ PINPUT_DEVICE_INFO

◆ PKBDFILE

◆ PKBDNLSLAYER

◆ PKEYBOARD_DEVICE_INFO

◆ PKL

typedef struct tagKL * PKL

◆ PMOUSE_DEVICE_INFO

Function Documentation

◆ AcquireDeviceInfoListMutex()

FORCEINLINE VOID AcquireDeviceInfoListMutex ( VOID  )

Definition at line 157 of file input.h.

158{
161}
#define TRUE
Definition: types.h:120
#define ExAcquireResourceExclusiveLite(res, wait)
Definition: env_spec_w32.h:615
#define KeEnterCriticalRegion()
Definition: ke_x.h:88
PERESOURCE gpDeviceInfoListMutex
Definition: input.c:28

Referenced by NtUserGetRawInputDeviceInfo(), and NtUserGetRawInputDeviceList().

◆ CODE_SEG()

CODE_SEG ( "INIT"  )

Definition at line 1810 of file Interface.c.

1817{
1818 UNICODE_STRING DeviceName = RTL_CONSTANT_STRING(L"\\FileSystem\\Filters\\"DRIVER_NAME);
1819 PDEVICE_OBJECT RawDeviceObject;
1821 PFILE_OBJECT RawFileObject;
1823 UNICODE_STRING SymLink;
1824
1826
1829
1830 /* Save the registry key for this driver */
1834 RegistryPath->MaximumLength,
1838
1839 /* Do some initialization */
1841
1842 /* Create the main filter manager device object */
1844 0,
1845 &DeviceName,
1848 FALSE,
1849 &DeviceObject);
1850 if (!NT_SUCCESS(Status))
1851 {
1852 DPRINT1("fltmgr IoCreateDevice failed. Status = %X\n", Status);
1853 goto Cleanup;
1854 }
1855
1856 /* Store a global reference so we can access from callbacks */
1858
1859 /* Generate the symbolic link name */
1860 RtlInitUnicodeString(&SymLink, L"\\??\\"DRIVER_NAME);
1862 if (!NT_SUCCESS(Status)) goto Cleanup;
1863
1864 /* Create the callbacks for the dispatch table, FastIo and FS callbacks */
1866 if (!NT_SUCCESS(Status)) goto Cleanup;
1867
1868 /* Initialize the comms objects */
1870 if (!NT_SUCCESS(Status)) goto Cleanup;
1871
1872 /* Register for notifications when a new file system is loaded. This also enumerates any existing file systems */
1874 FLT_ASSERT(Status != STATUS_DEVICE_ALREADY_ATTACHED); // Windows checks for this, I'm not sure how it can happen. Needs investigation??
1875 if (!NT_SUCCESS(Status)) goto Cleanup;
1876
1879
1880 /* IoRegisterFsRegistrationChange isn't notified about the raw file systems, so we attach to them manually */
1881 RtlInitUnicodeString(&ObjectName, L"\\Device\\RawDisk");
1884 &RawFileObject,
1885 &RawDeviceObject);
1886 if (NT_SUCCESS(Status))
1887 {
1888 FltpFsNotification(RawDeviceObject, TRUE);
1889 ObDereferenceObject(RawFileObject);
1890 }
1891
1892 RtlInitUnicodeString(&ObjectName, L"\\Device\\RawCdRom");
1895 &RawFileObject,
1896 &RawDeviceObject);
1897 if (NT_SUCCESS(Status))
1898 {
1899 FltpFsNotification(RawDeviceObject, TRUE);
1900 ObDereferenceObject(RawFileObject);
1901 }
1902
1903 /* We're done, clear the initializing flag */
1906
1907Cleanup:
1908
1909 if (!NT_SUCCESS(Status))
1910 {
1912 {
1913 DriverObject->FastIoDispatch = NULL;
1915 }
1916
1917 IoDeleteSymbolicLink(&SymLink);
1918
1919 if (DeviceObject)
1921
1924 }
1925
1926 return Status;
1927}
LIST_ENTRY FilterList
Definition: Filter.c:24
DRIVER_FS_NOTIFICATION FltpFsNotification
Definition: Interface.c:1699
ERESOURCE FilterListLock
Definition: Filter.c:25
static NTSTATUS SetupDispatchAndCallbacksTables(_In_ PDRIVER_OBJECT DriverObject)
Definition: Interface.c:1739
DRIVER_DATA DriverData
Definition: Interface.c:35
LONG NTSTATUS
Definition: precomp.h:26
#define DPRINT1
Definition: precomp.h:8
#define FILE_DEVICE_SECURE_OPEN
Definition: cdrw_usr.h:46
#define NULL
Definition: types.h:112
#define FALSE
Definition: types.h:117
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:33
#define RTL_CONSTANT_STRING(s)
Definition: combase.c:35
static const WCHAR Cleanup[]
Definition: register.c:80
#define L(x)
Definition: resources.c:13
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
NTSTATUS ExInitializeResourceLite(PULONG res)
Definition: env_spec_w32.h:641
#define DO_DEVICE_INITIALIZING
Definition: env_spec_w32.h:399
#define NonPagedPool
Definition: env_spec_w32.h:307
#define InitializeListHead(ListHead)
Definition: env_spec_w32.h:944
#define ClearFlag(_F, _SF)
Definition: ext2fs.h:191
#define DRIVER_NAME
Definition: ext2fs.h:136
#define FLT_ASSERT(_e)
Definition: fltkernel.h:49
#define FM_TAG_REGISTRY_DATA
Definition: fltmgr.h:18
#define FM_TAG_DISPATCH_TABLE
Definition: fltmgr.h:17
NTSTATUS FltpSetupCommunicationObjects(_In_ PDRIVER_OBJECT DriverObject)
Definition: Messaging.c:377
Status
Definition: gdiplustypes.h:24
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1109
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
#define FILE_READ_ATTRIBUTES
Definition: nt_native.h:647
NTSYSAPI VOID NTAPI RtlInitUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
NTSTATUS NTAPI IoCreateDevice(IN PDRIVER_OBJECT DriverObject, IN ULONG DeviceExtensionSize, IN PUNICODE_STRING DeviceName, IN DEVICE_TYPE DeviceType, IN ULONG DeviceCharacteristics, IN BOOLEAN Exclusive, OUT PDEVICE_OBJECT *DeviceObject)
Definition: device.c:1038
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1261
NTSTATUS NTAPI IoGetDeviceObjectPointer(IN PUNICODE_STRING ObjectName, IN ACCESS_MASK DesiredAccess, OUT PFILE_OBJECT *FileObject, OUT PDEVICE_OBJECT *DeviceObject)
Definition: device.c:1455
NTSTATUS NTAPI IoRegisterFsRegistrationChange(IN PDRIVER_OBJECT DriverObject, IN PDRIVER_FS_NOTIFICATION DriverNotificationRoutine)
Definition: volume.c:1089
#define STATUS_DEVICE_ALREADY_ATTACHED
Definition: ntstatus.h:386
#define FILE_DEVICE_DISK_FILE_SYSTEM
Definition: winioctl.h:53
#define STATUS_SUCCESS
Definition: shellext.h:65
PDRIVER_OBJECT DriverObject
Definition: fltmgr.h:31
UNICODE_STRING ServiceKey
Definition: fltmgr.h:33
PFAST_IO_DISPATCH FastIoDispatch
Definition: fltmgr.h:37
FAST_MUTEX FilterAttachLock
Definition: fltmgr.h:39
PDEVICE_OBJECT DeviceObject
Definition: fltmgr.h:32
USHORT MaximumLength
Definition: env_spec_w32.h:370
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:262
uint16_t * PWCHAR
Definition: typedefs.h:56
#define STATUS_INSUFFICIENT_RESOURCES
Definition: udferr_usr.h:158
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2061
_Must_inspect_result_ _In_ PWDFDEVICE_INIT _In_opt_ PCUNICODE_STRING DeviceName
Definition: wdfdevice.h:3281
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:215
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
Definition: wdfdriver.h:213
_In_ PVOID _Out_opt_ PULONG_PTR _Outptr_opt_ PCUNICODE_STRING * ObjectName
Definition: cmfuncs.h:64
FORCEINLINE VOID ExInitializeFastMutex(_Out_ PFAST_MUTEX FastMutex)
Definition: exfuncs.h:274
* PFILE_OBJECT
Definition: iotypes.h:1998
#define ObDereferenceObject
Definition: obfuncs.h:203

◆ DoTheScreenSaver()

VOID FASTCALL DoTheScreenSaver ( VOID  )

Definition at line 66 of file input.c.

67{
68 DWORD Test, TO;
69
70 if (gspv.iScrSaverTimeout > 0) // Zero means Off.
71 {
74 TO = 1000 * gspv.iScrSaverTimeout;
75 if (Test > TO)
76 {
77 TRACE("Screensaver Message Start! Tick %lu Timeout %d \n", Test, gspv.iScrSaverTimeout);
78
79 if (ppiScrnSaver) // We are or we are not the screensaver, prevent reentry...
80 {
81 if (!(ppiScrnSaver->W32PF_flags & W32PF_IDLESCREENSAVER))
82 {
83 ppiScrnSaver->W32PF_flags |= W32PF_IDLESCREENSAVER;
84 ERR("Screensaver is Idle\n");
85 }
86 }
87 else
88 {
90 if (ForegroundQueue && ForegroundQueue->spwndActive)
92 else
94 }
95 }
96 }
97}
#define ERR(fmt,...)
Definition: precomp.h:57
#define EngGetTickCount32()
Definition: eng.h:43
unsigned long DWORD
Definition: ntddk_ex.h:95
HWND hwndSAS
Definition: winsta.c:24
#define TRACE(s)
Definition: solgame.cpp:4
INT iScrSaverTimeout
Definition: sysparams.h:110
#define WM_LOGONNOTIFY
Definition: undocuser.h:39
#define LN_START_SCREENSAVE
Definition: undocuser.h:122
#define W32PF_IDLESCREENSAVER
Definition: win32.h:27
PUSER_MESSAGE_QUEUE FASTCALL IntGetFocusMessageQueue(VOID)
Definition: desktop.c:1335
static DWORD LastInputTick
Definition: input.c:30
PPROCESSINFO ppiScrnSaver
Definition: main.c:30
BOOL FASTCALL UserPostMessage(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1397
SPIVALUES gspv
Definition: sysparams.c:17

Referenced by HungAppSysTimerProc().

◆ IntBlockInput()

BOOL FASTCALL IntBlockInput ( PTHREADINFO  W32Thread,
BOOL  BlockIt 
)

Definition at line 419 of file input.c.

420{
421 PTHREADINFO OldBlock;
422 ASSERT(pti);
423
424 if(!pti->rpdesk || ((pti->TIF_flags & TIF_INCLEANUP) && BlockIt))
425 {
426 /*
427 * Fail blocking if exiting the thread
428 */
429
430 return FALSE;
431 }
432
433 /*
434 * FIXME: Check access rights of the window station
435 * e.g. services running in the service window station cannot block input
436 */
437 if(!ThreadHasInputAccess(pti) ||
438 !IntIsActiveDesktop(pti->rpdesk))
439 {
441 return FALSE;
442 }
443
444 ASSERT(pti->rpdesk);
445 OldBlock = pti->rpdesk->BlockInputThread;
446 if(OldBlock)
447 {
448 if(OldBlock != pti)
449 {
451 return FALSE;
452 }
453 pti->rpdesk->BlockInputThread = (BlockIt ? pti : NULL);
454 return OldBlock == NULL;
455 }
456
457 pti->rpdesk->BlockInputThread = (BlockIt ? pti : NULL);
458 return OldBlock == NULL;
459}
#define IntIsActiveDesktop(Desktop)
Definition: desktop.h:174
#define ERROR_ACCESS_DENIED
Definition: compat.h:97
#define TIF_INCLEANUP
Definition: ntuser.h:266
#define ASSERT(a)
Definition: mode.c:44
struct _DESKTOP * rpdesk
Definition: win32.h:93
#define ThreadHasInputAccess(W32Thread)
Definition: input.h:103
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:21

Referenced by ExitThreadCallback(), and NtUserBlockInput().

◆ IntFreeImeHotKeys()

VOID FASTCALL IntFreeImeHotKeys ( VOID  )

Definition at line 345 of file ime.c.

346{
347 PIMEHOTKEY pNode, pNext;
348 for (pNode = gpImeHotKeyList; pNode; pNode = pNext)
349 {
350 pNext = pNode->pNext;
352 }
354}
PIMEHOTKEY gpImeHotKeyList
Definition: ime.c:35
struct tagIMEHOTKEY * pNext
Definition: ime.c:28
#define USERTAG_IMEHOTKEY
Definition: tags.h:239

Referenced by IntSetImeHotKey(), and UserProcessDestroy().

◆ IntImmProcessKey()

UINT FASTCALL IntImmProcessKey ( _In_ PUSER_MESSAGE_QUEUE  MessageQueue,
_In_ PWND  pWnd,
_In_ UINT  uMsg,
_In_ WPARAM  wParam,
_In_ LPARAM  lParam 
)

Definition at line 603 of file ime.c.

609{
610 UINT uVirtualKey, ret;
611 DWORD dwHotKeyId;
612 PKL pKL;
613 PIMC pIMC;
614 PIMEHOTKEY pImeHotKey;
615 HKL hKL;
616 HWND hWnd;
617
618 ASSERT_REFS_CO(pWnd);
619
620 switch (uMsg)
621 {
622 case WM_KEYDOWN:
623 case WM_KEYUP:
624 case WM_SYSKEYDOWN:
625 case WM_SYSKEYUP:
626 break;
627
628 default:
629 return 0;
630 }
631
632 pIMC = NULL;
633 hWnd = UserHMGetHandle(pWnd);
634 pKL = pWnd->head.pti->KeyboardLayout;
635 if (!pKL)
636 return 0;
637
638 uVirtualKey = LOBYTE(wParam);
639 pImeHotKey = IntCheckImeHotKey(MessageQueue, uVirtualKey, lParam);
640 if (pImeHotKey)
641 {
642 dwHotKeyId = pImeHotKey->dwHotKeyId;
643 hKL = pImeHotKey->hKL;
644 }
645 else
646 {
647 dwHotKeyId = INVALID_HOTKEY;
648 hKL = NULL;
649 }
650
651 if (IME_HOTKEY_DSWITCH_FIRST <= dwHotKeyId && dwHotKeyId <= IME_HOTKEY_DSWITCH_LAST)
652 {
653 if (pKL->hkl != hKL)
654 {
655 UserPostMessage(hWnd, WM_INPUTLANGCHANGEREQUEST,
656 ((pKL->dwFontSigs & gSystemFS) ? INPUTLANGCHANGE_SYSCHARSET : 0),
657 (LPARAM)hKL);
658 }
659
660 if (IntGetImeCompatFlags(pWnd->head.pti) & 0x800000)
661 return 0;
662
663 return IPHK_HOTKEY;
664 }
665
666 if (!IS_IMM_MODE())
667 {
668 if (dwHotKeyId != INVALID_HOTKEY)
669 WARN("!IS_IMM_MODE(): dwHotKeyId 0x%X\n", dwHotKeyId);
670
671 return 0;
672 }
673
674 if (dwHotKeyId == INVALID_HOTKEY)
675 {
676 if (!pKL->piiex)
677 return 0;
678
679 if (pWnd->hImc)
680 pIMC = UserGetObject(gHandleTable, pWnd->hImc, TYPE_INPUTCONTEXT);
681 if (!pIMC)
682 return 0;
683
684 if ((HIWORD(lParam) & KF_UP) &&
686 {
687 return 0;
688 }
689
690 switch (uVirtualKey)
691 {
692 case VK_DBE_CODEINPUT:
695 case VK_DBE_HIRAGANA:
696 case VK_DBE_KATAKANA:
698 case VK_DBE_NOROMAN:
699 case VK_DBE_ROMAN:
700 break;
701
702 default:
703 {
704 if (uMsg == WM_SYSKEYDOWN || uMsg == WM_SYSKEYUP)
705 {
706 if (uVirtualKey != VK_MENU && uVirtualKey != VK_F10)
707 return 0;
708 }
709
711 {
712 if (uVirtualKey == VK_MENU || (HIWORD(lParam) & KF_ALTDOWN))
713 return 0;
714 }
715 break;
716 }
717 }
718 }
719
720 if (LOBYTE(uVirtualKey) == VK_PACKET)
721 uVirtualKey = MAKELONG(wParam, GetW32ThreadInfo()->wchInjected);
722
723 ret = co_IntImmProcessKey(hWnd, pKL->hkl, uVirtualKey, lParam, dwHotKeyId);
724
725 if (IntGetImeCompatFlags(pWnd->head.pti) & 0x800000)
726 ret &= ~IPHK_HOTKEY;
727
728 return ret;
729}
HWND hWnd
Definition: settings.c:17
#define WARN(fmt,...)
Definition: precomp.h:61
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
return ret
Definition: mutex.c:147
unsigned int UINT
Definition: sysinfo.c:13
#define IME_HOTKEY_DSWITCH_LAST
Definition: imm.h:213
#define IME_HOTKEY_DSWITCH_FIRST
Definition: imm.h:212
#define IME_PROP_NEED_ALTKEY
Definition: immdev.h:347
#define IME_PROP_IGNORE_UPKEYS
Definition: immdev.h:346
#define UserHMGetHandle(obj)
Definition: ntuser.h:233
struct _THREADINFO * GetW32ThreadInfo(VOID)
Definition: misc.c:806
#define IS_IMM_MODE()
Definition: ntuser.h:1216
@ TYPE_INPUTCONTEXT
Definition: ntuser.h:60
#define LOBYTE(W)
Definition: jmemdos.c:487
#define VK_DBE_ROMAN
Definition: kbd.h:221
#define VK_DBE_HIRAGANA
Definition: kbd.h:218
#define VK_DBE_CODEINPUT
Definition: kbd.h:226
#define VK_DBE_NOROMAN
Definition: kbd.h:222
#define VK_DBE_KATAKANA
Definition: kbd.h:217
#define VK_DBE_ENTERWORDREGISTERMODE
Definition: kbd.h:223
#define VK_DBE_ENTERIMECONFIGMODE
Definition: kbd.h:224
#define VK_DBE_NOCODEINPUT
Definition: kbd.h:227
LONG_PTR LPARAM
Definition: minwindef.h:175
UINT_PTR HKL
Definition: msctf.idl:125
#define INVALID_HOTKEY
Definition: ime.c:17
static PIMEHOTKEY IntCheckImeHotKey(_In_ const USER_MESSAGE_QUEUE *MessageQueue, _In_ UINT uVirtualKey, _In_ LPARAM lParam)
Definition: ime.c:291
static DWORD FASTCALL IntGetImeCompatFlags(_In_opt_ PTHREADINFO pti)
Definition: ime.c:46
#define WM_KEYUP
Definition: winuser.h:1744
#define VK_F10
Definition: winuser.h:2300
#define KF_ALTDOWN
Definition: winuser.h:2485
#define KF_UP
Definition: winuser.h:2487
#define WM_SYSKEYUP
Definition: winuser.h:1748
#define WM_KEYDOWN
Definition: winuser.h:1743
#define WM_SYSKEYDOWN
Definition: winuser.h:1747
#define VK_MENU
Definition: winuser.h:2240
DWORD fdwProperty
Definition: immdev.h:22
Definition: ntuser.h:202
HKL hKL
Definition: ime.c:32
DWORD dwHotKeyId
Definition: ime.c:29
IMEINFO ImeInfo
Definition: imm32_undoc.h:75
Definition: input.h:28
PIMEINFOEX piiex
Definition: input.h:39
DWORD dwFontSigs
Definition: input.h:35
HEAD head
Definition: input.h:29
HKL hkl
Definition: input.h:33
#define MAKELONG(a, b)
Definition: typedefs.h:249
#define HIWORD(l)
Definition: typedefs.h:247
#define IPHK_HOTKEY
Definition: undocuser.h:140
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
DWORD APIENTRY co_IntImmProcessKey(HWND hWnd, HKL hKL, UINT vKey, LPARAM lParam, DWORD dwHotKeyID)
Definition: callback.c:1252
DWORD gSystemFS
Definition: kbdlayout.c:24
PVOID UserGetObject(PUSER_HANDLE_TABLE ht, HANDLE handle, HANDLE_TYPE type)
Definition: object.c:499
PUSER_HANDLE_TABLE gHandleTable
Definition: object.c:13

Referenced by co_IntProcessKeyboardMessage().

◆ IsRemoveAttachThread()

BOOL FASTCALL IsRemoveAttachThread ( PTHREADINFO  pti)

Definition at line 481 of file input.c.

482{
484 PATTACHINFO pai;
485 BOOL Ret = TRUE;
486 PTHREADINFO ptiFrom = NULL, ptiTo = NULL;
487
488 do
489 {
490 if (!gpai) return TRUE;
491
492 pai = gpai; // Bottom of the list.
493
494 do
495 {
496 if (pai->pti2 == pti)
497 {
498 ptiFrom = pai->pti1;
499 ptiTo = pti;
500 break;
501 }
502 if (pai->pti1 == pti)
503 {
504 ptiFrom = pti;
505 ptiTo = pai->pti2;
506 break;
507 }
508 pai = pai->paiNext;
509
510 } while (pai);
511
512 if (!pai && !ptiFrom && !ptiTo) break;
513
514 Status = UserAttachThreadInput(ptiFrom, ptiTo, FALSE);
515 if (!NT_SUCCESS(Status)) Ret = FALSE;
516
517 } while (Ret);
518
519 return Ret;
520}
unsigned int BOOL
Definition: ntddk_ex.h:94
PTHREADINFO pti2
Definition: input.h:46
struct _ATTACHINFO * paiNext
Definition: input.h:44
PTHREADINFO pti1
Definition: input.h:45
PATTACHINFO gpai
Definition: input.c:24
NTSTATUS FASTCALL UserAttachThreadInput(PTHREADINFO ptiFrom, PTHREADINFO ptiTo, BOOL fAttach)
Definition: input.c:523

Referenced by ExitThreadCallback().

◆ RawInputThreadMain()

VOID NTAPI RawInputThreadMain ( VOID  )

Definition at line 142 of file input.c.

143{
144 NTSTATUS MouStatus = STATUS_UNSUCCESSFUL, KbdStatus = STATUS_UNSUCCESSFUL, Status;
145 IO_STATUS_BLOCK MouIosb, KbdIosb;
146 PFILE_OBJECT pKbdDevice = NULL, pMouDevice = NULL;
148 //LARGE_INTEGER WaitTimeout;
149 PVOID WaitObjects[4], pSignaledObject = NULL;
151 ULONG cWaitObjects = 0, cMaxWaitObjects = 2;
152 MOUSE_INPUT_DATA MouseInput;
153 KEYBOARD_INPUT_DATA KeyInput;
155 HWINSTA hWinSta;
158
159 RtlZeroMemory(&Mouse, sizeof(Mouse));
160 Mouse.DeviceType = RIM_TYPEMOUSE;
161 RtlInitUnicodeString(&Mouse.DeviceName, L"\\Device\\PointerClass0");
162 Mouse.Mouse.Attributes.NumberOfButtons = 2;
163
165 Keyboard.DeviceType = RIM_TYPEKEYBOARD;
166 RtlInitUnicodeString(&Keyboard.DeviceName, L"\\Device\\KeyboardClass0");
167
168 ByteOffset.QuadPart = (LONGLONG)0;
169 //WaitTimeout.QuadPart = (LONGLONG)(-10000000);
170
174
175 TRACE("Raw Input Thread %p\n", ptiRawInput);
176
179
181 0,
182 NULL,
185 UserMode,
186 (PHANDLE)&hWinSta);
187 if (NT_SUCCESS(Status))
188 {
190 }
191 else
192 {
193 ASSERT(FALSE);
194 /* Failed to open the interactive winsta! What now? */
195 }
196
201
204 UserLeave();
205
208
210 for (;;)
211 {
212 if (!ghMouseDevice)
213 {
214 /* Check if mouse device already exists */
215 Status = OpenInputDevice(&ghMouseDevice, &pMouDevice, Mouse.DeviceName.Buffer);
216 if (NT_SUCCESS(Status))
217 {
218 ++cMaxWaitObjects;
219 TRACE("Mouse connected!\n");
220 Mouse.Handle = ghMouseDevice;
221 Mouse.pNextDeviceInfo = gpInputDeviceInfo;
223 }
224 }
225 if (!ghKeyboardDevice)
226 {
227 /* Check if keyboard device already exists */
228 Status = OpenInputDevice(&ghKeyboardDevice, &pKbdDevice, Keyboard.DeviceName.Buffer);
229 if (NT_SUCCESS(Status))
230 {
231 ++cMaxWaitObjects;
232 TRACE("Keyboard connected!\n");
233 Keyboard.Handle = ghKeyboardDevice;
234 Keyboard.pNextDeviceInfo = gpInputDeviceInfo;
236 // Get and load keyboard attributes.
238 Keyboard.Keyboard.Attributes = gKeyboardInfo;
240 // Register the Window hotkey.
242 // Register the Window Snap hotkey.
247 // Register the debug hotkeys.
249 UserLeave();
250 }
251 }
252
253 /* Reset WaitHandles array */
254 cWaitObjects = 0;
255 WaitObjects[cWaitObjects++] = ShutdownEvent;
256 WaitObjects[cWaitObjects++] = MasterTimer;
257
258 if (ghMouseDevice)
259 {
260 /* Try to read from mouse if previous reading is not pending */
261 if (MouStatus != STATUS_PENDING)
262 {
263 MouStatus = ZwReadFile(ghMouseDevice,
264 NULL,
265 NULL,
266 NULL,
267 &MouIosb,
268 &MouseInput,
269 sizeof(MOUSE_INPUT_DATA),
270 &ByteOffset,
271 NULL);
272 }
273
274 if (MouStatus == STATUS_PENDING)
275 WaitObjects[cWaitObjects++] = &pMouDevice->Event;
276 }
277
279 {
280 /* Try to read from keyboard if previous reading is not pending */
281 if (KbdStatus != STATUS_PENDING)
282 {
283 KbdStatus = ZwReadFile(ghKeyboardDevice,
284 NULL,
285 NULL,
286 NULL,
287 &KbdIosb,
288 &KeyInput,
289 sizeof(KEYBOARD_INPUT_DATA),
290 &ByteOffset,
291 NULL);
292
293 }
294 if (KbdStatus == STATUS_PENDING)
295 WaitObjects[cWaitObjects++] = &pKbdDevice->Event;
296 }
297
298 /* If all objects are pending, wait for them */
299 if (cWaitObjects == cMaxWaitObjects)
300 {
301 Status = KeWaitForMultipleObjects(cWaitObjects,
302 WaitObjects,
303 WaitAny,
306 TRUE,
307 NULL,//&WaitTimeout,
309
310 if ((Status >= STATUS_WAIT_0) &&
311 (Status < (STATUS_WAIT_0 + (LONG)cWaitObjects)))
312 {
313 /* Some device has finished reading */
314 pSignaledObject = WaitObjects[Status - STATUS_WAIT_0];
315
316 /* Check if it is mouse or keyboard and update status */
317 if ((MouStatus == STATUS_PENDING) &&
318 (pSignaledObject == &pMouDevice->Event))
319 {
320 MouStatus = MouIosb.Status;
321 }
322 else if ((KbdStatus == STATUS_PENDING) &&
323 (pSignaledObject == &pKbdDevice->Event))
324 {
325 KbdStatus = KbdIosb.Status;
326 }
327 else if (pSignaledObject == MasterTimer)
328 {
330 }
331 else if (pSignaledObject == ShutdownEvent)
332 {
333 break;
334 }
335 else ASSERT(FALSE);
336 }
337 }
338
339 /* Have we successed reading from mouse? */
340 if (NT_SUCCESS(MouStatus) && MouStatus != STATUS_PENDING)
341 {
342 TRACE("MouseEvent\n");
343
344 /* Set LastInputTick */
346
347 /* Process data */
349 UserProcessMouseInput(&Mouse, &MouseInput);
350 UserLeave();
351 }
352 else if (MouStatus != STATUS_PENDING)
353 ERR("Failed to read from mouse: %x.\n", MouStatus);
354
355 /* Have we successed reading from keyboard? */
356 if (NT_SUCCESS(KbdStatus) && KbdStatus != STATUS_PENDING)
357 {
358 TRACE("KeyboardEvent: %s %04x\n",
359 (KeyInput.Flags & KEY_BREAK) ? "up" : "down",
360 KeyInput.MakeCode);
361
362 /* Set LastInputTick */
364
365 /* Process data */
368 UserLeave();
369 }
370 else if (KbdStatus != STATUS_PENDING)
371 ERR("Failed to read from keyboard: %x.\n", KbdStatus);
372 }
373
374 if (ghMouseDevice)
375 {
378 ObDereferenceObject(pMouDevice);
380 }
381
383 {
386 ObDereferenceObject(pKbdDevice);
388 }
389
392
393 ERR("Raw Input Thread Exit!\n");
394}
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
static HANDLE ShutdownEvent
Definition: dcomlaunch.c:28
#define PsGetCurrentThread()
Definition: env_spec_w32.h:81
#define ExDeleteResourceLite(res)
Definition: env_spec_w32.h:647
IN PDCB IN PCCB IN VBO IN OUT PULONG OUT PDIRENT OUT PBCB OUT PVBO ByteOffset
Definition: fatprocs.h:732
_Must_inspect_result_ _In_ WAIT_TYPE _In_opt_ PLARGE_INTEGER _In_opt_ PKWAIT_BLOCK WaitBlockArray
Definition: fsrtlfuncs.h:1153
#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
@ Keyboard
Definition: i8042prt.h:115
@ Mouse
Definition: i8042prt.h:116
#define PWND_BOTTOM
Definition: ntuser.h:773
#define TIF_SYSTEMTHREAD
Definition: ntuser.h:268
#define LOW_REALTIME_PRIORITY
#define KernelMode
Definition: asm.h:38
#define UserMode
Definition: asm.h:39
NTSYSAPI NTSTATUS NTAPI ZwCancelIoFile(_In_ HANDLE FileHandle, _Out_ PIO_STATUS_BLOCK IoStatusBlock)
#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:599
PVOID *typedef PHANDLE
Definition: ntsecpkg.h:455
#define STATUS_WAIT_0
Definition: ntstatus.h:330
PWINSTATION_OBJECT InputWindowStation
Definition: winsta.c:21
BOOL FASTCALL UserSetProcessWindowStation(HWINSTA hWindowStation)
Definition: winsta.c:1614
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:255
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:247
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: obhandle.c:3411
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:2769
long LONG
Definition: pedump.c:60
NTSTATUS NTAPI PoRequestShutdownEvent(OUT PVOID *Event)
Definition: poshtdwn.c:384
#define MOD_WIN
Definition: winuser.h:2686
#define VK_UP
Definition: winuser.h:2261
#define VK_LEFT
Definition: winuser.h:2260
#define VK_RIGHT
Definition: winuser.h:2262
#define VK_DOWN
Definition: winuser.h:2263
struct _CLIENTINFO * pClientInfo
Definition: win32.h:95
FLONG TIF_flags
Definition: win32.h:96
#define STATUS_PENDING
Definition: telnetd.h:14
KPRIORITY NTAPI KeSetPriorityThread(IN PKTHREAD Thread, IN KPRIORITY Priority)
Definition: thrdobj.c:1300
int64_t LONGLONG
Definition: typedefs.h:68
uint32_t ULONG
Definition: typedefs.h:59
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
POBJECT_TYPE ExWindowStationObjectType
Definition: win32k.c:21
BOOL FASTCALL UserRegisterHotKey(PWND pWnd, int id, UINT fsModifiers, UINT vk)
Definition: hotkey.c:447
VOID FASTCALL SetDebugHotKeys(VOID)
Definition: hotkey.c:46
static NTSTATUS NTAPI OpenInputDevice(PHANDLE pHandle, PFILE_OBJECT *ppObject, CONST WCHAR *pszDeviceName)
Definition: input.c:106
static HANDLE ghMouseDevice
Definition: input.c:31
HANDLE ghKeyboardDevice
Definition: input.c:26
PTHREADINFO ptiRawInput
Definition: input.c:22
static DWORD FASTCALL IntLastInputTick(BOOL bUpdate)
Definition: input.c:41
PINPUT_DEVICE_INFO gpInputDeviceInfo
Definition: input.c:27
PKTIMER MasterTimer
Definition: input.c:23
PERESOURCE gpDeviceInfoListMutex
Definition: input.c:28
KEYBOARD_ATTRIBUTES gKeyboardInfo
Definition: keyboard.c:17
VOID NTAPI UserProcessKeyboardInput(PINPUT_DEVICE_INFO pDeviceInfo, PKEYBOARD_INPUT_DATA pKeyInput)
Definition: keyboard.c:1474
VOID NTAPI UserProcessMouseInput(PINPUT_DEVICE_INFO pDeviceInfo, PMOUSE_INPUT_DATA pMouseInputData)
Definition: mouse.c:104
VOID NTAPI UserInitKeyboard(HANDLE hKeyboardDevice)
Definition: keyboard.c:178
#define USERTAG_SYSTEM
Definition: tags.h:282
VOID FASTCALL ProcessTimers(VOID)
Definition: timer.c:452
VOID FASTCALL StartTheTimers(VOID)
Definition: timer.c:374
@ UserRequest
Definition: ketypes.h:473
#define NT_ASSERT
Definition: rtlfuncs.h:3334

Referenced by UserSystemThreadProc().

◆ ReleaseDeviceInfoListMutex()

FORCEINLINE VOID ReleaseDeviceInfoListMutex ( VOID  )

Definition at line 165 of file input.h.

166{
169}
#define KeLeaveCriticalRegion()
Definition: ke_x.h:119
VOID FASTCALL ExReleaseResourceLite(IN PERESOURCE Resource)
Definition: resource.c:1822

Referenced by NtUserGetRawInputDeviceInfo(), and NtUserGetRawInputDeviceList().

◆ UserAttachThreadInput()

NTSTATUS FASTCALL UserAttachThreadInput ( PTHREADINFO  ptiFrom,
PTHREADINFO  ptiTo,
BOOL  fAttach 
)

Definition at line 523 of file input.c.

524{
525 MSG msg;
526 PATTACHINFO pai;
527 PCURICON_OBJECT CurIcon;
528
529 /* Can not be the same thread. */
530 if (ptiFrom == ptiTo) return STATUS_INVALID_PARAMETER;
531
532 /* Do not attach to system threads or between different desktops. */
533 if (ptiFrom->TIF_flags & TIF_DONTATTACHQUEUE ||
535 ptiFrom->rpdesk != ptiTo->rpdesk)
537
538 /* MSDN Note:
539 Keyboard and mouse events received by both threads are processed by the thread specified by the idAttachTo.
540 */
541
542 /* If Attach set, allocate and link. */
543 if (fAttach)
544 {
546 if (!pai) return STATUS_NO_MEMORY;
547
548 pai->paiNext = gpai;
549 pai->pti1 = ptiFrom;
550 pai->pti2 = ptiTo;
551 gpai = pai;
552 paiCount++;
553 ERR("Attach Allocated! ptiFrom 0x%p ptiTo 0x%p paiCount %d\n",ptiFrom,ptiTo,paiCount);
554
555 if (ptiTo->MessageQueue != ptiFrom->MessageQueue)
556 {
557
558 ptiTo->MessageQueue->iCursorLevel -= ptiFrom->iCursorLevel;
559
560 if (ptiFrom->MessageQueue == gpqForeground)
561 {
562 ERR("ptiFrom is Foreground\n");
563 ptiTo->MessageQueue->spwndActive = ptiFrom->MessageQueue->spwndActive;
564 ptiTo->MessageQueue->spwndFocus = ptiFrom->MessageQueue->spwndFocus;
565 ptiTo->MessageQueue->spwndCapture = ptiFrom->MessageQueue->spwndCapture;
566 ptiTo->MessageQueue->QF_flags ^= ((ptiTo->MessageQueue->QF_flags ^ ptiFrom->MessageQueue->QF_flags) & QF_CAPTURELOCKED);
567 RtlCopyMemory(&ptiTo->MessageQueue->CaretInfo,
568 &ptiFrom->MessageQueue->CaretInfo,
569 sizeof(ptiTo->MessageQueue->CaretInfo));
572 gptiForeground = ptiTo;
573 }
574 else
575 {
576 ERR("ptiFrom NOT Foreground\n");
577 if ( ptiTo->MessageQueue->spwndActive == 0 )
578 ptiTo->MessageQueue->spwndActive = ptiFrom->MessageQueue->spwndActive;
579 if ( ptiTo->MessageQueue->spwndFocus == 0 )
580 ptiTo->MessageQueue->spwndFocus = ptiFrom->MessageQueue->spwndFocus;
581 }
582
583 CurIcon = ptiFrom->MessageQueue->CursorObject;
584
585 MsqDestroyMessageQueue(ptiFrom);
586
587 if (CurIcon)
588 {
589 // Could be global. Keep it above the water line!
590 UserReferenceObject(CurIcon);
591 }
592
593 if (CurIcon && UserObjectInDestroy(UserHMGetHandle(CurIcon)))
594 {
595 UserDereferenceObject(CurIcon);
596 CurIcon = NULL;
597 }
598
599 ptiFrom->MessageQueue = ptiTo->MessageQueue;
600
601 // Pass cursor From if To is null. Pass test_SetCursor parent_id == current pti ID.
602 if (CurIcon && ptiTo->MessageQueue->CursorObject == NULL)
603 {
604 ERR("ptiTo receiving ptiFrom Cursor\n");
605 ptiTo->MessageQueue->CursorObject = CurIcon;
606 }
607
608 ptiFrom->MessageQueue->cThreads++;
609 ERR("ptiTo S Share count %u\n", ptiFrom->MessageQueue->cThreads);
610
612 }
613 else
614 {
615 ERR("Attach Threads are already associated!\n");
616 }
617 }
618 else /* If clear, unlink and free it. */
619 {
620 BOOL Hit = FALSE;
621 PATTACHINFO *ppai;
622
623 if (!gpai) return STATUS_INVALID_PARAMETER;
624
625 /* Search list and free if found or return false. */
626 ppai = &gpai;
627 while (*ppai != NULL)
628 {
629 if ( (*ppai)->pti2 == ptiTo && (*ppai)->pti1 == ptiFrom )
630 {
631 pai = *ppai;
632 /* Remove it from the list */
633 *ppai = (*ppai)->paiNext;
635 paiCount--;
636 Hit = TRUE;
637 break;
638 }
639 ppai = &((*ppai)->paiNext);
640 }
641
642 if (!Hit) return STATUS_INVALID_PARAMETER;
643
644 ERR("Attach Free! ptiFrom 0x%p ptiTo 0x%p paiCount %d\n",ptiFrom,ptiTo,paiCount);
645
646 if (ptiTo->MessageQueue == ptiFrom->MessageQueue)
647 {
648 PWND spwndActive = ptiTo->MessageQueue->spwndActive;
649 PWND spwndFocus = ptiTo->MessageQueue->spwndFocus;
650
651 if (gptiForeground == ptiFrom)
652 {
653 ERR("ptiTo is now pti FG.\n");
654 // MessageQueue foreground is set so switch threads.
655 gptiForeground = ptiTo;
656 }
657 ptiTo->MessageQueue->cThreads--;
658 ERR("ptiTo E Share count %u\n", ptiTo->MessageQueue->cThreads);
659 ASSERT(ptiTo->MessageQueue->cThreads >= 1);
660
662
663 ptiFrom->MessageQueue = MsqCreateMessageQueue(ptiFrom);
664
665 if (spwndActive)
666 {
667 if (spwndActive->head.pti == ptiFrom)
668 {
669 ptiFrom->MessageQueue->spwndActive = spwndActive;
670 ptiTo->MessageQueue->spwndActive = 0;
671 }
672 }
673 if (spwndFocus)
674 {
675 if (spwndFocus->head.pti == ptiFrom)
676 {
677 ptiFrom->MessageQueue->spwndFocus = spwndFocus;
678 ptiTo->MessageQueue->spwndFocus = 0;
679 }
680 }
681 ptiTo->MessageQueue->iCursorLevel -= ptiFrom->iCursorLevel;
682 }
683 else
684 {
685 ERR("Detaching Threads are not associated!\n");
686 }
687 }
688 /* Note that key state, which can be ascertained by calls to the GetKeyState
689 or GetKeyboardState function, is reset after a call to AttachThreadInput.
690 ATM which one?
691 */
692 RtlCopyMemory(ptiTo->MessageQueue->afKeyState, gafAsyncKeyState, sizeof(gafAsyncKeyState));
693
694 ptiTo->MessageQueue->msgDblClk.message = 0;
695
696 /* Generate mouse move message */
697 msg.message = WM_MOUSEMOVE;
698 msg.wParam = UserGetMouseButtonsState();
699 msg.lParam = MAKELPARAM(gpsi->ptCursor.x, gpsi->ptCursor.y);
700 msg.pt = gpsi->ptCursor;
702
703 return STATUS_SUCCESS;
704}
#define msg(x)
Definition: auth_time.c:54
#define STATUS_NO_MEMORY
Definition: d3dkmdt.h:51
PTHREADINFO gptiForeground
Definition: focus.c:15
#define PagedPool
Definition: env_spec_w32.h:308
PUSER_MESSAGE_QUEUE gpqForeground
Definition: focus.c:13
PSERVERINFO gpsi
Definition: imm.c:18
#define TIF_DONTATTACHQUEUE
Definition: ntuser.h:272
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:2434
PUSER_MESSAGE_QUEUE FASTCALL MsqCreateMessageQueue(PTHREADINFO pti)
Definition: msgqueue.c:2407
#define QF_CAPTURELOCKED
Definition: msgqueue.h:114
#define IntReferenceMessageQueue(MsgQueue)
Definition: msgqueue.h:220
#define IntDereferenceMessageQueue(MsgQueue)
Definition: msgqueue.h:223
#define MAKELPARAM(l, h)
Definition: winuser.h:4116
#define WM_MOUSEMOVE
Definition: winuser.h:1803
INT iCursorLevel
Definition: win32.h:128
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:90
Definition: ntuser.h:698
THRDESKHEAD head
Definition: ntuser.h:699
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1829
#define RtlCopyMemory(Destination, Source, Length)
Definition: typedefs.h:263
#define STATUS_ACCESS_DENIED
Definition: udferr_usr.h:145
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
VOID FASTCALL IntSetFocusMessageQueue(PUSER_MESSAGE_QUEUE NewQueue)
Definition: desktop.c:1347
INT paiCount
Definition: input.c:25
WORD FASTCALL UserGetMouseButtonsState(VOID)
Definition: mouse.c:22
BYTE gafAsyncKeyState[256 *2/8]
Definition: keyboard.c:13
BOOL FASTCALL UserDereferenceObject(PVOID Object)
Definition: object.c:647
BOOL FASTCALL UserObjectInDestroy(HANDLE h)
Definition: object.c:707
VOID FASTCALL UserReferenceObject(PVOID obj)
Definition: object.c:754
#define USERTAG_ATTACHINFO
Definition: tags.h:197

Referenced by co_IntSetParent(), co_UserCreateWindowEx(), co_UserDestroyWindow(), IntCreateWindow(), IntProcessOwnerSwap(), IsRemoveAttachThread(), and NtUserAttachThreadInput().

◆ UserCleanupRawInput()

VOID FASTCALL UserCleanupRawInput ( PUSER_MESSAGE_QUEUE  MessageQueue)

Definition at line 398 of file rawinput.c.

400{
401 while (!IsListEmpty(&MessageQueue->RawInputListHead))
402 {
403 PUSER_RAWINPUT RawEntry;
404 RawEntry = CONTAINING_RECORD(MessageQueue->RawInputListHead.Flink,
406 ListEntry);
407 RawInputFreeEntry(MessageQueue, RawEntry);
408 }
409}
#define IsListEmpty(ListHead)
Definition: env_spec_w32.h:954
static VOID RawInputFreeEntry(PUSER_MESSAGE_QUEUE MessageQueue, PUSER_RAWINPUT RawEntry)
Definition: rawinput.c:296
struct _LIST_ENTRY * Flink
Definition: typedefs.h:121
LIST_ENTRY RawInputListHead
Definition: msgqueue.h:61
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

Referenced by MsqCleanupMessageQueue().

◆ UserCreateRawInput()

HRAWINPUT FASTCALL UserCreateRawInput ( PTHREADINFO  pti,
DWORD  dwType,
HANDLE  hDevice,
WPARAM  wParam,
CONST VOID *  pData,
UINT  cbData 
)

Definition at line 323 of file rawinput.c.

330{
331 PUSER_RAWINPUT RawEntry;
332
333 if (!pti || !pti->MessageQueue || !pData)
334 return NULL;
335
336 ASSERT(cbData <= sizeof(RawEntry->RawInput.data));
337 if (cbData > sizeof(RawEntry->RawInput.data))
338 return NULL;
339
340 if (pti->MessageQueue->cRawInput >= MAX_RAWINPUT_PER_QUEUE)
341 {
342 DPRINT("Dropping raw input, queue %p is not being pumped\n", pti->MessageQueue);
343 return NULL;
344 }
345
346 RawEntry = ExAllocateFromPagedLookasideList(&gRawInputLookasideList);
347 if (!RawEntry)
348 return NULL;
349
350 RtlZeroMemory(RawEntry, sizeof(*RawEntry));
351 RawEntry->RawInput.header.dwType = dwType;
352 RawEntry->RawInput.header.dwSize = sizeof(RAWINPUTHEADER) + cbData;
353 RawEntry->RawInput.header.hDevice = hDevice;
354 RawEntry->RawInput.header.wParam = wParam;
355 RtlCopyMemory(&RawEntry->RawInput.data, pData, cbData);
356
357 InsertTailList(&pti->MessageQueue->RawInputListHead, &RawEntry->ListEntry);
358 pti->MessageQueue->cRawInput++;
359 return (HRAWINPUT)&RawEntry->RawInput;
360}
#define InsertTailList(ListHead, Entry)
#define MAX_RAWINPUT_PER_QUEUE
Definition: rawinput.c:34
static PAGED_LOOKASIDE_LIST gRawInputLookasideList
Definition: rawinput.c:36
#define DPRINT
Definition: sndvol32.h:73
RAWINPUT RawInput
Definition: rawinput.c:27
LIST_ENTRY ListEntry
Definition: rawinput.c:26
PCBYTE PBYTE SIZE_T cbData
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
Definition: twain.h:1830

Referenced by UserRawInputMouseProcess(), and UserRawInputProcessKeyboardInput().

◆ UserFreeRawInput()

BOOL FASTCALL UserFreeRawInput ( PUSER_MESSAGE_QUEUE  MessageQueue,
HRAWINPUT  hRawInput 
)

Definition at line 364 of file rawinput.c.

367{
368 PUSER_RAWINPUT RawEntry = RawInputEntryFromHandle(MessageQueue, hRawInput);
369
370 if (!RawEntry)
371 return FALSE;
372
373 RawInputFreeEntry(MessageQueue, RawEntry);
374 return TRUE;
375}
static PUSER_RAWINPUT RawInputEntryFromHandle(PUSER_MESSAGE_QUEUE MessageQueue, HRAWINPUT hRawInput)
Definition: rawinput.c:273

Referenced by MsqCleanupMessageQueue(), UserRawInputMouseProcess(), UserRawInputProcessKeyboardInput(), and UserUpdatePrevRawInput().

◆ UserGetMouseButtonsState()

WORD FASTCALL UserGetMouseButtonsState ( VOID  )

Definition at line 22 of file mouse.c.

23{
24 WORD wRet = 0;
25
27
30
31 return wRet;
32}
unsigned short WORD
Definition: ntddk_ex.h:93
#define MK_SHIFT
Definition: winuser.h:2405
#define VK_CONTROL
Definition: winuser.h:2239
#define MK_CONTROL
Definition: winuser.h:2406
#define VK_SHIFT
Definition: winuser.h:2238
PSYSTEM_CURSORINFO IntGetSysCursorInfo(VOID)
Definition: cursoricon.c:187
#define IS_KEY_DOWN(ks, vk)
Definition: input.h:174

Referenced by co_UserDestroyWindow(), co_WinPosSetWindowPos(), IntDeactivateWindow(), UserAttachThreadInput(), UserDeleteW32Thread(), UserSendMouseInput(), and UserSetCursorPos().

◆ UserGetRawInputTarget()

BOOL FASTCALL UserGetRawInputTarget ( DWORD  dwType,
PTHREADINFO *  ppti,
HWND *  phwndTarget,
WPARAM *  pwParam 
)

Definition at line 413 of file rawinput.c.

418{
419 PRAWINPUTDEVICE Registration;
420 PUSER_MESSAGE_QUEUE pFocusQueue;
421 PWND pWnd = NULL;
422 PTHREADINFO pti;
423
425 if (!Registration)
426 return FALSE;
427
428 pFocusQueue = IntGetFocusMessageQueue();
429 if (!pFocusQueue)
430 return FALSE;
431
432 if (Registration->hwndTarget)
433 {
434 pWnd = UserGetWindowObject(Registration->hwndTarget);
435 if (!pWnd)
436 return FALSE;
437 }
438 else
439 {
440 pWnd = pFocusQueue->spwndFocus;
441 if (!pWnd)
442 pWnd = pFocusQueue->spwndActive;
443 if (!pWnd)
444 return FALSE;
445 }
446
447 pti = pWnd->head.pti;
448 if (!pti)
449 return FALSE;
450
451 if (pFocusQueue->ptiKeyboard && pti->rpdesk != pFocusQueue->ptiKeyboard->rpdesk)
452 return FALSE;
453
454 if (Registration->dwFlags & RIDEV_INPUTSINK)
455 {
456 *pwParam = (pti->MessageQueue == pFocusQueue) ? RIM_INPUT : RIM_INPUTSINK;
457 *phwndTarget = UserHMGetHandle(pWnd);
458 *ppti = pti;
459 return TRUE;
460 }
461
462 if (Registration->dwFlags & RIDEV_EXINPUTSINK)
463 {
464 if (pti->MessageQueue != pFocusQueue)
465 return FALSE; /* FIXME: Needs per-process arbitration like Windows */
466
467 *pwParam = RIM_INPUT;
468 *phwndTarget = UserHMGetHandle(pWnd);
469 *ppti = pti;
470 return TRUE;
471 }
472
473 if (pti->MessageQueue != pFocusQueue)
474 return FALSE;
475
476 *pwParam = RIM_INPUT;
477 *phwndTarget = UserHMGetHandle(pWnd);
478 *ppti = pti;
479 return TRUE;
480}
_Must_inspect_result_ _In_ CONST FLT_REGISTRATION * Registration
Definition: fltkernel.h:991
#define RIDEV_INPUTSINK
Definition: winuser.h:2964
static PRAWINPUTDEVICE RawInputRegistrationFromType(DWORD dwType)
Definition: rawinput.c:212
PTHREADINFO ptiKeyboard
Definition: msgqueue.h:56
PWND FASTCALL UserGetWindowObject(HWND hWnd)
Definition: window.c:123

Referenced by UserRawInputMouseProcess(), and UserRawInputProcessKeyboardInput().

◆ UserHklToKbl()

PKL NTAPI UserHklToKbl ( HKL  hKl)

Definition at line 539 of file kbdlayout.c.

540{
541 PKL pKl = gspklBaseLayout;
542
543 if (!gspklBaseLayout)
544 return NULL;
545
546 do
547 {
548 if (pKl->hkl == hKl)
549 return pKl;
550
551 pKl = pKl->pklNext;
552 } while (pKl != gspklBaseLayout);
553
554 return NULL;
555}
struct tagKL * pklNext
Definition: input.h:30
PKL gspklBaseLayout
Definition: kbdlayout.c:22

Referenced by co_IntLoadKeyboardLayoutEx(), NtUserMapVirtualKeyEx(), NtUserSetThreadLayoutHandles(), NtUserToUnicodeEx(), NtUserVkKeyScanEx(), and UserSetDefaultInputLang().

◆ UserInitKeyboard()

VOID NTAPI UserInitKeyboard ( HANDLE  hKeyboardDevice)

Definition at line 178 of file keyboard.c.

179{
181 IO_STATUS_BLOCK Block;
182
184
185 Status = ZwDeviceIoControlFile(hKeyboardDevice,
186 NULL,
187 NULL,
188 NULL,
189 &Block,
191 NULL, 0,
193 sizeof(gIndicators));
194
195 if (!NT_SUCCESS(Status))
196 {
197 WARN("NtDeviceIoControlFile() failed, ignored\n");
200 }
201
208
209 // FIXME: Need device driver to work! HID support more than one!!!!
210 Status = ZwDeviceIoControlFile(hKeyboardDevice,
211 NULL,
212 NULL,
213 NULL,
214 &Block,
216 NULL, 0,
217 &gKeyboardInfo, sizeof(gKeyboardInfo));
218
219 if (!NT_SUCCESS(Status))
220 {
221 ERR("NtDeviceIoControlFile() failed, ignored\n");
222 }
223 TRACE("Keyboard type %u, subtype %u and number of func keys %u\n",
227}
#define KEYBOARD_CAPS_LOCK_ON
Definition: ntddkbd.h:81
#define IOCTL_KEYBOARD_QUERY_INDICATORS
Definition: ntddkbd.h:35
#define IOCTL_KEYBOARD_QUERY_ATTRIBUTES
Definition: ntddkbd.h:32
#define KEYBOARD_SCROLL_LOCK_ON
Definition: ntddkbd.h:83
#define KEYBOARD_NUM_LOCK_ON
Definition: ntddkbd.h:82
NTSYSAPI NTSTATUS NTAPI ZwDeviceIoControlFile(IN HANDLE DeviceHandle, IN HANDLE Event OPTIONAL, IN PIO_APC_ROUTINE UserApcRoutine OPTIONAL, IN PVOID UserApcContext OPTIONAL, OUT PIO_STATUS_BLOCK IoStatusBlock, IN ULONG IoControlCode, IN PVOID InputBuffer, IN ULONG InputBufferSize, OUT PVOID OutputBuffer, IN ULONG OutputBufferSize)
#define VK_CAPITAL
Definition: winuser.h:2242
#define VK_SCROLL
Definition: winuser.h:2316
#define VK_NUMLOCK
Definition: winuser.h:2315
KEYBOARD_ID KeyboardIdentifier
Definition: ntddkbd.h:124
USHORT NumberOfFunctionKeys
Definition: ntddkbd.h:126
UCHAR Subtype
Definition: ntddkbd.h:102
UCHAR Type
Definition: ntddkbd.h:101
#define SET_KEY_LOCKED(ks, vk, down)
Definition: input.h:179
static KEYBOARD_INDICATOR_PARAMETERS gIndicators
Definition: keyboard.c:16
KEYBOARD_ATTRIBUTES gKeyboardInfo
Definition: keyboard.c:17
BYTE gafAsyncKeyState[256 *2/8]
Definition: keyboard.c:13
static PKEYBOARD_INDICATOR_TRANSLATION gpKeyboardIndicatorTrans
Definition: keyboard.c:15
NTSTATUS APIENTRY IntKeyboardGetIndicatorTrans(HANDLE hKeyboardDevice, PKEYBOARD_INDICATOR_TRANSLATION *ppIndicatorTrans)
Definition: keyboard.c:67

Referenced by RawInputThreadMain().

◆ UserProcessKeyboardInput()

VOID NTAPI UserProcessKeyboardInput ( PINPUT_DEVICE_INFO  pDeviceInfo,
PKEYBOARD_INPUT_DATA  pKeyInput 
)

Definition at line 1474 of file keyboard.c.

1477{
1478 WORD wScanCode, wVk;
1479 PKL pKl = NULL;
1480 PKBDTABLES pKbdTbl;
1481 PUSER_MESSAGE_QUEUE pFocusQueue;
1482
1483 /* Calculate scan code with prefix */
1484 wScanCode = pKbdInputData->MakeCode & 0x7F;
1485 if (pKbdInputData->Flags & KEY_E0)
1486 wScanCode |= 0xE000;
1487 if (pKbdInputData->Flags & KEY_E1)
1488 wScanCode |= 0xE100;
1489
1490 /* Find the target thread whose locale is in effect */
1491 pFocusQueue = IntGetFocusMessageQueue();
1492
1493 if (pFocusQueue && pFocusQueue->ptiKeyboard)
1494 {
1495 pKl = pFocusQueue->ptiKeyboard->KeyboardLayout;
1496 }
1497
1498 if (!pKl)
1500 if (!pKl)
1501 return;
1502
1503 pKbdTbl = pKl->spkf->pKbdTbl;
1504
1505 /* Convert scan code to virtual key.
1506 Note: We could call UserSendKeyboardInput using scan code,
1507 but it wouldn't interpret E1 key(s) properly */
1508 wVk = IntVscToVk(wScanCode, pKbdTbl);
1509 TRACE("UserProcessKeyboardInput: %x (break: %u) -> %x\n",
1510 wScanCode, (pKbdInputData->Flags & KEY_BREAK) ? 1u : 0, wVk);
1511
1512 if (RawInputEnabled == TRUE)
1513 UserRawInputProcessKeyboardInput(pDeviceInfo, pKbdInputData, wScanCode, wVk);
1514
1515 if (wVk)
1516 {
1517 KEYBDINPUT KbdInput;
1518
1519 /* Support numlock */
1521 {
1522 wVk = IntTranslateNumpadKey(wVk & 0xFF);
1523 }
1524
1525 /* Send keyboard input */
1526 KbdInput.wVk = wVk & 0xFF;
1527 KbdInput.wScan = wScanCode & 0x7F;
1528 KbdInput.dwFlags = 0;
1529 if (pKbdInputData->Flags & KEY_BREAK)
1530 KbdInput.dwFlags |= KEYEVENTF_KEYUP;
1531
1532 if (wVk & KBDEXT)
1533 KbdInput.dwFlags |= KEYEVENTF_EXTENDEDKEY;
1534 //
1535 // Based on wine input:test_Input_blackbox this is okay. It seems the
1536 // bit did not get set and more research is needed. Now the right
1537 // shift works.
1538 //
1539 if (wVk == VK_RSHIFT)
1540 KbdInput.dwFlags |= KEYEVENTF_EXTENDEDKEY;
1541
1542 KbdInput.time = 0;
1543 KbdInput.dwExtraInfo = pKbdInputData->ExtraInformation;
1544 UserSendKeyboardInput(&KbdInput, FALSE);
1545
1546 /* E1 keys don't have break code */
1547 if (pKbdInputData->Flags & KEY_E1)
1548 {
1549 /* Send key up event */
1550 KbdInput.dwFlags |= KEYEVENTF_KEYUP;
1551 UserSendKeyboardInput(&KbdInput, FALSE);
1552 }
1553 }
1554}
#define KBDNUMPAD
Definition: kbd.h:13
#define KBDEXT
Definition: kbd.h:10
#define KEY_E1
Definition: ntddkbd.h:73
#define KEY_E0
Definition: ntddkbd.h:72
#define VK_RSHIFT
Definition: winuser.h:2319
#define KEYEVENTF_EXTENDEDKEY
Definition: winuser.h:1112
#define KEYEVENTF_KEYUP
Definition: winuser.h:1113
Definition: kbd.h:97
struct tagKL * KeyboardLayout
Definition: win32.h:91
struct _KBDTABLES * pKbdTbl
Definition: input.h:22
DWORD dwFlags
Definition: winable.h:49
WORD wVk
Definition: winable.h:47
WORD wScan
Definition: winable.h:48
ULONG_PTR dwExtraInfo
Definition: winable.h:51
DWORD time
Definition: winable.h:50
PKBDFILE spkf
Definition: input.h:34
#define IS_KEY_LOCKED(ks, vk)
Definition: input.h:175
PKL W32kGetDefaultKeyLayout(VOID)
Definition: kbdlayout.c:512
BOOLEAN RawInputEnabled
Definition: rawinput.c:38
VOID WINAPI UserRawInputProcessKeyboardInput(PINPUT_DEVICE_INFO pDeviceInfo, PKEYBOARD_INPUT_DATA pKbdInputData, WORD wScanCode, WORD wVk)
Definition: keyboard.c:1410
BOOL NTAPI UserSendKeyboardInput(KEYBDINPUT *pKbdInput, BOOL bInjected)
Definition: keyboard.c:1333
static WORD FASTCALL IntVscToVk(WORD wScanCode, PKBDTABLES pKbdTbl)
Definition: keyboard.c:579
static WORD IntTranslateNumpadKey(WORD wVk)
Definition: keyboard.c:289

Referenced by RawInputThreadMain().

◆ UserProcessMouseInput()

VOID NTAPI UserProcessMouseInput ( PINPUT_DEVICE_INFO  pDeviceInfo,
PMOUSE_INPUT_DATA  pMouseInputData 
)

Definition at line 104 of file mouse.c.

105{
107
108 /* Convert MOUSE_INPUT_DATA to MOUSEINPUT. First init all fields. */
109 mi.dx = mid->LastX;
110 mi.dy = mid->LastY;
111 mi.mouseData = 0;
112 mi.dwFlags = 0;
113 mi.time = 0;
114 mi.dwExtraInfo = mid->ExtraInformation;
115
116 if (RawInputEnabled == TRUE)
117 UserRawInputMouseProcess(pDeviceInfo, mid);
118
119 /* Mouse position */
120 if (mi.dx != 0 || mi.dy != 0)
122
123 /* Flags for absolute move */
124 if (mid->Flags & MOUSE_MOVE_ABSOLUTE)
126 if (mid->Flags & MOUSE_VIRTUAL_DESKTOP)
128
129 /* Left button */
130 if (mid->ButtonFlags & MOUSE_LEFT_BUTTON_DOWN)
132 if (mid->ButtonFlags & MOUSE_LEFT_BUTTON_UP)
134
135 /* Middle button */
136 if (mid->ButtonFlags & MOUSE_MIDDLE_BUTTON_DOWN)
138 if (mid->ButtonFlags & MOUSE_MIDDLE_BUTTON_UP)
140
141 /* Right button */
142 if (mid->ButtonFlags & MOUSE_RIGHT_BUTTON_DOWN)
144 if (mid->ButtonFlags & MOUSE_RIGHT_BUTTON_UP)
146
147 /* Note: Next buttons use mouseData field so they cannot be sent in one call */
148
149 /* Button 4 */
150 if (mid->ButtonFlags & MOUSE_BUTTON_4_DOWN)
151 {
153 mi.mouseData |= XBUTTON1;
154 }
155 if (mid->ButtonFlags & MOUSE_BUTTON_4_UP)
156 {
158 mi.mouseData |= XBUTTON1;
159 }
160
161 /* If mouseData is used by button 4, send input and clear mi */
163 {
165 RtlZeroMemory(&mi, sizeof(mi));
166 }
167
168 /* Button 5 */
169 if (mid->ButtonFlags & MOUSE_BUTTON_5_DOWN)
170 {
171 mi.mouseData |= XBUTTON2;
173 }
174 if (mid->ButtonFlags & MOUSE_BUTTON_5_UP)
175 {
176 mi.mouseData |= XBUTTON2;
178 }
179
180 /* If mouseData is used by button 5, send input and clear mi */
182 {
184 RtlZeroMemory(&mi, sizeof(mi));
185 }
186
187 /* Mouse wheel */
188 if (mid->ButtonFlags & MOUSE_WHEEL)
189 {
190 mi.mouseData = mid->ButtonData;
192 }
193
194 /* If something has changed, send input to user */
195 if (mi.dwFlags)
197}
static MONITORINFO mi
Definition: win.c:9400
#define MOUSE_LEFT_BUTTON_DOWN
Definition: ntddmou.h:46
#define MOUSE_LEFT_BUTTON_UP
Definition: ntddmou.h:47
#define MOUSE_MIDDLE_BUTTON_DOWN
Definition: ntddmou.h:50
#define MOUSE_BUTTON_4_DOWN
Definition: ntddmou.h:52
#define MOUSE_BUTTON_5_UP
Definition: ntddmou.h:55
#define MOUSE_WHEEL
Definition: ntddmou.h:56
#define MOUSE_MOVE_ABSOLUTE
Definition: ntddmou.h:68
#define MOUSE_VIRTUAL_DESKTOP
Definition: ntddmou.h:69
#define MOUSE_BUTTON_5_DOWN
Definition: ntddmou.h:54
#define MOUSE_BUTTON_4_UP
Definition: ntddmou.h:53
#define MOUSE_RIGHT_BUTTON_UP
Definition: ntddmou.h:49
#define MOUSE_MIDDLE_BUTTON_UP
Definition: ntddmou.h:51
#define MOUSE_RIGHT_BUTTON_DOWN
Definition: ntddmou.h:48
#define MOUSEEVENTF_ABSOLUTE
Definition: winuser.h:1205
#define MOUSEEVENTF_LEFTUP
Definition: winuser.h:1196
#define MOUSEEVENTF_WHEEL
Definition: winuser.h:1203
#define MOUSEEVENTF_RIGHTUP
Definition: winuser.h:1198
#define MOUSEEVENTF_MIDDLEUP
Definition: winuser.h:1200
#define MOUSEEVENTF_XUP
Definition: winuser.h:1202
#define MOUSEEVENTF_MOVE
Definition: winuser.h:1194
#define MOUSEEVENTF_LEFTDOWN
Definition: winuser.h:1195
#define MOUSEEVENTF_XDOWN
Definition: winuser.h:1201
#define MOUSEEVENTF_VIRTUALDESK
Definition: winuser.h:1204
#define MOUSEEVENTF_RIGHTDOWN
Definition: winuser.h:1197
#define MOUSEEVENTF_MIDDLEDOWN
Definition: winuser.h:1199
DWORD dwFlags
Definition: winuser.h:3895
VOID NTAPI UserRawInputMouseProcess(PINPUT_DEVICE_INFO pDeviceInfo, PMOUSE_INPUT_DATA mid)
Definition: mouse.c:35
BOOL NTAPI UserSendMouseInput(MOUSEINPUT *pmi, BOOL bInjected)
Definition: mouse.c:235

Referenced by RawInputThreadMain().

◆ UserSendKeyboardInput()

BOOL NTAPI UserSendKeyboardInput ( KEYBDINPUT *  pKbdInput,
BOOL  bInjected 
)

Definition at line 1333 of file keyboard.c.

1334{
1335 WORD wScanCode, wVk;
1336 PKL pKl = NULL;
1337 PKBDTABLES pKbdTbl;
1338 PUSER_MESSAGE_QUEUE pFocusQueue;
1339 DWORD dwTime;
1340 BOOL bExt = (pKbdInput->dwFlags & KEYEVENTF_EXTENDEDKEY) ? TRUE : FALSE;
1341
1343
1344 /* Find the target thread whose locale is in effect */
1345 pFocusQueue = IntGetFocusMessageQueue();
1346
1347 if (pFocusQueue && pFocusQueue->ptiKeyboard)
1348 {
1349 pKl = pFocusQueue->ptiKeyboard->KeyboardLayout;
1350 }
1351
1352 if (!pKl)
1354 if (!pKl)
1355 {
1356 ERR("No keyboard layout!\n");
1357 return FALSE;
1358 }
1359
1360 pKbdTbl = pKl->spkf->pKbdTbl;
1361
1362 /* Note: wScan field is always used */
1363 wScanCode = pKbdInput->wScan;
1364
1365 if (pKbdInput->dwFlags & KEYEVENTF_UNICODE)
1366 {
1367 /* Generate WM_KEYDOWN msg with wParam == VK_PACKET and
1368 high order word of lParam == pKbdInput->wScan */
1369 wVk = VK_PACKET;
1370 }
1371 else
1372 {
1373 wScanCode &= 0x7F;
1374 if (pKbdInput->dwFlags & KEYEVENTF_SCANCODE)
1375 {
1376 /* Don't ignore invalid scan codes */
1377 wVk = IntVscToVk(wScanCode | (bExt ? 0xE000 : 0), pKbdTbl);
1378 if (!wVk) /* use 0xFF if vsc is invalid */
1379 wVk = 0xFF;
1380 }
1381 else
1382 {
1383 wVk = pKbdInput->wVk;
1384 }
1385
1386 /* Remove all virtual key flags (KBDEXT, KBDMULTIVK, KBDSPECIAL, KBDNUMPAD) */
1387 wVk &= 0xFF;
1388 }
1389
1390 /* If time is given, use it */
1391 if (pKbdInput->time)
1392 dwTime = pKbdInput->time;
1393 else
1394 {
1396 }
1397
1398 if (wVk == VK_RMENU && (pKbdTbl->fLocaleFlags & KLLF_ALTGR))
1399 {
1400 /* For AltGr keyboards RALT generates CTRL events */
1401 ProcessKeyEvent(VK_LCONTROL, 0, pKbdInput->dwFlags & KEYEVENTF_KEYUP, bInjected, dwTime, 0);
1402 }
1403
1404 /* Finally process this key */
1405 return ProcessKeyEvent(wVk, wScanCode, pKbdInput->dwFlags, bInjected, dwTime, pKbdInput->dwExtraInfo);
1406}
#define KLLF_ALTGR
Definition: kbd.h:93
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:829
PPROCESSINFO gppiInputProvider
Definition: ntuser.c:16
struct _THREADINFO * PTHREADINFO
Definition: ntwin32.h:6
#define VK_LCONTROL
Definition: winuser.h:2320
#define VK_RMENU
Definition: winuser.h:2323
DWORD dwTime
Definition: solitaire.cpp:27
DWORD fLocaleFlags
Definition: kbd.h:108
BOOL NTAPI ProcessKeyEvent(WORD wVk, WORD wScanCode, DWORD dwFlags, BOOL bInjected, DWORD dwTime, DWORD dwExtraInfo)
Definition: keyboard.c:1107

Referenced by NtUserSendInput(), and UserProcessKeyboardInput().

◆ UserSendMouseInput()

BOOL NTAPI UserSendMouseInput ( MOUSEINPUT *  pMouseInput,
BOOL  bInjected 
)

Definition at line 235 of file mouse.c.

236{
237 POINT ptCursor;
238 PSYSTEM_CURSORINFO pCurInfo;
239 MSG Msg;
241
242 ASSERT(pmi);
243
244 pCurInfo = IntGetSysCursorInfo();
245 ptCursor = gpsi->ptCursor;
246 dwFlags = IntFixMouseInputButtons(pmi->dwFlags);
247
249
250 if (pmi->dwFlags & MOUSEEVENTF_MOVE)
251 {
252 /* Mouse has changes position */
253 if (!(pmi->dwFlags & MOUSEEVENTF_ABSOLUTE))
254 {
255 /* Relative move */
256 ptCursor.x += pmi->dx;
257 ptCursor.y += pmi->dy;
258 }
259 else if (pmi->dwFlags & MOUSEEVENTF_VIRTUALDESK)
260 {
261 /* Absolute move in virtual screen units */
262 ptCursor.x = pmi->dx * UserGetSystemMetrics(SM_CXVIRTUALSCREEN) >> 16;
263 ptCursor.y = pmi->dy * UserGetSystemMetrics(SM_CYVIRTUALSCREEN) >> 16;
264 }
265 else
266 {
267 /* Absolute move in primary monitor units */
268 ptCursor.x = pmi->dx * UserGetSystemMetrics(SM_CXSCREEN) >> 16;
269 ptCursor.y = pmi->dy * UserGetSystemMetrics(SM_CYSCREEN) >> 16;
270 }
271 }
272
273 /* Init message fields */
274 Msg.wParam = UserGetMouseButtonsState();
275 Msg.lParam = MAKELPARAM(ptCursor.x, ptCursor.y);
276 Msg.pt = ptCursor;
277 Msg.time = pmi->time;
278 if (!Msg.time)
279 {
280 Msg.time = EngGetTickCount32();
281 }
282
283 /* Do GetMouseMovePointsEx FIFO. */
287 gMouseHistoryOfMoves[gcMouseHistoryOfMoves].dwExtraInfo = pmi->dwExtraInfo;
289 gcMouseHistoryOfMoves = 0; // 0 - 63 is 64, FIFO forwards.
290
291 /* Update cursor position */
293 {
294 UserSetCursorPos(ptCursor.x, ptCursor.y, bInjected, pmi->dwExtraInfo, TRUE);
295 }
296
298 pCurInfo->ButtonsDown |= MK_SHIFT;
299 else
300 pCurInfo->ButtonsDown &= ~MK_SHIFT;
301
303 pCurInfo->ButtonsDown |= MK_CONTROL;
304 else
305 pCurInfo->ButtonsDown &= ~MK_CONTROL;
306
307 /* Left button */
309 {
311 Msg.message = WM_LBUTTONDOWN;
312 pCurInfo->ButtonsDown |= MK_LBUTTON;
313 Msg.wParam |= MK_LBUTTON;
314 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
315 }
316 else if (dwFlags & MOUSEEVENTF_LEFTUP)
317 {
319 Msg.message = WM_LBUTTONUP;
320 pCurInfo->ButtonsDown &= ~MK_LBUTTON;
321 Msg.wParam &= ~MK_LBUTTON;
322 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
323 }
324
325 /* Middle button */
327 {
329 Msg.message = WM_MBUTTONDOWN;
330 pCurInfo->ButtonsDown |= MK_MBUTTON;
331 Msg.wParam |= MK_MBUTTON;
332 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
333 }
334 else if (dwFlags & MOUSEEVENTF_MIDDLEUP)
335 {
337 Msg.message = WM_MBUTTONUP;
338 pCurInfo->ButtonsDown &= ~MK_MBUTTON;
339 Msg.wParam &= ~MK_MBUTTON;
340 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
341 }
342
343 /* Right button */
345 {
347 Msg.message = WM_RBUTTONDOWN;
348 pCurInfo->ButtonsDown |= MK_RBUTTON;
349 Msg.wParam |= MK_RBUTTON;
350 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
351 }
352 else if (dwFlags & MOUSEEVENTF_RIGHTUP)
353 {
355 Msg.message = WM_RBUTTONUP;
356 pCurInfo->ButtonsDown &= ~MK_RBUTTON;
357 Msg.wParam &= ~MK_RBUTTON;
358 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
359 }
360
363 {
364 /* Fail because both types of events use the mouseData field */
365 WARN("Invalid flags!\n");
366 return FALSE;
367 }
368
369 /* X-Button (4 or 5) */
371 {
372 Msg.message = WM_XBUTTONDOWN;
373 if (pmi->mouseData & XBUTTON1)
374 {
375 SET_KEY_DOWN(gafAsyncKeyState, VK_XBUTTON1, TRUE);
376 pCurInfo->ButtonsDown |= MK_XBUTTON1;
377 Msg.wParam |= MAKEWPARAM(MK_XBUTTON1, XBUTTON1);
378 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
379 }
380 if (pmi->mouseData & XBUTTON2)
381 {
382 SET_KEY_DOWN(gafAsyncKeyState, VK_XBUTTON2, TRUE);
383 pCurInfo->ButtonsDown |= MK_XBUTTON2;
384 Msg.wParam |= MAKEWPARAM(MK_XBUTTON2, XBUTTON2);
385 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
386 }
387 }
388 else if (dwFlags & MOUSEEVENTF_XUP)
389 {
390 Msg.message = WM_XBUTTONUP;
391 if(pmi->mouseData & XBUTTON1)
392 {
393 SET_KEY_DOWN(gafAsyncKeyState, VK_XBUTTON1, FALSE);
394 pCurInfo->ButtonsDown &= ~MK_XBUTTON1;
395 Msg.wParam &= ~MK_XBUTTON1;
396 Msg.wParam |= MAKEWPARAM(0, XBUTTON1);
397 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
398 }
399 if (pmi->mouseData & XBUTTON2)
400 {
401 SET_KEY_DOWN(gafAsyncKeyState, VK_XBUTTON2, FALSE);
402 pCurInfo->ButtonsDown &= ~MK_XBUTTON2;
403 Msg.wParam &= ~MK_XBUTTON2;
404 Msg.wParam |= MAKEWPARAM(0, XBUTTON2);
405 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
406 }
407 }
408
409 /* Mouse wheel */
411 {
412 Msg.message = WM_MOUSEWHEEL;
413 Msg.wParam = MAKEWPARAM(pCurInfo->ButtonsDown, pmi->mouseData);
414 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
415 }
416
417 return TRUE;
418}
#define ARRAYSIZE(a)
Definition: cat.c:25
struct @1897 Msg[]
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
Definition: netsh.h:141
#define MK_RBUTTON
Definition: winuser.h:2404
#define MAKEWPARAM(l, h)
Definition: winuser.h:4117
#define SM_CYVIRTUALSCREEN
Definition: winuser.h:1050
#define SM_CYSCREEN
Definition: winuser.h:971
#define VK_RBUTTON
Definition: winuser.h:2227
#define WM_RBUTTONUP
Definition: winuser.h:1808
#define VK_MBUTTON
Definition: winuser.h:2229
#define WM_LBUTTONDOWN
Definition: winuser.h:1804
#define WM_RBUTTONDOWN
Definition: winuser.h:1807
#define SM_CXVIRTUALSCREEN
Definition: winuser.h:1049
#define MK_MBUTTON
Definition: winuser.h:2407
#define WM_LBUTTONUP
Definition: winuser.h:1805
#define MK_LBUTTON
Definition: winuser.h:2403
#define SM_CXSCREEN
Definition: winuser.h:970
#define WM_MBUTTONUP
Definition: winuser.h:1811
#define WM_MBUTTONDOWN
Definition: winuser.h:1810
#define VK_LBUTTON
Definition: winuser.h:2226
long y
Definition: dcommon.idl:24
long x
Definition: dcommon.idl:24
#define WM_MOUSEWHEEL
Definition: treelist.c:96
BOOL UserSetCursorPos(INT x, INT y, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: cursoricon.c:238
#define SET_KEY_DOWN(ks, vk, down)
Definition: input.h:176
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:209
MOUSEMOVEPOINT gMouseHistoryOfMoves[64]
Definition: mouse.c:13
WORD FASTCALL UserGetMouseButtonsState(VOID)
Definition: mouse.c:22
DWORD IntFixMouseInputButtons(DWORD dwFlags)
Definition: mouse.c:205
INT gcMouseHistoryOfMoves
Definition: mouse.c:14

Referenced by co_UserSetCapture(), NtUserSendInput(), and UserProcessMouseInput().

◆ UserSetDefaultInputLang()

BOOL NTAPI UserSetDefaultInputLang ( HKL  hKl)

Definition at line 583 of file kbdlayout.c.

584{
585 PKL pKl;
586
587 pKl = UserHklToKbl(hKl);
588 if (!pKl)
589 return FALSE;
590
592 return TRUE;
593}
PWINSTATION_OBJECT FASTCALL IntGetProcessWindowStation(HWINSTA *phWinSta OPTIONAL)
Definition: winsta.c:422
VOID FASTCALL IntReorderKeyboardLayouts(_Inout_ PWINSTATION_OBJECT pWinSta, _Inout_ PKL pNewKL)
Definition: kbdlayout.c:558
PKL NTAPI UserHklToKbl(HKL hKl)
Definition: kbdlayout.c:539

Referenced by SpiGetSet().

◆ UserUpdatePrevRawInput()

VOID FASTCALL UserUpdatePrevRawInput ( PTHREADINFO  pti,
CONST MSG *  pMsg 
)

Definition at line 379 of file rawinput.c.

382{
383 if (pti->hPrevRawInput)
384 {
386 pti->hPrevRawInput = NULL;
387 }
388
389 if (pMsg->message == WM_INPUT &&
390 (pMsg->wParam == RIM_INPUT || pMsg->wParam == RIM_INPUTSINK))
391 {
392 pti->hPrevRawInput = (HRAWINPUT)pMsg->lParam;
393 }
394}
#define WM_INPUT
Definition: winuser.h:1740
BOOL FASTCALL UserFreeRawInput(PUSER_MESSAGE_QUEUE MessageQueue, HRAWINPUT hRawInput)
Definition: rawinput.c:364
HRAWINPUT hPrevRawInput
Definition: win32.h:156

Referenced by co_IntPeekMessage().

◆ W32kGetDefaultKeyLayout()

PKL W32kGetDefaultKeyLayout ( VOID  )

Definition at line 512 of file kbdlayout.c.

513{
514 PKL pKl = gspklBaseLayout;
515
516 if (!pKl)
517 return NULL;
518
519 /* Return not unloaded layout */
520 do
521 {
522 if (!(pKl->dwKL_Flags & KL_UNLOAD))
523 return pKl;
524
525 pKl = pKl->pklPrev; /* Confirmed on Win2k */
526 } while(pKl != gspklBaseLayout);
527
528 /* We have not found proper KL */
529 return NULL;
530}
DWORD dwKL_Flags
Definition: input.h:32
struct tagKL * pklPrev
Definition: input.h:31
#define KL_UNLOAD
Definition: undocuser.h:183

Referenced by InitThreadCallback(), IntTranslateKbdMessage(), UserProcessKeyboardInput(), and UserSendKeyboardInput().

Variable Documentation

◆ gafAsyncKeyState

◆ gbEnableHexNumpad

BOOL gbEnableHexNumpad
extern

Definition at line 36 of file keyboard.c.

Referenced by IntHandleAltNumpad(), and SpiUpdatePerUserSystemParameters().

◆ gdwLanguageToggleKey

DWORD gdwLanguageToggleKey
extern

Definition at line 19 of file keyboard.c.

Referenced by ProcessKeyEvent(), SpiGetSet(), and SpiUpdatePerUserSystemParameters().

◆ gdwLayoutToggleKey

DWORD gdwLayoutToggleKey
extern

Definition at line 21 of file keyboard.c.

Referenced by ProcessKeyEvent(), SpiGetSet(), and SpiUpdatePerUserSystemParameters().

◆ ghKeyboardDevice

HANDLE ghKeyboardDevice
extern

Definition at line 26 of file input.c.

Referenced by ProcessKeyEvent(), and RawInputThreadMain().

◆ gKeyboardInfo

◆ gpai

PATTACHINFO gpai
extern

Definition at line 24 of file input.c.

Referenced by IsRemoveAttachThread(), and UserAttachThreadInput().

◆ gpDeviceInfoListMutex

PERESOURCE gpDeviceInfoListMutex
extern

◆ gpInputDeviceInfo

PINPUT_DEVICE_INFO gpInputDeviceInfo
extern

◆ gspklBaseLayout

◆ gSystemCPCharSet

UINT gSystemCPCharSet
extern

Definition at line 25 of file kbdlayout.c.

Referenced by co_UserLoadKbdLayout().

◆ gSystemFS

DWORD gSystemFS
extern

Definition at line 24 of file kbdlayout.c.

Referenced by co_UserLoadKbdLayout(), IntImmProcessKey(), and IntLanguageToggle().

◆ ptiRawInput

PTHREADINFO ptiRawInput
extern

Definition at line 22 of file input.c.

Referenced by IntSetTimer(), and RawInputThreadMain().

◆ RawInputEnabled

BOOLEAN RawInputEnabled
extern