ReactOS 0.4.17-dev-923-g4c9a150
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 (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 (PMOUSE_INPUT_DATA pMouseInputData)
 
BOOL NTAPI UserSendMouseInput (MOUSEINPUT *pMouseInput, BOOL bInjected)
 
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
 
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 154 of file input.h.

◆ GET_KS_DOWN_BIT

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

Definition at line 155 of file input.h.

◆ GET_KS_LOCK_BIT

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

Definition at line 156 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 157 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 158 of file input.h.

◆ KS_DOWN_BIT

#define KS_DOWN_BIT   0x80

Definition at line 52 of file input.h.

◆ KS_LOCK_BIT

#define KS_LOCK_BIT   0x01

Definition at line 53 of file input.h.

◆ LP_DO_NOT_CARE_BIT

#define LP_DO_NOT_CARE_BIT   (1<<25)

Definition at line 57 of file input.h.

◆ SC_KEY_UP

#define SC_KEY_UP   0x8000

Definition at line 55 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:155
#define GET_KS_BYTE(vk)
Definition: input.h:154

Definition at line 159 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:156

Definition at line 162 of file input.h.

◆ ThreadHasInputAccess

#define ThreadHasInputAccess (   W32Thread)    (TRUE)

Definition at line 66 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 140 of file input.h.

141{
144}
#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:1036
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
Definition: device.c:1259
NTSTATUS NTAPI IoGetDeviceObjectPointer(IN PUNICODE_STRING ObjectName, IN ACCESS_MASK DesiredAccess, OUT PFILE_OBJECT *FileObject, OUT PDEVICE_OBJECT *DeviceObject)
Definition: device.c:1453
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:1395
SPIVALUES gspv
Definition: sysparams.c:17

Referenced by HungAppSysTimerProc().

◆ IntBlockInput()

BOOL FASTCALL IntBlockInput ( PTHREADINFO  W32Thread,
BOOL  BlockIt 
)

Definition at line 417 of file input.c.

418{
419 PTHREADINFO OldBlock;
420 ASSERT(pti);
421
422 if(!pti->rpdesk || ((pti->TIF_flags & TIF_INCLEANUP) && BlockIt))
423 {
424 /*
425 * Fail blocking if exiting the thread
426 */
427
428 return FALSE;
429 }
430
431 /*
432 * FIXME: Check access rights of the window station
433 * e.g. services running in the service window station cannot block input
434 */
435 if(!ThreadHasInputAccess(pti) ||
436 !IntIsActiveDesktop(pti->rpdesk))
437 {
439 return FALSE;
440 }
441
442 ASSERT(pti->rpdesk);
443 OldBlock = pti->rpdesk->BlockInputThread;
444 if(OldBlock)
445 {
446 if(OldBlock != pti)
447 {
449 return FALSE;
450 }
451 pti->rpdesk->BlockInputThread = (BlockIt ? pti : NULL);
452 return OldBlock == NULL;
453 }
454
455 pti->rpdesk->BlockInputThread = (BlockIt ? pti : NULL);
456 return OldBlock == NULL;
457}
#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:66
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 VK_DBE_ROMAN
Definition: ime.h:46
#define VK_DBE_HIRAGANA
Definition: ime.h:43
#define VK_DBE_CODEINPUT
Definition: ime.h:51
#define VK_DBE_NOROMAN
Definition: ime.h:47
#define VK_DBE_KATAKANA
Definition: ime.h:42
#define VK_DBE_ENTERWORDREGISTERMODE
Definition: ime.h:48
#define VK_DBE_ENTERIMECONFIGMODE
Definition: ime.h:49
#define VK_DBE_NOCODEINPUT
Definition: ime.h:52
#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
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 479 of file input.c.

480{
482 PATTACHINFO pai;
483 BOOL Ret = TRUE;
484 PTHREADINFO ptiFrom = NULL, ptiTo = NULL;
485
486 do
487 {
488 if (!gpai) return TRUE;
489
490 pai = gpai; // Bottom of the list.
491
492 do
493 {
494 if (pai->pti2 == pti)
495 {
496 ptiFrom = pai->pti1;
497 ptiTo = pti;
498 break;
499 }
500 if (pai->pti1 == pti)
501 {
502 ptiFrom = pti;
503 ptiTo = pai->pti2;
504 break;
505 }
506 pai = pai->paiNext;
507
508 } while (pai);
509
510 if (!pai && !ptiFrom && !ptiTo) break;
511
512 Status = UserAttachThreadInput(ptiFrom, ptiTo, FALSE);
513 if (!NT_SUCCESS(Status)) Ret = FALSE;
514
515 } while (Ret);
516
517 return Ret;
518}
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:521

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.pNextDeviceInfo = gpInputDeviceInfo;
222 }
223 }
224 if (!ghKeyboardDevice)
225 {
226 /* Check if keyboard device already exists */
227 Status = OpenInputDevice(&ghKeyboardDevice, &pKbdDevice, Keyboard.DeviceName.Buffer);
228 if (NT_SUCCESS(Status))
229 {
230 ++cMaxWaitObjects;
231 TRACE("Keyboard connected!\n");
232 Keyboard.pNextDeviceInfo = gpInputDeviceInfo;
234 // Get and load keyboard attributes.
236 Keyboard.Keyboard.Attributes = gKeyboardInfo;
238 // Register the Window hotkey.
240 // Register the Window Snap hotkey.
245 // Register the debug hotkeys.
247 UserLeave();
248 }
249 }
250
251 /* Reset WaitHandles array */
252 cWaitObjects = 0;
253 WaitObjects[cWaitObjects++] = ShutdownEvent;
254 WaitObjects[cWaitObjects++] = MasterTimer;
255
256 if (ghMouseDevice)
257 {
258 /* Try to read from mouse if previous reading is not pending */
259 if (MouStatus != STATUS_PENDING)
260 {
261 MouStatus = ZwReadFile(ghMouseDevice,
262 NULL,
263 NULL,
264 NULL,
265 &MouIosb,
266 &MouseInput,
267 sizeof(MOUSE_INPUT_DATA),
268 &ByteOffset,
269 NULL);
270 }
271
272 if (MouStatus == STATUS_PENDING)
273 WaitObjects[cWaitObjects++] = &pMouDevice->Event;
274 }
275
277 {
278 /* Try to read from keyboard if previous reading is not pending */
279 if (KbdStatus != STATUS_PENDING)
280 {
281 KbdStatus = ZwReadFile(ghKeyboardDevice,
282 NULL,
283 NULL,
284 NULL,
285 &KbdIosb,
286 &KeyInput,
287 sizeof(KEYBOARD_INPUT_DATA),
288 &ByteOffset,
289 NULL);
290
291 }
292 if (KbdStatus == STATUS_PENDING)
293 WaitObjects[cWaitObjects++] = &pKbdDevice->Event;
294 }
295
296 /* If all objects are pending, wait for them */
297 if (cWaitObjects == cMaxWaitObjects)
298 {
299 Status = KeWaitForMultipleObjects(cWaitObjects,
300 WaitObjects,
301 WaitAny,
304 TRUE,
305 NULL,//&WaitTimeout,
307
308 if ((Status >= STATUS_WAIT_0) &&
309 (Status < (STATUS_WAIT_0 + (LONG)cWaitObjects)))
310 {
311 /* Some device has finished reading */
312 pSignaledObject = WaitObjects[Status - STATUS_WAIT_0];
313
314 /* Check if it is mouse or keyboard and update status */
315 if ((MouStatus == STATUS_PENDING) &&
316 (pSignaledObject == &pMouDevice->Event))
317 {
318 MouStatus = MouIosb.Status;
319 }
320 else if ((KbdStatus == STATUS_PENDING) &&
321 (pSignaledObject == &pKbdDevice->Event))
322 {
323 KbdStatus = KbdIosb.Status;
324 }
325 else if (pSignaledObject == MasterTimer)
326 {
328 }
329 else if (pSignaledObject == ShutdownEvent)
330 {
331 break;
332 }
333 else ASSERT(FALSE);
334 }
335 }
336
337 /* Have we successed reading from mouse? */
338 if (NT_SUCCESS(MouStatus) && MouStatus != STATUS_PENDING)
339 {
340 TRACE("MouseEvent\n");
341
342 /* Set LastInputTick */
344
345 /* Process data */
347 UserProcessMouseInput(&MouseInput);
348 UserLeave();
349 }
350 else if (MouStatus != STATUS_PENDING)
351 ERR("Failed to read from mouse: %x.\n", MouStatus);
352
353 /* Have we successed reading from keyboard? */
354 if (NT_SUCCESS(KbdStatus) && KbdStatus != STATUS_PENDING)
355 {
356 TRACE("KeyboardEvent: %s %04x\n",
357 (KeyInput.Flags & KEY_BREAK) ? "up" : "down",
358 KeyInput.MakeCode);
359
360 /* Set LastInputTick */
362
363 /* Process data */
365 UserProcessKeyboardInput(&KeyInput);
366 UserLeave();
367 }
368 else if (KbdStatus != STATUS_PENDING)
369 ERR("Failed to read from keyboard: %x.\n", KbdStatus);
370 }
371
372 if (ghMouseDevice)
373 {
376 ObDereferenceObject(pMouDevice);
378 }
379
381 {
384 ObDereferenceObject(pKbdDevice);
386 }
387
390
391 ERR("Raw Input Thread Exit!\n");
392}
#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:586
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:3406
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:2764
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(PKEYBOARD_INPUT_DATA pKeyInput)
Definition: keyboard.c:1414
VOID NTAPI UserProcessMouseInput(PMOUSE_INPUT_DATA pMouseInputData)
Definition: mouse.c:40
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 148 of file input.h.

149{
152}
#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 521 of file input.c.

522{
523 MSG msg;
524 PATTACHINFO pai;
525 PCURICON_OBJECT CurIcon;
526
527 /* Can not be the same thread. */
528 if (ptiFrom == ptiTo) return STATUS_INVALID_PARAMETER;
529
530 /* Do not attach to system threads or between different desktops. */
531 if (ptiFrom->TIF_flags & TIF_DONTATTACHQUEUE ||
533 ptiFrom->rpdesk != ptiTo->rpdesk)
535
536 /* MSDN Note:
537 Keyboard and mouse events received by both threads are processed by the thread specified by the idAttachTo.
538 */
539
540 /* If Attach set, allocate and link. */
541 if (fAttach)
542 {
544 if (!pai) return STATUS_NO_MEMORY;
545
546 pai->paiNext = gpai;
547 pai->pti1 = ptiFrom;
548 pai->pti2 = ptiTo;
549 gpai = pai;
550 paiCount++;
551 ERR("Attach Allocated! ptiFrom 0x%p ptiTo 0x%p paiCount %d\n",ptiFrom,ptiTo,paiCount);
552
553 if (ptiTo->MessageQueue != ptiFrom->MessageQueue)
554 {
555
556 ptiTo->MessageQueue->iCursorLevel -= ptiFrom->iCursorLevel;
557
558 if (ptiFrom->MessageQueue == gpqForeground)
559 {
560 ERR("ptiFrom is Foreground\n");
561 ptiTo->MessageQueue->spwndActive = ptiFrom->MessageQueue->spwndActive;
562 ptiTo->MessageQueue->spwndFocus = ptiFrom->MessageQueue->spwndFocus;
563 ptiTo->MessageQueue->spwndCapture = ptiFrom->MessageQueue->spwndCapture;
564 ptiTo->MessageQueue->QF_flags ^= ((ptiTo->MessageQueue->QF_flags ^ ptiFrom->MessageQueue->QF_flags) & QF_CAPTURELOCKED);
565 RtlCopyMemory(&ptiTo->MessageQueue->CaretInfo,
566 &ptiFrom->MessageQueue->CaretInfo,
567 sizeof(ptiTo->MessageQueue->CaretInfo));
570 gptiForeground = ptiTo;
571 }
572 else
573 {
574 ERR("ptiFrom NOT Foreground\n");
575 if ( ptiTo->MessageQueue->spwndActive == 0 )
576 ptiTo->MessageQueue->spwndActive = ptiFrom->MessageQueue->spwndActive;
577 if ( ptiTo->MessageQueue->spwndFocus == 0 )
578 ptiTo->MessageQueue->spwndFocus = ptiFrom->MessageQueue->spwndFocus;
579 }
580
581 CurIcon = ptiFrom->MessageQueue->CursorObject;
582
583 MsqDestroyMessageQueue(ptiFrom);
584
585 if (CurIcon)
586 {
587 // Could be global. Keep it above the water line!
588 UserReferenceObject(CurIcon);
589 }
590
591 if (CurIcon && UserObjectInDestroy(UserHMGetHandle(CurIcon)))
592 {
593 UserDereferenceObject(CurIcon);
594 CurIcon = NULL;
595 }
596
597 ptiFrom->MessageQueue = ptiTo->MessageQueue;
598
599 // Pass cursor From if To is null. Pass test_SetCursor parent_id == current pti ID.
600 if (CurIcon && ptiTo->MessageQueue->CursorObject == NULL)
601 {
602 ERR("ptiTo receiving ptiFrom Cursor\n");
603 ptiTo->MessageQueue->CursorObject = CurIcon;
604 }
605
606 ptiFrom->MessageQueue->cThreads++;
607 ERR("ptiTo S Share count %u\n", ptiFrom->MessageQueue->cThreads);
608
610 }
611 else
612 {
613 ERR("Attach Threads are already associated!\n");
614 }
615 }
616 else /* If clear, unlink and free it. */
617 {
618 BOOL Hit = FALSE;
619 PATTACHINFO *ppai;
620
621 if (!gpai) return STATUS_INVALID_PARAMETER;
622
623 /* Search list and free if found or return false. */
624 ppai = &gpai;
625 while (*ppai != NULL)
626 {
627 if ( (*ppai)->pti2 == ptiTo && (*ppai)->pti1 == ptiFrom )
628 {
629 pai = *ppai;
630 /* Remove it from the list */
631 *ppai = (*ppai)->paiNext;
633 paiCount--;
634 Hit = TRUE;
635 break;
636 }
637 ppai = &((*ppai)->paiNext);
638 }
639
640 if (!Hit) return STATUS_INVALID_PARAMETER;
641
642 ERR("Attach Free! ptiFrom 0x%p ptiTo 0x%p paiCount %d\n",ptiFrom,ptiTo,paiCount);
643
644 if (ptiTo->MessageQueue == ptiFrom->MessageQueue)
645 {
646 PWND spwndActive = ptiTo->MessageQueue->spwndActive;
647 PWND spwndFocus = ptiTo->MessageQueue->spwndFocus;
648
649 if (gptiForeground == ptiFrom)
650 {
651 ERR("ptiTo is now pti FG.\n");
652 // MessageQueue foreground is set so switch threads.
653 gptiForeground = ptiTo;
654 }
655 ptiTo->MessageQueue->cThreads--;
656 ERR("ptiTo E Share count %u\n", ptiTo->MessageQueue->cThreads);
657 ASSERT(ptiTo->MessageQueue->cThreads >= 1);
658
660
661 ptiFrom->MessageQueue = MsqCreateMessageQueue(ptiFrom);
662
663 if (spwndActive)
664 {
665 if (spwndActive->head.pti == ptiFrom)
666 {
667 ptiFrom->MessageQueue->spwndActive = spwndActive;
668 ptiTo->MessageQueue->spwndActive = 0;
669 }
670 }
671 if (spwndFocus)
672 {
673 if (spwndFocus->head.pti == ptiFrom)
674 {
675 ptiFrom->MessageQueue->spwndFocus = spwndFocus;
676 ptiTo->MessageQueue->spwndFocus = 0;
677 }
678 }
679 ptiTo->MessageQueue->iCursorLevel -= ptiFrom->iCursorLevel;
680 }
681 else
682 {
683 ERR("Detaching Threads are not associated!\n");
684 }
685 }
686 /* Note that key state, which can be ascertained by calls to the GetKeyState
687 or GetKeyboardState function, is reset after a call to AttachThreadInput.
688 ATM which one?
689 */
690 RtlCopyMemory(ptiTo->MessageQueue->afKeyState, gafAsyncKeyState, sizeof(gafAsyncKeyState));
691
692 ptiTo->MessageQueue->msgDblClk.message = 0;
693
694 /* Generate mouse move message */
695 msg.message = WM_MOUSEMOVE;
696 msg.wParam = UserGetMouseButtonsState();
697 msg.lParam = MAKELPARAM(gpsi->ptCursor.x, gpsi->ptCursor.y);
698 msg.pt = gpsi->ptCursor;
700
701 return STATUS_SUCCESS;
702}
#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: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
#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().

◆ 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:157

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

◆ 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:162
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 ( PKEYBOARD_INPUT_DATA  pKeyInput)

Definition at line 1414 of file keyboard.c.

1416{
1417 WORD wScanCode, wVk;
1418 PKL pKl = NULL;
1419 PKBDTABLES pKbdTbl;
1420 PUSER_MESSAGE_QUEUE pFocusQueue;
1421
1422 /* Calculate scan code with prefix */
1423 wScanCode = pKbdInputData->MakeCode & 0x7F;
1424 if (pKbdInputData->Flags & KEY_E0)
1425 wScanCode |= 0xE000;
1426 if (pKbdInputData->Flags & KEY_E1)
1427 wScanCode |= 0xE100;
1428
1429 /* Find the target thread whose locale is in effect */
1430 pFocusQueue = IntGetFocusMessageQueue();
1431
1432 if (pFocusQueue && pFocusQueue->ptiKeyboard)
1433 {
1434 pKl = pFocusQueue->ptiKeyboard->KeyboardLayout;
1435 }
1436
1437 if (!pKl)
1439 if (!pKl)
1440 return;
1441
1442 pKbdTbl = pKl->spkf->pKbdTbl;
1443
1444 /* Convert scan code to virtual key.
1445 Note: We could call UserSendKeyboardInput using scan code,
1446 but it wouldn't interpret E1 key(s) properly */
1447 wVk = IntVscToVk(wScanCode, pKbdTbl);
1448 TRACE("UserProcessKeyboardInput: %x (break: %u) -> %x\n",
1449 wScanCode, (pKbdInputData->Flags & KEY_BREAK) ? 1u : 0, wVk);
1450
1451 if (wVk)
1452 {
1453 KEYBDINPUT KbdInput;
1454
1455 /* Support numlock */
1457 {
1458 wVk = IntTranslateNumpadKey(wVk & 0xFF);
1459 }
1460
1461 /* Send keyboard input */
1462 KbdInput.wVk = wVk & 0xFF;
1463 KbdInput.wScan = wScanCode & 0x7F;
1464 KbdInput.dwFlags = 0;
1465 if (pKbdInputData->Flags & KEY_BREAK)
1466 KbdInput.dwFlags |= KEYEVENTF_KEYUP;
1467
1468 if (wVk & KBDEXT)
1469 KbdInput.dwFlags |= KEYEVENTF_EXTENDEDKEY;
1470 //
1471 // Based on wine input:test_Input_blackbox this is okay. It seems the
1472 // bit did not get set and more research is needed. Now the right
1473 // shift works.
1474 //
1475 if (wVk == VK_RSHIFT)
1476 KbdInput.dwFlags |= KEYEVENTF_EXTENDEDKEY;
1477
1478 KbdInput.time = 0;
1479 KbdInput.dwExtraInfo = pKbdInputData->ExtraInformation;
1480 UserSendKeyboardInput(&KbdInput, FALSE);
1481
1482 /* E1 keys don't have break code */
1483 if (pKbdInputData->Flags & KEY_E1)
1484 {
1485 /* Send key up event */
1486 KbdInput.dwFlags |= KEYEVENTF_KEYUP;
1487 UserSendKeyboardInput(&KbdInput, FALSE);
1488 }
1489 }
1490}
#define KBDNUMPAD
Definition: kbd.h:11
#define KBDEXT
Definition: kbd.h:8
#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:95
struct tagKL * KeyboardLayout
Definition: win32.h:91
PTHREADINFO ptiKeyboard
Definition: msgqueue.h:56
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:158
PKL W32kGetDefaultKeyLayout(VOID)
Definition: kbdlayout.c:512
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 ( PMOUSE_INPUT_DATA  pMouseInputData)

Definition at line 40 of file mouse.c.

41{
43
44 /* Convert MOUSE_INPUT_DATA to MOUSEINPUT. First init all fields. */
45 mi.dx = mid->LastX;
46 mi.dy = mid->LastY;
47 mi.mouseData = 0;
48 mi.dwFlags = 0;
49 mi.time = 0;
50 mi.dwExtraInfo = mid->ExtraInformation;
51
52 /* Mouse position */
53 if (mi.dx != 0 || mi.dy != 0)
55
56 /* Flags for absolute move */
57 if (mid->Flags & MOUSE_MOVE_ABSOLUTE)
59 if (mid->Flags & MOUSE_VIRTUAL_DESKTOP)
61
62 /* Left button */
63 if (mid->ButtonFlags & MOUSE_LEFT_BUTTON_DOWN)
65 if (mid->ButtonFlags & MOUSE_LEFT_BUTTON_UP)
67
68 /* Middle button */
69 if (mid->ButtonFlags & MOUSE_MIDDLE_BUTTON_DOWN)
71 if (mid->ButtonFlags & MOUSE_MIDDLE_BUTTON_UP)
73
74 /* Right button */
75 if (mid->ButtonFlags & MOUSE_RIGHT_BUTTON_DOWN)
77 if (mid->ButtonFlags & MOUSE_RIGHT_BUTTON_UP)
79
80 /* Note: Next buttons use mouseData field so they cannot be sent in one call */
81
82 /* Button 4 */
83 if (mid->ButtonFlags & MOUSE_BUTTON_4_DOWN)
84 {
86 mi.mouseData |= XBUTTON1;
87 }
88 if (mid->ButtonFlags & MOUSE_BUTTON_4_UP)
89 {
91 mi.mouseData |= XBUTTON1;
92 }
93
94 /* If mouseData is used by button 4, send input and clear mi */
96 {
98 RtlZeroMemory(&mi, sizeof(mi));
99 }
100
101 /* Button 5 */
102 if (mid->ButtonFlags & MOUSE_BUTTON_5_DOWN)
103 {
104 mi.mouseData |= XBUTTON2;
106 }
107 if (mid->ButtonFlags & MOUSE_BUTTON_5_UP)
108 {
109 mi.mouseData |= XBUTTON2;
111 }
112
113 /* If mouseData is used by button 5, send input and clear mi */
115 {
117 RtlZeroMemory(&mi, sizeof(mi));
118 }
119
120 /* Mouse wheel */
121 if (mid->ButtonFlags & MOUSE_WHEEL)
122 {
123 mi.mouseData = mid->ButtonData;
125 }
126
127 /* If something has changed, send input to user */
128 if (mi.dwFlags)
130}
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
BOOL NTAPI UserSendMouseInput(MOUSEINPUT *pmi, BOOL bInjected)
Definition: mouse.c:168

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:91
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
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:106
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 168 of file mouse.c.

169{
170 POINT ptCursor;
171 PSYSTEM_CURSORINFO pCurInfo;
172 MSG Msg;
174
175 ASSERT(pmi);
176
177 pCurInfo = IntGetSysCursorInfo();
178 ptCursor = gpsi->ptCursor;
179 dwFlags = IntFixMouseInputButtons(pmi->dwFlags);
180
182
183 if (pmi->dwFlags & MOUSEEVENTF_MOVE)
184 {
185 /* Mouse has changes position */
186 if (!(pmi->dwFlags & MOUSEEVENTF_ABSOLUTE))
187 {
188 /* Relative move */
189 ptCursor.x += pmi->dx;
190 ptCursor.y += pmi->dy;
191 }
192 else if (pmi->dwFlags & MOUSEEVENTF_VIRTUALDESK)
193 {
194 /* Absolute move in virtual screen units */
195 ptCursor.x = pmi->dx * UserGetSystemMetrics(SM_CXVIRTUALSCREEN) >> 16;
196 ptCursor.y = pmi->dy * UserGetSystemMetrics(SM_CYVIRTUALSCREEN) >> 16;
197 }
198 else
199 {
200 /* Absolute move in primary monitor units */
201 ptCursor.x = pmi->dx * UserGetSystemMetrics(SM_CXSCREEN) >> 16;
202 ptCursor.y = pmi->dy * UserGetSystemMetrics(SM_CYSCREEN) >> 16;
203 }
204 }
205
206 /* Init message fields */
207 Msg.wParam = UserGetMouseButtonsState();
208 Msg.lParam = MAKELPARAM(ptCursor.x, ptCursor.y);
209 Msg.pt = ptCursor;
210 Msg.time = pmi->time;
211 if (!Msg.time)
212 {
213 Msg.time = EngGetTickCount32();
214 }
215
216 /* Do GetMouseMovePointsEx FIFO. */
220 gMouseHistoryOfMoves[gcMouseHistoryOfMoves].dwExtraInfo = pmi->dwExtraInfo;
222 gcMouseHistoryOfMoves = 0; // 0 - 63 is 64, FIFO forwards.
223
224 /* Update cursor position */
226 {
227 UserSetCursorPos(ptCursor.x, ptCursor.y, bInjected, pmi->dwExtraInfo, TRUE);
228 }
229
231 pCurInfo->ButtonsDown |= MK_SHIFT;
232 else
233 pCurInfo->ButtonsDown &= ~MK_SHIFT;
234
236 pCurInfo->ButtonsDown |= MK_CONTROL;
237 else
238 pCurInfo->ButtonsDown &= ~MK_CONTROL;
239
240 /* Left button */
242 {
244 Msg.message = WM_LBUTTONDOWN;
245 pCurInfo->ButtonsDown |= MK_LBUTTON;
246 Msg.wParam |= MK_LBUTTON;
247 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
248 }
249 else if (dwFlags & MOUSEEVENTF_LEFTUP)
250 {
252 Msg.message = WM_LBUTTONUP;
253 pCurInfo->ButtonsDown &= ~MK_LBUTTON;
254 Msg.wParam &= ~MK_LBUTTON;
255 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
256 }
257
258 /* Middle button */
260 {
262 Msg.message = WM_MBUTTONDOWN;
263 pCurInfo->ButtonsDown |= MK_MBUTTON;
264 Msg.wParam |= MK_MBUTTON;
265 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
266 }
267 else if (dwFlags & MOUSEEVENTF_MIDDLEUP)
268 {
270 Msg.message = WM_MBUTTONUP;
271 pCurInfo->ButtonsDown &= ~MK_MBUTTON;
272 Msg.wParam &= ~MK_MBUTTON;
273 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
274 }
275
276 /* Right button */
278 {
280 Msg.message = WM_RBUTTONDOWN;
281 pCurInfo->ButtonsDown |= MK_RBUTTON;
282 Msg.wParam |= MK_RBUTTON;
283 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
284 }
285 else if (dwFlags & MOUSEEVENTF_RIGHTUP)
286 {
288 Msg.message = WM_RBUTTONUP;
289 pCurInfo->ButtonsDown &= ~MK_RBUTTON;
290 Msg.wParam &= ~MK_RBUTTON;
291 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
292 }
293
296 {
297 /* Fail because both types of events use the mouseData field */
298 WARN("Invalid flags!\n");
299 return FALSE;
300 }
301
302 /* X-Button (4 or 5) */
304 {
305 Msg.message = WM_XBUTTONDOWN;
306 if (pmi->mouseData & XBUTTON1)
307 {
308 SET_KEY_DOWN(gafAsyncKeyState, VK_XBUTTON1, TRUE);
309 pCurInfo->ButtonsDown |= MK_XBUTTON1;
310 Msg.wParam |= MAKEWPARAM(MK_XBUTTON1, XBUTTON1);
311 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
312 }
313 if (pmi->mouseData & XBUTTON2)
314 {
315 SET_KEY_DOWN(gafAsyncKeyState, VK_XBUTTON2, TRUE);
316 pCurInfo->ButtonsDown |= MK_XBUTTON2;
317 Msg.wParam |= MAKEWPARAM(MK_XBUTTON2, XBUTTON2);
318 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
319 }
320 }
321 else if (dwFlags & MOUSEEVENTF_XUP)
322 {
323 Msg.message = WM_XBUTTONUP;
324 if(pmi->mouseData & XBUTTON1)
325 {
326 SET_KEY_DOWN(gafAsyncKeyState, VK_XBUTTON1, FALSE);
327 pCurInfo->ButtonsDown &= ~MK_XBUTTON1;
328 Msg.wParam &= ~MK_XBUTTON1;
329 Msg.wParam |= MAKEWPARAM(0, XBUTTON1);
330 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
331 }
332 if (pmi->mouseData & XBUTTON2)
333 {
334 SET_KEY_DOWN(gafAsyncKeyState, VK_XBUTTON2, FALSE);
335 pCurInfo->ButtonsDown &= ~MK_XBUTTON2;
336 Msg.wParam &= ~MK_XBUTTON2;
337 Msg.wParam |= MAKEWPARAM(0, XBUTTON2);
338 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
339 }
340 }
341
342 /* Mouse wheel */
344 {
345 Msg.message = WM_MOUSEWHEEL;
346 Msg.wParam = MAKEWPARAM(pCurInfo->ButtonsDown, pmi->mouseData);
347 co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
348 }
349
350 return TRUE;
351}
#define ARRAYSIZE(a)
Definition: cat.c:25
struct @1887 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:159
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:138
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().

◆ 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().