ReactOS  0.4.13-dev-257-gfabbd7c
input.h File Reference
#include <ndk/kbd.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
 

Macros

#define KLF_UNLOAD   0x20000000
 
#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 tagKBDNLSLAYERPKBDNLSLAYER
 
typedef struct tagKBDFILE KBDFILE
 
typedef struct tagKBDFILEPKBDFILE
 
typedef struct tagKL KL
 
typedef struct tagKLPKL
 
typedef struct _ATTACHINFO ATTACHINFO
 
typedef struct _ATTACHINFOPATTACHINFO
 

Functions

INIT_FUNCTION 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)
 
INIT_FUNCTION NTSTATUS NTAPI InitKeyboardImpl (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 (PUSER_MESSAGE_QUEUE, PWND, UINT, WPARAM, LPARAM)
 

Variables

PATTACHINFO gpai
 
int gLanguageToggleKeyState
 
DWORD gdwLanguageToggleKey
 
DWORD gSystemFS
 
UINT gSystemCPCharSet
 
HANDLE ghKeyboardDevice
 
PTHREADINFO ptiRawInput
 
BYTE gafAsyncKeyState [256 *2/8]
 
PKL gspklBaseLayout
 
KEYBOARD_ATTRIBUTES gKeyboardInfo
 

Macro Definition Documentation

◆ GET_KS_BYTE

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

Definition at line 95 of file input.h.

◆ GET_KS_DOWN_BIT

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

Definition at line 96 of file input.h.

◆ GET_KS_LOCK_BIT

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

Definition at line 97 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 98 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 99 of file input.h.

◆ KLF_UNLOAD

#define KLF_UNLOAD   0x20000000

Definition at line 51 of file input.h.

◆ KS_DOWN_BIT

#define KS_DOWN_BIT   0x80

Definition at line 54 of file input.h.

◆ KS_LOCK_BIT

#define KS_LOCK_BIT   0x01

Definition at line 55 of file input.h.

◆ LP_DO_NOT_CARE_BIT

#define LP_DO_NOT_CARE_BIT   (1<<25)

Definition at line 59 of file input.h.

◆ SC_KEY_UP

#define SC_KEY_UP   0x8000

Definition at line 57 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)))
#define down(mutex)
Definition: glue.h:29
#define GET_KS_BYTE(vk)
Definition: input.h:95
#define GET_KS_DOWN_BIT(vk)
Definition: input.h:96

Definition at line 100 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 down(mutex)
Definition: glue.h:29
#define GET_KS_LOCK_BIT(vk)
Definition: input.h:97
#define GET_KS_BYTE(vk)
Definition: input.h:95

Definition at line 103 of file input.h.

◆ ThreadHasInputAccess

#define ThreadHasInputAccess (   W32Thread)    (TRUE)

Definition at line 68 of file input.h.

Typedef Documentation

◆ ATTACHINFO

◆ KBDFILE

◆ KBDNLSLAYER

◆ KL

typedef struct tagKL KL

◆ PATTACHINFO

◆ PKBDFILE

◆ PKBDNLSLAYER

◆ PKL

typedef struct tagKL * PKL

Function Documentation

◆ DoTheScreenSaver()

VOID FASTCALL DoTheScreenSaver ( VOID  )

Definition at line 48 of file input.c.

49 {
50  DWORD Test, TO;
51 
52  if (gspv.iScrSaverTimeout > 0) // Zero means Off.
53  {
56  TO = 1000 * gspv.iScrSaverTimeout;
57  if (Test > TO)
58  {
59  TRACE("Screensaver Message Start! Tick %lu Timeout %d \n", Test, gspv.iScrSaverTimeout);
60 
61  if (ppiScrnSaver) // We are or we are not the screensaver, prevent reentry...
62  {
63  if (!(ppiScrnSaver->W32PF_flags & W32PF_IDLESCREENSAVER))
64  {
65  ppiScrnSaver->W32PF_flags |= W32PF_IDLESCREENSAVER;
66  ERR("Screensaver is Idle\n");
67  }
68  }
69  else
70  {
71  PUSER_MESSAGE_QUEUE ForegroundQueue = IntGetFocusMessageQueue();
72  if (ForegroundQueue && ForegroundQueue->spwndActive)
73  UserPostMessage(hwndSAS, WM_LOGONNOTIFY, LN_START_SCREENSAVE, 1); // lParam 1 == Secure
74  else
76  }
77  }
78  }
79 }
BOOL FASTCALL UserPostMessage(HWND Wnd, UINT Msg, WPARAM wParam, LPARAM lParam)
Definition: message.c:1181
PPROCESSINFO ppiScrnSaver
Definition: main.c:30
#define EngGetTickCount32()
Definition: eng.h:43
INT iScrSaverTimeout
Definition: sysparams.h:110
PUSER_MESSAGE_QUEUE FASTCALL IntGetFocusMessageQueue(VOID)
Definition: desktop.c:1271
#define LN_START_SCREENSAVE
Definition: undocuser.h:119
HWND hwndSAS
Definition: winsta.c:24
#define TRACE(s)
Definition: solgame.cpp:4
SPIVALUES gspv
Definition: sysparams.c:17
unsigned long DWORD
Definition: ntddk_ex.h:95
#define W32PF_IDLESCREENSAVER
Definition: win32.h:27
#define WM_LOGONNOTIFY
Definition: undocuser.h:37
#define ERR(fmt,...)
Definition: debug.h:109
static DWORD LastInputTick
Definition: input.c:21

Referenced by HungAppSysTimerProc().

◆ InitInputImpl()

INIT_FUNCTION NTSTATUS NTAPI InitInputImpl ( VOID  )

Definition at line 360 of file input.c.

361 {
363  if (!MasterTimer)
364  {
365  ERR("Failed to allocate memory\n");
366  ASSERT(FALSE);
367  return STATUS_UNSUCCESSFUL;
368  }
370 
371  return STATUS_SUCCESS;
372 }
PKTIMER MasterTimer
Definition: input.c:16
VOID NTAPI KeInitializeTimer(OUT PKTIMER Timer)
Definition: timerobj.c:233
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define USERTAG_SYSTEM
Definition: tags.h:281
#define ERR(fmt,...)
Definition: debug.h:109
return STATUS_SUCCESS
Definition: btrfs.c:2745

Referenced by DriverEntry().

◆ InitKeyboardImpl()

INIT_FUNCTION NTSTATUS NTAPI InitKeyboardImpl ( VOID  )

Definition at line 31 of file keyboard.c.

32 {
35  // Clear and set default information.
37  gKeyboardInfo.KeyboardIdentifier.Type = 4; /* AT-101 */
38  gKeyboardInfo.NumberOfFunctionKeys = 12; /* We're doing an 101 for now, so return 12 F-keys */
39  return STATUS_SUCCESS;
40 }
UCHAR Type
Definition: ntddkbd.h:101
BYTE gafAsyncKeyState[256 *2/8]
Definition: keyboard.c:13
static BYTE gafAsyncKeyStateRecentDown[256/8]
Definition: keyboard.c:14
KEYBOARD_ID KeyboardIdentifier
Definition: ntddkbd.h:124
USHORT NumberOfFunctionKeys
Definition: ntddkbd.h:126
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
KEYBOARD_ATTRIBUTES gKeyboardInfo
Definition: keyboard.c:17
return STATUS_SUCCESS
Definition: btrfs.c:2745

Referenced by DriverEntry().

◆ IntBlockInput()

BOOL FASTCALL IntBlockInput ( PTHREADINFO  W32Thread,
BOOL  BlockIt 
)

Definition at line 375 of file input.c.

376 {
377  PTHREADINFO OldBlock;
378  ASSERT(pti);
379 
380  if(!pti->rpdesk || ((pti->TIF_flags & TIF_INCLEANUP) && BlockIt))
381  {
382  /*
383  * Fail blocking if exiting the thread
384  */
385 
386  return FALSE;
387  }
388 
389  /*
390  * FIXME: Check access rights of the window station
391  * e.g. services running in the service window station cannot block input
392  */
393  if(!ThreadHasInputAccess(pti) ||
394  !IntIsActiveDesktop(pti->rpdesk))
395  {
397  return FALSE;
398  }
399 
400  ASSERT(pti->rpdesk);
401  OldBlock = pti->rpdesk->BlockInputThread;
402  if(OldBlock)
403  {
404  if(OldBlock != pti)
405  {
407  return FALSE;
408  }
409  pti->rpdesk->BlockInputThread = (BlockIt ? pti : NULL);
410  return OldBlock == NULL;
411  }
412 
413  pti->rpdesk->BlockInputThread = (BlockIt ? pti : NULL);
414  return OldBlock == NULL;
415 }
struct _DESKTOP * rpdesk
Definition: win32.h:91
#define ERROR_ACCESS_DENIED
Definition: compat.h:87
#define ThreadHasInputAccess(W32Thread)
Definition: input.h:68
smooth NULL
Definition: ftsmooth.c:416
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define IntIsActiveDesktop(Desktop)
Definition: desktop.h:198
#define TIF_INCLEANUP
Definition: ntuser.h:240
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
Definition: error.c:27

Referenced by ExitThreadCallback(), and NtUserBlockInput().

◆ IntImmProcessKey()

UINT FASTCALL IntImmProcessKey ( PUSER_MESSAGE_QUEUE  ,
PWND  ,
UINT  ,
WPARAM  ,
LPARAM   
)

Definition at line 14 of file ime.c.

15 {
16  PKL pKbdLayout;
17 
18  ASSERT_REFS_CO(pWnd);
19 
20  if ( Msg == WM_KEYDOWN ||
21  Msg == WM_SYSKEYDOWN ||
22  Msg == WM_KEYUP ||
23  Msg == WM_SYSKEYUP )
24  {
25  //Vk = wParam & 0xff;
26  pKbdLayout = pWnd->head.pti->KeyboardLayout;
27  if (pKbdLayout == NULL) return 0;
28  //
29  if (!(gpsi->dwSRVIFlags & SRVINFO_IMM32)) return 0;
30  // need ime.h!
31  }
32  // Call User32:
33  // Anything but BOOL!
34  //ImmRet = co_IntImmProcessKey(UserHMGetHandle(pWnd), pKbdLayout->hkl, Vk, lParam, HotKey);
35  FIXME(" is UNIMPLEMENTED.\n");
36  return 0;
37 }
#define ASSERT_REFS_CO(_obj_)
Definition: userfuncs.h:13
struct @1567 Msg[]
PSERVERINFO gpsi
Definition: main.c:27
DWORD dwSRVIFlags
Definition: ntuser.h:1004
#define FIXME(fmt,...)
Definition: debug.h:110
HEAD head
Definition: input.h:28
smooth NULL
Definition: ftsmooth.c:416
Definition: input.h:26
#define WM_KEYDOWN
Definition: winuser.h:1691
#define WM_KEYUP
Definition: winuser.h:1692
#define WM_SYSKEYUP
Definition: winuser.h:1696
#define SRVINFO_IMM32
Definition: ntuser.h:910
#define WM_SYSKEYDOWN
Definition: winuser.h:1695

Referenced by co_IntProcessKeyboardMessage().

◆ IsRemoveAttachThread()

BOOL FASTCALL IsRemoveAttachThread ( PTHREADINFO  )

Definition at line 437 of file input.c.

438 {
440  PATTACHINFO pai;
441  BOOL Ret = TRUE;
442  PTHREADINFO ptiFrom = NULL, ptiTo = NULL;
443 
444  do
445  {
446  if (!gpai) return TRUE;
447 
448  pai = gpai; // Bottom of the list.
449 
450  do
451  {
452  if (pai->pti2 == pti)
453  {
454  ptiFrom = pai->pti1;
455  ptiTo = pti;
456  break;
457  }
458  if (pai->pti1 == pti)
459  {
460  ptiFrom = pti;
461  ptiTo = pai->pti2;
462  break;
463  }
464  pai = pai->paiNext;
465 
466  } while (pai);
467 
468  if (!pai && !ptiFrom && !ptiTo) break;
469 
470  Status = UserAttachThreadInput(ptiFrom, ptiTo, FALSE);
471  if (!NT_SUCCESS(Status)) Ret = FALSE;
472 
473  } while (Ret);
474 
475  return Ret;
476 }
PTHREADINFO pti1
Definition: input.h:44
#define TRUE
Definition: types.h:120
NTSTATUS FASTCALL UserAttachThreadInput(PTHREADINFO ptiFrom, PTHREADINFO ptiTo, BOOL fAttach)
Definition: input.c:479
PATTACHINFO gpai
Definition: input.c:17
LONG NTSTATUS
Definition: precomp.h:26
struct _ATTACHINFO * paiNext
Definition: input.h:43
unsigned int BOOL
Definition: ntddk_ex.h:94
PTHREADINFO pti2
Definition: input.h:45
smooth NULL
Definition: ftsmooth.c:416
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
Status
Definition: gdiplustypes.h:24

Referenced by ExitThreadCallback().

◆ RawInputThreadMain()

VOID NTAPI RawInputThreadMain ( VOID  )

Definition at line 124 of file input.c.

125 {
126  NTSTATUS MouStatus = STATUS_UNSUCCESSFUL, KbdStatus = STATUS_UNSUCCESSFUL, Status;
127  IO_STATUS_BLOCK MouIosb, KbdIosb;
128  PFILE_OBJECT pKbdDevice = NULL, pMouDevice = NULL;
130  //LARGE_INTEGER WaitTimeout;
131  PVOID WaitObjects[4], pSignaledObject = NULL;
133  ULONG cWaitObjects = 0, cMaxWaitObjects = 2;
134  MOUSE_INPUT_DATA MouseInput;
135  KEYBOARD_INPUT_DATA KeyInput;
137  HWINSTA hWinSta;
138 
139  ByteOffset.QuadPart = (LONGLONG)0;
140  //WaitTimeout.QuadPart = (LONGLONG)(-10000000);
141 
145 
146  TRACE("Raw Input Thread %p\n", ptiRawInput);
147 
150 
152  0,
153  NULL,
156  UserMode,
157  (PHANDLE)&hWinSta);
158  if (NT_SUCCESS(Status))
159  {
161  }
162  else
163  {
164  ASSERT(FALSE);
165  /* Failed to open the interactive winsta! What now? */
166  }
167 
169  StartTheTimers();
170  UserLeave();
171 
174 
176  for (;;)
177  {
178  if (!ghMouseDevice)
179  {
180  /* Check if mouse device already exists */
181  Status = OpenInputDevice(&ghMouseDevice, &pMouDevice, L"\\Device\\PointerClass0" );
182  if (NT_SUCCESS(Status))
183  {
184  ++cMaxWaitObjects;
185  TRACE("Mouse connected!\n");
186  }
187  }
188  if (!ghKeyboardDevice)
189  {
190  /* Check if keyboard device already exists */
191  Status = OpenInputDevice(&ghKeyboardDevice, &pKbdDevice, L"\\Device\\KeyboardClass0");
192  if (NT_SUCCESS(Status))
193  {
194  ++cMaxWaitObjects;
195  TRACE("Keyboard connected!\n");
196  // Get and load keyboard attributes.
199  // Register the Window hotkey.
201  // Register the Window Snap hotkey.
206  // Register the debug hotkeys.
208  UserLeave();
209  }
210  }
211 
212  /* Reset WaitHandles array */
213  cWaitObjects = 0;
214  WaitObjects[cWaitObjects++] = ShutdownEvent;
215  WaitObjects[cWaitObjects++] = MasterTimer;
216 
217  if (ghMouseDevice)
218  {
219  /* Try to read from mouse if previous reading is not pending */
220  if (MouStatus != STATUS_PENDING)
221  {
222  MouStatus = ZwReadFile(ghMouseDevice,
223  NULL,
224  NULL,
225  NULL,
226  &MouIosb,
227  &MouseInput,
228  sizeof(MOUSE_INPUT_DATA),
229  &ByteOffset,
230  NULL);
231  }
232 
233  if (MouStatus == STATUS_PENDING)
234  WaitObjects[cWaitObjects++] = &pMouDevice->Event;
235  }
236 
237  if (ghKeyboardDevice)
238  {
239  /* Try to read from keyboard if previous reading is not pending */
240  if (KbdStatus != STATUS_PENDING)
241  {
242  KbdStatus = ZwReadFile(ghKeyboardDevice,
243  NULL,
244  NULL,
245  NULL,
246  &KbdIosb,
247  &KeyInput,
248  sizeof(KEYBOARD_INPUT_DATA),
249  &ByteOffset,
250  NULL);
251 
252  }
253  if (KbdStatus == STATUS_PENDING)
254  WaitObjects[cWaitObjects++] = &pKbdDevice->Event;
255  }
256 
257  /* If all objects are pending, wait for them */
258  if (cWaitObjects == cMaxWaitObjects)
259  {
260  Status = KeWaitForMultipleObjects(cWaitObjects,
261  WaitObjects,
262  WaitAny,
263  UserRequest,
264  KernelMode,
265  TRUE,
266  NULL,//&WaitTimeout,
268 
269  if ((Status >= STATUS_WAIT_0) &&
270  (Status < (STATUS_WAIT_0 + (LONG)cWaitObjects)))
271  {
272  /* Some device has finished reading */
273  pSignaledObject = WaitObjects[Status - STATUS_WAIT_0];
274 
275  /* Check if it is mouse or keyboard and update status */
276  if ((MouStatus == STATUS_PENDING) &&
277  (pSignaledObject == &pMouDevice->Event))
278  {
279  MouStatus = MouIosb.Status;
280  }
281  else if ((KbdStatus == STATUS_PENDING) &&
282  (pSignaledObject == &pKbdDevice->Event))
283  {
284  KbdStatus = KbdIosb.Status;
285  }
286  else if (pSignaledObject == MasterTimer)
287  {
288  ProcessTimers();
289  }
290  else if (pSignaledObject == ShutdownEvent)
291  {
292  break;
293  }
294  else ASSERT(FALSE);
295  }
296  }
297 
298  /* Have we successed reading from mouse? */
299  if (NT_SUCCESS(MouStatus) && MouStatus != STATUS_PENDING)
300  {
301  TRACE("MouseEvent\n");
302 
303  /* Set LastInputTick */
305 
306  /* Process data */
308  UserProcessMouseInput(&MouseInput);
309  UserLeave();
310  }
311  else if (MouStatus != STATUS_PENDING)
312  ERR("Failed to read from mouse: %x.\n", MouStatus);
313 
314  /* Have we successed reading from keyboard? */
315  if (NT_SUCCESS(KbdStatus) && KbdStatus != STATUS_PENDING)
316  {
317  TRACE("KeyboardEvent: %s %04x\n",
318  (KeyInput.Flags & KEY_BREAK) ? "up" : "down",
319  KeyInput.MakeCode);
320 
321  /* Set LastInputTick */
323 
324  /* Process data */
326  UserProcessKeyboardInput(&KeyInput);
327  UserLeave();
328  }
329  else if (KbdStatus != STATUS_PENDING)
330  ERR("Failed to read from keyboard: %x.\n", KbdStatus);
331  }
332 
333  if (ghMouseDevice)
334  {
335  (void)ZwCancelIoFile(ghMouseDevice, &MouIosb);
337  ObDereferenceObject(pMouDevice);
339  }
340 
341  if (ghKeyboardDevice)
342  {
345  ObDereferenceObject(pKbdDevice);
347  }
348 
349  ERR("Raw Input Thread Exit!\n");
350 }
#define IDHK_SNAP_DOWN
Definition: hotkey.h:23
#define MAXIMUM_ALLOWED
Definition: nt_native.h:83
NTSYSAPI NTSTATUS NTAPI ZwCancelIoFile(_In_ HANDLE FileHandle, _Out_ PIO_STATUS_BLOCK IoStatusBlock)
#define TRUE
Definition: types.h:120
static NTSTATUS NTAPI OpenInputDevice(PHANDLE pHandle, PFILE_OBJECT *ppObject, CONST WCHAR *pszDeviceName)
Definition: input.c:88
POBJECT_TYPE ExWindowStationObjectType
Definition: win32k.c:25
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
Definition: typeof.h:49
PKTIMER MasterTimer
Definition: input.c:16
#define PsGetCurrentThread()
Definition: env_spec_w32.h:81
static HANDLE ghMouseDevice
Definition: input.c:22
VOID FASTCALL StartTheTimers(VOID)
Definition: timer.c:368
FLONG TIF_flags
Definition: win32.h:94
PWINSTATION_OBJECT InputWindowStation
Definition: winsta.c:21
#define PWND_BOTTOM
Definition: ntuser.h:731
LONG NTSTATUS
Definition: precomp.h:26
#define VK_LEFT
Definition: winuser.h:2178
#define LOW_REALTIME_PRIORITY
VOID NTAPI ObDereferenceObject(IN PVOID Object)
Definition: obref.c:375
#define VK_DOWN
Definition: winuser.h:2181
VOID NTAPI UserInitKeyboard(HANDLE hKeyboardDevice)
Definition: keyboard.c:161
#define KEY_BREAK
Definition: ntddkbd.h:71
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:2739
#define TIF_SYSTEMTHREAD
Definition: ntuser.h:242
HANDLE ghKeyboardDevice
Definition: input.c:19
struct _THREADINFO * GetW32ThreadInfo(VOID)
Definition: misc.c:781
VOID FASTCALL StartDebugHotKeys(VOID)
Definition: hotkey.c:44
NTSTATUS NTAPI PoRequestShutdownEvent(OUT PVOID *Event)
Definition: poshtdwn.c:396
#define STATUS_WAIT_0
Definition: ntstatus.h:223
#define VK_UP
Definition: winuser.h:2179
#define IDHK_SNAP_RIGHT
Definition: hotkey.h:21
long LONG
Definition: pedump.c:60
smooth NULL
Definition: ftsmooth.c:416
static HANDLE ShutdownEvent
Definition: dcomlaunch.c:28
PTHREADINFO ptiRawInput
Definition: input.c:15
VOID FASTCALL UserEnterExclusive(VOID)
Definition: ntuser.c:247
int64_t LONGLONG
Definition: typedefs.h:66
#define TRACE(s)
Definition: solgame.cpp:4
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define STATUS_PENDING
Definition: ntstatus.h:82
#define IDHK_SNAP_UP
Definition: hotkey.h:22
VOID NTAPI UserProcessMouseInput(PMOUSE_INPUT_DATA pMouseInputData)
Definition: mouse.c:40
* PFILE_OBJECT
Definition: iotypes.h:1954
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
struct _CLIENTINFO * pClientInfo
Definition: win32.h:93
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define STATUS_UNSUCCESSFUL
Definition: udferr_usr.h:132
NTSTATUS NTAPI ObCloseHandle(IN HANDLE Handle, IN KPROCESSOR_MODE AccessMode)
Definition: obhandle.c:3376
BOOL FASTCALL UserSetProcessWindowStation(HWINSTA hWindowStation)
Definition: winsta.c:1346
static const WCHAR L[]
Definition: oid.c:1250
PVOID *typedef PHANDLE
Definition: ntsecpkg.h:414
BOOL FASTCALL UserRegisterHotKey(PWND pWnd, int id, UINT fsModifiers, UINT vk)
Definition: hotkey.c:431
Status
Definition: gdiplustypes.h:24
#define VK_RIGHT
Definition: winuser.h:2180
#define ERR(fmt,...)
Definition: debug.h:109
VOID FASTCALL UserLeave(VOID)
Definition: ntuser.c:255
VOID FASTCALL ProcessTimers(VOID)
Definition: timer.c:446
KPRIORITY NTAPI KeSetPriorityThread(IN PKTHREAD Thread, IN KPRIORITY Priority)
Definition: thrdobj.c:1327
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
#define IDHK_SNAP_LEFT
Definition: hotkey.h:20
VOID NTAPI UserProcessKeyboardInput(PKEYBOARD_INPUT_DATA pKeyInput)
Definition: keyboard.c:1051
unsigned int ULONG
Definition: retypes.h:1
_Must_inspect_result_ _In_ WAIT_TYPE _In_opt_ PLARGE_INTEGER _In_opt_ PKWAIT_BLOCK WaitBlockArray
Definition: fsrtlfuncs.h:1151
#define MOD_WIN
Definition: winuser.h:2598
#define IDHK_WINKEY
Definition: hotkey.h:16
IN PDCB IN PCCB IN VBO IN OUT PULONG OUT PDIRENT OUT PBCB OUT PVBO ByteOffset
Definition: fatprocs.h:716
static DWORD FASTCALL IntLastInputTick(BOOL bUpdate)
Definition: input.c:32
#define NT_ASSERT
Definition: rtlfuncs.h:3312

Referenced by UserSystemThreadProc().

◆ UserAttachThreadInput()

NTSTATUS FASTCALL UserAttachThreadInput ( PTHREADINFO  ,
PTHREADINFO  ,
BOOL   
)

Definition at line 479 of file input.c.

480 {
481  MSG msg;
482  PATTACHINFO pai;
483  PCURICON_OBJECT CurIcon;
484 
485  /* Can not be the same thread. */
486  if (ptiFrom == ptiTo) return STATUS_INVALID_PARAMETER;
487 
488  /* Do not attach to system threads or between different desktops. */
489  if (ptiFrom->TIF_flags & TIF_DONTATTACHQUEUE ||
490  ptiTo->TIF_flags & TIF_DONTATTACHQUEUE ||
491  ptiFrom->rpdesk != ptiTo->rpdesk)
492  return STATUS_ACCESS_DENIED;
493 
494  /* MSDN Note:
495  Keyboard and mouse events received by both threads are processed by the thread specified by the idAttachTo.
496  */
497 
498  /* If Attach set, allocate and link. */
499  if (fAttach)
500  {
502  if (!pai) return STATUS_NO_MEMORY;
503 
504  pai->paiNext = gpai;
505  pai->pti1 = ptiFrom;
506  pai->pti2 = ptiTo;
507  gpai = pai;
508  paiCount++;
509  ERR("Attach Allocated! ptiFrom 0x%p ptiTo 0x%p paiCount %d\n",ptiFrom,ptiTo,paiCount);
510 
511  if (ptiTo->MessageQueue != ptiFrom->MessageQueue)
512  {
513 
514  ptiTo->MessageQueue->iCursorLevel -= ptiFrom->iCursorLevel;
515 
516  if (ptiFrom->MessageQueue == gpqForeground)
517  {
518  ERR("ptiFrom is Foreground\n");
519  ptiTo->MessageQueue->spwndActive = ptiFrom->MessageQueue->spwndActive;
520  ptiTo->MessageQueue->spwndFocus = ptiFrom->MessageQueue->spwndFocus;
521  ptiTo->MessageQueue->spwndCapture = ptiFrom->MessageQueue->spwndCapture;
522  ptiTo->MessageQueue->QF_flags ^= ((ptiTo->MessageQueue->QF_flags ^ ptiFrom->MessageQueue->QF_flags) & QF_CAPTURELOCKED);
523  RtlCopyMemory(&ptiTo->MessageQueue->CaretInfo,
524  &ptiFrom->MessageQueue->CaretInfo,
525  sizeof(ptiTo->MessageQueue->CaretInfo));
527  IntSetFocusMessageQueue(ptiTo->MessageQueue);
528  gptiForeground = ptiTo;
529  }
530  else
531  {
532  ERR("ptiFrom NOT Foreground\n");
533  if ( ptiTo->MessageQueue->spwndActive == 0 )
534  ptiTo->MessageQueue->spwndActive = ptiFrom->MessageQueue->spwndActive;
535  if ( ptiTo->MessageQueue->spwndFocus == 0 )
536  ptiTo->MessageQueue->spwndFocus = ptiFrom->MessageQueue->spwndFocus;
537  }
538 
539  CurIcon = ptiFrom->MessageQueue->CursorObject;
540 
541  MsqDestroyMessageQueue(ptiFrom);
542 
543  if (CurIcon)
544  {
545  // Could be global. Keep it above the water line!
546  UserReferenceObject(CurIcon);
547  }
548 
549  if (CurIcon && UserObjectInDestroy(UserHMGetHandle(CurIcon)))
550  {
551  UserDereferenceObject(CurIcon);
552  CurIcon = NULL;
553  }
554 
555  ptiFrom->MessageQueue = ptiTo->MessageQueue;
556 
557  // Pass cursor From if To is null. Pass test_SetCursor parent_id == current pti ID.
558  if (CurIcon && ptiTo->MessageQueue->CursorObject == NULL)
559  {
560  ERR("ptiTo receiving ptiFrom Cursor\n");
561  ptiTo->MessageQueue->CursorObject = CurIcon;
562  }
563 
564  ptiFrom->MessageQueue->cThreads++;
565  ERR("ptiTo S Share count %u\n", ptiFrom->MessageQueue->cThreads);
566 
567  IntReferenceMessageQueue(ptiTo->MessageQueue);
568  }
569  else
570  {
571  ERR("Attach Threads are already associated!\n");
572  }
573  }
574  else /* If clear, unlink and free it. */
575  {
576  BOOL Hit = FALSE;
577  PATTACHINFO *ppai;
578 
579  if (!gpai) return STATUS_INVALID_PARAMETER;
580 
581  /* Search list and free if found or return false. */
582  ppai = &gpai;
583  while (*ppai != NULL)
584  {
585  if ( (*ppai)->pti2 == ptiTo && (*ppai)->pti1 == ptiFrom )
586  {
587  pai = *ppai;
588  /* Remove it from the list */
589  *ppai = (*ppai)->paiNext;
591  paiCount--;
592  Hit = TRUE;
593  break;
594  }
595  ppai = &((*ppai)->paiNext);
596  }
597 
598  if (!Hit) return STATUS_INVALID_PARAMETER;
599 
600  ERR("Attach Free! ptiFrom 0x%p ptiTo 0x%p paiCount %d\n",ptiFrom,ptiTo,paiCount);
601 
602  if (ptiTo->MessageQueue == ptiFrom->MessageQueue)
603  {
604  PWND spwndActive = ptiTo->MessageQueue->spwndActive;
605  PWND spwndFocus = ptiTo->MessageQueue->spwndFocus;
606 
607  if (gptiForeground == ptiFrom)
608  {
609  ERR("ptiTo is now pti FG.\n");
610  // MessageQueue foreground is set so switch threads.
611  gptiForeground = ptiTo;
612  }
613  ptiTo->MessageQueue->cThreads--;
614  ERR("ptiTo E Share count %u\n", ptiTo->MessageQueue->cThreads);
615  ASSERT(ptiTo->MessageQueue->cThreads >= 1);
616 
617  IntDereferenceMessageQueue(ptiTo->MessageQueue);
618 
619  ptiFrom->MessageQueue = MsqCreateMessageQueue(ptiFrom);
620 
621  if (spwndActive)
622  {
623  if (spwndActive->head.pti == ptiFrom)
624  {
625  ptiFrom->MessageQueue->spwndActive = spwndActive;
626  ptiTo->MessageQueue->spwndActive = 0;
627  }
628  }
629  if (spwndFocus)
630  {
631  if (spwndFocus->head.pti == ptiFrom)
632  {
633  ptiFrom->MessageQueue->spwndFocus = spwndFocus;
634  ptiTo->MessageQueue->spwndFocus = 0;
635  }
636  }
637  ptiTo->MessageQueue->iCursorLevel -= ptiFrom->iCursorLevel;
638  }
639  else
640  {
641  ERR("Detaching Threads are not associated!\n");
642  }
643  }
644  /* Note that key state, which can be ascertained by calls to the GetKeyState
645  or GetKeyboardState function, is reset after a call to AttachThreadInput.
646  ATM which one?
647  */
648  RtlCopyMemory(ptiTo->MessageQueue->afKeyState, gafAsyncKeyState, sizeof(gafAsyncKeyState));
649 
650  ptiTo->MessageQueue->msgDblClk.message = 0;
651 
652  /* Generate mouse move message */
653  msg.message = WM_MOUSEMOVE;
654  msg.wParam = UserGetMouseButtonsState();
655  msg.lParam = MAKELPARAM(gpsi->ptCursor.x, gpsi->ptCursor.y);
656  msg.pt = gpsi->ptCursor;
658 
659  return STATUS_SUCCESS;
660 }
BYTE gafAsyncKeyState[256 *2/8]
Definition: keyboard.c:13
PUSER_MESSAGE_QUEUE gpqForeground
Definition: focus.c:12
PTHREADINFO pti1
Definition: input.h:44
#define TRUE
Definition: types.h:120
NTSYSAPI VOID NTAPI RtlCopyMemory(VOID UNALIGNED *Destination, CONST VOID UNALIGNED *Source, ULONG Length)
VOID FASTCALL co_MsqInsertMouseMessage(MSG *Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: msgqueue.c:580
PATTACHINFO gpai
Definition: input.c:17
#define STATUS_INVALID_PARAMETER
Definition: udferr_usr.h:135
#define TIF_DONTATTACHQUEUE
Definition: ntuser.h:246
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
#define MAKELPARAM(l, h)
Definition: winuser.h:3915
BOOL FASTCALL UserDereferenceObject(PVOID Object)
Definition: object.c:610
PSERVERINFO gpsi
Definition: main.c:27
WORD FASTCALL UserGetMouseButtonsState(VOID)
Definition: mouse.c:22
#define IntReferenceMessageQueue(MsgQueue)
Definition: msgqueue.h:217
struct _ATTACHINFO * paiNext
Definition: input.h:43
PTHREADINFO gptiForeground
Definition: focus.c:14
unsigned int BOOL
Definition: ntddk_ex.h:94
#define QF_CAPTURELOCKED
Definition: msgqueue.h:111
PTHREADINFO pti2
Definition: input.h:45
THRDESKHEAD head
Definition: ntuser.h:659
#define USERTAG_ATTACHINFO
Definition: tags.h:196
INT paiCount
Definition: input.c:18
smooth NULL
Definition: ftsmooth.c:416
BOOL FASTCALL UserObjectInDestroy(HANDLE h)
Definition: object.c:669
#define UserHMGetHandle(obj)
Definition: ntuser.h:208
#define IntDereferenceMessageQueue(MsgQueue)
Definition: msgqueue.h:220
VOID FASTCALL MsqDestroyMessageQueue(_In_ PTHREADINFO pti)
Definition: msgqueue.c:2449
PUSER_MESSAGE_QUEUE FASTCALL MsqCreateMessageQueue(PTHREADINFO pti)
Definition: msgqueue.c:2422
#define STATUS_ACCESS_DENIED
Definition: udferr_usr.h:145
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
#define ExAllocatePoolWithTag(hernya, size, tag)
Definition: env_spec_w32.h:350
#define ERR(fmt,...)
Definition: debug.h:109
Definition: ntuser.h:657
struct _USER_MESSAGE_QUEUE * MessageQueue
Definition: win32.h:88
VOID FASTCALL IntSetFocusMessageQueue(PUSER_MESSAGE_QUEUE NewQueue)
Definition: desktop.c:1283
#define STATUS_NO_MEMORY
Definition: ntstatus.h:246
#define WM_MOUSEMOVE
Definition: winuser.h:1751
#define msg(x)
Definition: auth_time.c:54
#define ExFreePoolWithTag(_P, _T)
Definition: module.h:1099
return STATUS_SUCCESS
Definition: btrfs.c:2745
VOID FASTCALL UserReferenceObject(PVOID obj)
Definition: object.c:697

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 }
BYTE gafAsyncKeyState[256 *2/8]
Definition: keyboard.c:13
#define MK_SHIFT
Definition: winuser.h:2323
#define VK_SHIFT
Definition: winuser.h:2156
unsigned short WORD
Definition: ntddk_ex.h:93
PSYSTEM_CURSORINFO IntGetSysCursorInfo(VOID)
Definition: cursoricon.c:187
#define MK_CONTROL
Definition: winuser.h:2324
#define VK_CONTROL
Definition: winuser.h:2157
#define IS_KEY_DOWN(ks, vk)
Definition: input.h:98

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

◆ UserHklToKbl()

PKL NTAPI UserHklToKbl ( HKL  hKl)

Definition at line 370 of file kbdlayout.c.

371 {
372  PKL pKl = gspklBaseLayout;
373 
374  if (!gspklBaseLayout)
375  return NULL;
376 
377  do
378  {
379  if (pKl->hkl == hKl)
380  return pKl;
381 
382  pKl = pKl->pklNext;
383  } while (pKl != gspklBaseLayout);
384 
385  return NULL;
386 }
PKL gspklBaseLayout
Definition: kbdlayout.c:20
smooth NULL
Definition: ftsmooth.c:416
Definition: input.h:26
HKL hkl
Definition: input.h:32
struct tagKL * pklNext
Definition: input.h:29

Referenced by NtUserActivateKeyboardLayout(), NtUserLoadKeyboardLayoutEx(), NtUserMapVirtualKeyEx(), NtUserToUnicodeEx(), NtUserUnloadKeyboardLayout(), NtUserVkKeyScanEx(), and UserSetDefaultInputLang().

◆ UserInitKeyboard()

VOID NTAPI UserInitKeyboard ( HANDLE  hKeyboardDevice)

Definition at line 161 of file keyboard.c.

162 {
164  IO_STATUS_BLOCK Block;
165 
167 
168  Status = ZwDeviceIoControlFile(hKeyboardDevice,
169  NULL,
170  NULL,
171  NULL,
172  &Block,
174  NULL, 0,
175  &gIndicators,
176  sizeof(gIndicators));
177 
178  if (!NT_SUCCESS(Status))
179  {
180  WARN("NtDeviceIoControlFile() failed, ignored\n");
181  gIndicators.LedFlags = 0;
182  gIndicators.UnitId = 0;
183  }
184 
191 
192  // FIXME: Need device driver to work! HID support more than one!!!!
193  Status = ZwDeviceIoControlFile(hKeyboardDevice,
194  NULL,
195  NULL,
196  NULL,
197  &Block,
199  NULL, 0,
200  &gKeyboardInfo, sizeof(gKeyboardInfo));
201 
202  if (!NT_SUCCESS(Status))
203  {
204  ERR("NtDeviceIoControlFile() failed, ignored\n");
205  }
206  TRACE("Keyboard type %u, subtype %u and number of func keys %u\n",
210 }
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)
UCHAR Type
Definition: ntddkbd.h:101
BYTE gafAsyncKeyState[256 *2/8]
Definition: keyboard.c:13
#define WARN(fmt,...)
Definition: debug.h:111
LONG NTSTATUS
Definition: precomp.h:26
static KEYBOARD_INDICATOR_PARAMETERS gIndicators
Definition: keyboard.c:16
#define KEYBOARD_CAPS_LOCK_ON
Definition: ntddkbd.h:81
smooth NULL
Definition: ftsmooth.c:416
static PKEYBOARD_INDICATOR_TRANSLATION gpKeyboardIndicatorTrans
Definition: keyboard.c:15
#define IOCTL_KEYBOARD_QUERY_INDICATORS
Definition: ntddkbd.h:35
#define TRACE(s)
Definition: solgame.cpp:4
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
KEYBOARD_ID KeyboardIdentifier
Definition: ntddkbd.h:124
UCHAR Subtype
Definition: ntddkbd.h:102
Status
Definition: gdiplustypes.h:24
#define ERR(fmt,...)
Definition: debug.h:109
USHORT NumberOfFunctionKeys
Definition: ntddkbd.h:126
#define VK_SCROLL
Definition: winuser.h:2234
#define VK_NUMLOCK
Definition: winuser.h:2233
#define KEYBOARD_SCROLL_LOCK_ON
Definition: ntddkbd.h:83
#define VK_CAPITAL
Definition: winuser.h:2160
#define IOCTL_KEYBOARD_QUERY_ATTRIBUTES
Definition: ntddkbd.h:32
#define KEYBOARD_NUM_LOCK_ON
Definition: ntddkbd.h:82
NTSTATUS APIENTRY IntKeyboardGetIndicatorTrans(HANDLE hKeyboardDevice, PKEYBOARD_INDICATOR_TRANSLATION *ppIndicatorTrans)
Definition: keyboard.c:50
KEYBOARD_ATTRIBUTES gKeyboardInfo
Definition: keyboard.c:17
#define SET_KEY_LOCKED(ks, vk, down)
Definition: input.h:103

Referenced by RawInputThreadMain().

◆ UserProcessKeyboardInput()

VOID NTAPI UserProcessKeyboardInput ( PKEYBOARD_INPUT_DATA  pKeyInput)

Definition at line 1051 of file keyboard.c.

1053 {
1054  WORD wScanCode, wVk;
1055  PKL pKl = NULL;
1056  PKBDTABLES pKbdTbl;
1057  PUSER_MESSAGE_QUEUE pFocusQueue;
1058 
1059  /* Calculate scan code with prefix */
1060  wScanCode = pKbdInputData->MakeCode & 0x7F;
1061  if (pKbdInputData->Flags & KEY_E0)
1062  wScanCode |= 0xE000;
1063  if (pKbdInputData->Flags & KEY_E1)
1064  wScanCode |= 0xE100;
1065 
1066  /* Find the target thread whose locale is in effect */
1067  pFocusQueue = IntGetFocusMessageQueue();
1068 
1069  if (pFocusQueue && pFocusQueue->ptiKeyboard)
1070  {
1071  pKl = pFocusQueue->ptiKeyboard->KeyboardLayout;
1072  }
1073 
1074  if (!pKl)
1075  pKl = W32kGetDefaultKeyLayout();
1076  if (!pKl)
1077  return;
1078 
1079  pKbdTbl = pKl->spkf->pKbdTbl;
1080 
1081  /* Convert scan code to virtual key.
1082  Note: We could call UserSendKeyboardInput using scan code,
1083  but it wouldn't interpret E1 key(s) properly */
1084  wVk = IntVscToVk(wScanCode, pKbdTbl);
1085  TRACE("UserProcessKeyboardInput: %x (break: %u) -> %x\n",
1086  wScanCode, (pKbdInputData->Flags & KEY_BREAK) ? 1u : 0, wVk);
1087 
1088  if (wVk)
1089  {
1090  KEYBDINPUT KbdInput;
1091 
1092  /* Support numlock */
1094  {
1095  wVk = IntTranslateNumpadKey(wVk & 0xFF);
1096  }
1097 
1098  /* Send keyboard input */
1099  KbdInput.wVk = wVk & 0xFF;
1100  KbdInput.wScan = wScanCode & 0x7F;
1101  KbdInput.dwFlags = 0;
1102  if (pKbdInputData->Flags & KEY_BREAK)
1103  KbdInput.dwFlags |= KEYEVENTF_KEYUP;
1104 
1105  if (wVk & KBDEXT)
1106  KbdInput.dwFlags |= KEYEVENTF_EXTENDEDKEY;
1107  //
1108  // Based on wine input:test_Input_blackbox this is okay. It seems the
1109  // bit did not get set and more research is needed. Now the right
1110  // shift works.
1111  //
1112  if (wVk == VK_RSHIFT)
1113  KbdInput.dwFlags |= KEYEVENTF_EXTENDEDKEY;
1114 
1115  KbdInput.time = 0;
1116  KbdInput.dwExtraInfo = pKbdInputData->ExtraInformation;
1117  UserSendKeyboardInput(&KbdInput, FALSE);
1118 
1119  /* E1 keys don't have break code */
1120  if (pKbdInputData->Flags & KEY_E1)
1121  {
1122  /* Send key up event */
1123  KbdInput.dwFlags |= KEYEVENTF_KEYUP;
1124  UserSendKeyboardInput(&KbdInput, FALSE);
1125  }
1126  }
1127 }
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble * u
Definition: glfuncs.h:240
#define KEYEVENTF_KEYUP
Definition: winuser.h:1092
BYTE gafAsyncKeyState[256 *2/8]
Definition: keyboard.c:13
PTHREADINFO ptiKeyboard
Definition: msgqueue.h:56
static WORD FASTCALL IntVscToVk(WORD wScanCode, PKBDTABLES pKbdTbl)
Definition: keyboard.c:562
DWORD time
Definition: winable.h:50
#define KEY_BREAK
Definition: ntddkbd.h:71
BOOL NTAPI UserSendKeyboardInput(KEYBDINPUT *pKbdInput, BOOL bInjected)
Definition: keyboard.c:973
PUSER_MESSAGE_QUEUE FASTCALL IntGetFocusMessageQueue(VOID)
Definition: desktop.c:1271
#define KBDNUMPAD
Definition: kbd.h:11
smooth NULL
Definition: ftsmooth.c:416
Definition: input.h:26
#define IS_KEY_LOCKED(ks, vk)
Definition: input.h:99
DWORD dwFlags
Definition: winable.h:49
#define TRACE(s)
Definition: solgame.cpp:4
Definition: kbd.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
static WORD IntTranslateNumpadKey(WORD wVk)
Definition: keyboard.c:272
struct _KBDTABLES * pKbdTbl
Definition: input.h:21
#define VK_RSHIFT
Definition: winuser.h:2237
struct tagKL * KeyboardLayout
Definition: win32.h:89
#define KEY_E1
Definition: ntddkbd.h:73
#define KBDEXT
Definition: kbd.h:8
WORD wScan
Definition: winable.h:48
#define VK_NUMLOCK
Definition: winuser.h:2233
#define KEY_E0
Definition: ntddkbd.h:72
PKL W32kGetDefaultKeyLayout(VOID)
Definition: kbdlayout.c:343
#define KEYEVENTF_EXTENDEDKEY
Definition: winuser.h:1091
PKBDFILE spkf
Definition: input.h:33
ULONG_PTR dwExtraInfo
Definition: winable.h:51
WORD wVk
Definition: winable.h:47

Referenced by RawInputThreadMain().

◆ UserProcessMouseInput()

VOID NTAPI UserProcessMouseInput ( PMOUSE_INPUT_DATA  pMouseInputData)

Definition at line 40 of file mouse.c.

41 {
42  MOUSEINPUT mi;
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 }
#define MOUSEEVENTF_LEFTDOWN
Definition: winuser.h:1170
#define MOUSEEVENTF_ABSOLUTE
Definition: winuser.h:1180
#define MOUSE_MIDDLE_BUTTON_DOWN
Definition: ntddmou.h:50
#define MOUSE_LEFT_BUTTON_DOWN
Definition: ntddmou.h:46
#define MOUSEEVENTF_WHEEL
Definition: winuser.h:1178
#define MOUSEEVENTF_XDOWN
Definition: winuser.h:1176
#define MOUSE_WHEEL
Definition: ntddmou.h:56
static MONITORINFO mi
Definition: win.c:7331
#define MOUSEEVENTF_MIDDLEDOWN
Definition: winuser.h:1174
#define MOUSEEVENTF_MIDDLEUP
Definition: winuser.h:1175
BOOL NTAPI UserSendMouseInput(MOUSEINPUT *pmi, BOOL bInjected)
Definition: mouse.c:168
#define MOUSEEVENTF_VIRTUALDESK
Definition: winuser.h:1179
#define MOUSE_BUTTON_4_DOWN
Definition: ntddmou.h:52
#define MOUSE_BUTTON_4_UP
Definition: ntddmou.h:53
#define MOUSE_BUTTON_5_UP
Definition: ntddmou.h:55
#define MOUSE_LEFT_BUTTON_UP
Definition: ntddmou.h:47
#define MOUSE_MIDDLE_BUTTON_UP
Definition: ntddmou.h:51
#define MOUSE_RIGHT_BUTTON_DOWN
Definition: ntddmou.h:48
#define MOUSEEVENTF_LEFTUP
Definition: winuser.h:1171
#define MOUSEEVENTF_RIGHTUP
Definition: winuser.h:1173
#define MOUSEEVENTF_MOVE
Definition: winuser.h:1169
#define MOUSEEVENTF_XUP
Definition: winuser.h:1177
DWORD dwFlags
Definition: winuser.h:3729
#define RtlZeroMemory(Destination, Length)
Definition: typedefs.h:261
#define MOUSE_RIGHT_BUTTON_UP
Definition: ntddmou.h:49
#define MOUSE_BUTTON_5_DOWN
Definition: ntddmou.h:54
#define MOUSE_MOVE_ABSOLUTE
Definition: ntddmou.h:68
#define MOUSEEVENTF_RIGHTDOWN
Definition: winuser.h:1172
#define MOUSE_VIRTUAL_DESKTOP
Definition: ntddmou.h:69

Referenced by RawInputThreadMain().

◆ UserSendKeyboardInput()

BOOL NTAPI UserSendKeyboardInput ( KEYBDINPUT pKbdInput,
BOOL  bInjected 
)

Definition at line 973 of file keyboard.c.

974 {
975  WORD wScanCode, wVk;
976  PKL pKl = NULL;
977  PKBDTABLES pKbdTbl;
978  PUSER_MESSAGE_QUEUE pFocusQueue;
979  DWORD dwTime;
980  BOOL bExt = (pKbdInput->dwFlags & KEYEVENTF_EXTENDEDKEY) ? TRUE : FALSE;
981 
983 
984  /* Find the target thread whose locale is in effect */
985  pFocusQueue = IntGetFocusMessageQueue();
986 
987  if (pFocusQueue && pFocusQueue->ptiKeyboard)
988  {
989  pKl = pFocusQueue->ptiKeyboard->KeyboardLayout;
990  }
991 
992  if (!pKl)
993  pKl = W32kGetDefaultKeyLayout();
994  if (!pKl)
995  {
996  ERR("No keyboard layout!\n");
997  return FALSE;
998  }
999 
1000  pKbdTbl = pKl->spkf->pKbdTbl;
1001 
1002  /* Note: wScan field is always used */
1003  wScanCode = pKbdInput->wScan;
1004 
1005  if (pKbdInput->dwFlags & KEYEVENTF_UNICODE)
1006  {
1007  /* Generate WM_KEYDOWN msg with wParam == VK_PACKET and
1008  high order word of lParam == pKbdInput->wScan */
1009  wVk = VK_PACKET;
1010  }
1011  else
1012  {
1013  wScanCode &= 0x7F;
1014  if (pKbdInput->dwFlags & KEYEVENTF_SCANCODE)
1015  {
1016  /* Don't ignore invalid scan codes */
1017  wVk = IntVscToVk(wScanCode | (bExt ? 0xE000 : 0), pKbdTbl);
1018  if (!wVk) /* use 0xFF if vsc is invalid */
1019  wVk = 0xFF;
1020  }
1021  else
1022  {
1023  wVk = pKbdInput->wVk & 0xFF;
1024  }
1025  }
1026 
1027  /* If time is given, use it */
1028  if (pKbdInput->time)
1029  dwTime = pKbdInput->time;
1030  else
1031  {
1033  }
1034 
1035  if (wVk == VK_RMENU && (pKbdTbl->fLocaleFlags & KLLF_ALTGR))
1036  {
1037  /* For AltGr keyboards RALT generates CTRL events */
1038  ProcessKeyEvent(VK_LCONTROL, 0, pKbdInput->dwFlags & KEYEVENTF_KEYUP, bInjected, dwTime, 0);
1039  }
1040 
1041  /* Finally process this key */
1042  return ProcessKeyEvent(wVk, wScanCode, pKbdInput->dwFlags, bInjected, dwTime, pKbdInput->dwExtraInfo);
1043 }
#define TRUE
Definition: types.h:120
#define KEYEVENTF_KEYUP
Definition: winuser.h:1092
#define VK_RMENU
Definition: winuser.h:2241
#define EngGetTickCount32()
Definition: eng.h:43
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
PTHREADINFO ptiKeyboard
Definition: msgqueue.h:56
static WORD FASTCALL IntVscToVk(WORD wScanCode, PKBDTABLES pKbdTbl)
Definition: keyboard.c:562
DWORD time
Definition: winable.h:50
DWORD fLocaleFlags
Definition: kbd.h:106
PUSER_MESSAGE_QUEUE FASTCALL IntGetFocusMessageQueue(VOID)
Definition: desktop.c:1271
#define KLLF_ALTGR
Definition: kbd.h:91
unsigned int BOOL
Definition: ntddk_ex.h:94
PPROCESSINFO gppiInputProvider
Definition: ntuser.c:16
smooth NULL
Definition: ftsmooth.c:416
Definition: input.h:26
DWORD dwTime
Definition: solitaire.cpp:25
DWORD dwFlags
Definition: winable.h:49
struct _THREADINFO * PTHREADINFO
Definition: ntwin32.h:6
Definition: kbd.h:95
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned long DWORD
Definition: ntddk_ex.h:95
struct _KBDTABLES * pKbdTbl
Definition: input.h:21
struct tagKL * KeyboardLayout
Definition: win32.h:89
#define ERR(fmt,...)
Definition: debug.h:109
WORD wScan
Definition: winable.h:48
BOOL NTAPI ProcessKeyEvent(WORD wVk, WORD wScanCode, DWORD dwFlags, BOOL bInjected, DWORD dwTime, DWORD dwExtraInfo)
Definition: keyboard.c:800
PKL W32kGetDefaultKeyLayout(VOID)
Definition: kbdlayout.c:343
#define KEYEVENTF_EXTENDEDKEY
Definition: winuser.h:1091
PKBDFILE spkf
Definition: input.h:33
ULONG_PTR dwExtraInfo
Definition: winable.h:51
#define VK_LCONTROL
Definition: winuser.h:2238
WORD wVk
Definition: winable.h:47

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;
173  DWORD dwFlags;
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 
230  /* Left button */
232  {
234  Msg.message = WM_LBUTTONDOWN;
235  pCurInfo->ButtonsDown |= MK_LBUTTON;
236  Msg.wParam |= MK_LBUTTON;
237  co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
238  }
239  else if (dwFlags & MOUSEEVENTF_LEFTUP)
240  {
242  Msg.message = WM_LBUTTONUP;
243  pCurInfo->ButtonsDown &= ~MK_LBUTTON;
244  Msg.wParam &= ~MK_LBUTTON;
245  co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
246  }
247 
248  /* Middle button */
250  {
252  Msg.message = WM_MBUTTONDOWN;
253  pCurInfo->ButtonsDown |= MK_MBUTTON;
254  Msg.wParam |= MK_MBUTTON;
255  co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
256  }
257  else if (dwFlags & MOUSEEVENTF_MIDDLEUP)
258  {
260  Msg.message = WM_MBUTTONUP;
261  pCurInfo->ButtonsDown &= ~MK_MBUTTON;
262  Msg.wParam &= ~MK_MBUTTON;
263  co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
264  }
265 
266  /* Right button */
268  {
270  Msg.message = WM_RBUTTONDOWN;
271  pCurInfo->ButtonsDown |= MK_RBUTTON;
272  Msg.wParam |= MK_RBUTTON;
273  co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
274  }
275  else if (dwFlags & MOUSEEVENTF_RIGHTUP)
276  {
278  Msg.message = WM_RBUTTONUP;
279  pCurInfo->ButtonsDown &= ~MK_RBUTTON;
280  Msg.wParam &= ~MK_RBUTTON;
281  co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
282  }
283 
286  {
287  /* Fail because both types of events use the mouseData field */
288  WARN("Invalid flags!\n");
289  return FALSE;
290  }
291 
292  /* X-Button (4 or 5) */
294  {
295  Msg.message = WM_XBUTTONDOWN;
296  if (pmi->mouseData & XBUTTON1)
297  {
298  SET_KEY_DOWN(gafAsyncKeyState, VK_XBUTTON1, TRUE);
299  pCurInfo->ButtonsDown |= MK_XBUTTON1;
300  Msg.wParam |= MAKEWPARAM(MK_XBUTTON1, XBUTTON1);
301  co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
302  }
303  if (pmi->mouseData & XBUTTON2)
304  {
305  SET_KEY_DOWN(gafAsyncKeyState, VK_XBUTTON2, TRUE);
306  pCurInfo->ButtonsDown |= MK_XBUTTON2;
307  Msg.wParam |= MAKEWPARAM(MK_XBUTTON2, XBUTTON2);
308  co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
309  }
310  }
311  else if (dwFlags & MOUSEEVENTF_XUP)
312  {
313  Msg.message = WM_XBUTTONUP;
314  if(pmi->mouseData & XBUTTON1)
315  {
316  SET_KEY_DOWN(gafAsyncKeyState, VK_XBUTTON1, FALSE);
317  pCurInfo->ButtonsDown &= ~MK_XBUTTON1;
318  Msg.wParam &= ~MK_XBUTTON1;
319  Msg.wParam |= MAKEWPARAM(0, XBUTTON2);
320  co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
321  }
322  if (pmi->mouseData & XBUTTON2)
323  {
324  SET_KEY_DOWN(gafAsyncKeyState, VK_XBUTTON2, FALSE);
325  pCurInfo->ButtonsDown &= ~MK_XBUTTON2;
326  Msg.wParam &= ~MK_XBUTTON2;
327  Msg.wParam |= MAKEWPARAM(0, XBUTTON2);
328  co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
329  }
330  }
331 
332  /* Mouse wheel */
334  {
335  Msg.message = WM_MOUSEWHEEL;
336  Msg.wParam = MAKEWPARAM(pCurInfo->ButtonsDown, pmi->mouseData);
337  co_MsqInsertMouseMessage(&Msg, bInjected, pmi->dwExtraInfo, TRUE);
338  }
339 
340  return TRUE;
341 }
#define WM_MBUTTONUP
Definition: winuser.h:1759
BYTE gafAsyncKeyState[256 *2/8]
Definition: keyboard.c:13
#define MOUSEEVENTF_LEFTDOWN
Definition: winuser.h:1170
#define TRUE
Definition: types.h:120
VOID FASTCALL co_MsqInsertMouseMessage(MSG *Msg, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: msgqueue.c:580
#define MAKEWPARAM(l, h)
Definition: winuser.h:3916
#define MOUSEEVENTF_ABSOLUTE
Definition: winuser.h:1180
long y
Definition: polytest.cpp:48
#define WM_LBUTTONDOWN
Definition: winuser.h:1752
#define MK_LBUTTON
Definition: winuser.h:2321
long x
Definition: polytest.cpp:48
#define SM_CXVIRTUALSCREEN
Definition: winuser.h:1028
#define VK_LBUTTON
Definition: winuser.h:2144
#define MOUSEEVENTF_WHEEL
Definition: winuser.h:1178
#define MOUSEEVENTF_XDOWN
Definition: winuser.h:1176
#define EngGetTickCount32()
Definition: eng.h:43
#define WM_MOUSEWHEEL
Definition: treelist.c:96
#define MK_MBUTTON
Definition: winuser.h:2325
TW_UINT32 TW_UINT16 TW_UINT16 MSG
Definition: twain.h:1827
#define WARN(fmt,...)
Definition: debug.h:111
#define MAKELPARAM(l, h)
Definition: winuser.h:3915
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
Definition: thread.c:805
#define ARRAYSIZE(array)
Definition: filtermapper.c:47
struct @1567 Msg[]
#define MOUSEEVENTF_MIDDLEDOWN
Definition: winuser.h:1174
#define MOUSEEVENTF_MIDDLEUP
Definition: winuser.h:1175
WORD FASTCALL UserGetMouseButtonsState(VOID)
Definition: mouse.c:22
BOOL UserSetCursorPos(INT x, INT y, DWORD flags, ULONG_PTR dwExtraInfo, BOOL Hook)
Definition: cursoricon.c:238
PSERVERINFO gpsi
Definition: main.c:27
#define MOUSEEVENTF_VIRTUALDESK
Definition: winuser.h:1179
#define SM_CXSCREEN
Definition: winuser.h:949
#define VK_RBUTTON
Definition: winuser.h:2145
#define SET_KEY_DOWN(ks, vk, down)
Definition: input.h:100
PPROCESSINFO gppiInputProvider
Definition: ntuser.c:16
#define MK_RBUTTON
Definition: winuser.h:2322
#define SM_CYVIRTUALSCREEN
Definition: winuser.h:1029
#define WM_RBUTTONDOWN
Definition: winuser.h:1755
LONG NTAPI UserGetSystemMetrics(ULONG Index)
Definition: metric.c:180
#define SM_CYSCREEN
Definition: winuser.h:950
INT gcMouseHistoryOfMoves
Definition: mouse.c:14
struct _THREADINFO * PTHREADINFO
Definition: ntwin32.h:6
PSYSTEM_CURSORINFO IntGetSysCursorInfo(VOID)
Definition: cursoricon.c:187
unsigned long DWORD
Definition: ntddk_ex.h:95
#define WM_RBUTTONUP
Definition: winuser.h:1756
ASSERT((InvokeOnSuccess||InvokeOnError||InvokeOnCancel) ?(CompletionRoutine !=NULL) :TRUE)
_In_ PCCERT_CONTEXT _In_ DWORD dwFlags
Definition: wincrypt.h:1175
#define MOUSEEVENTF_LEFTUP
Definition: winuser.h:1171
#define MOUSEEVENTF_RIGHTUP
Definition: winuser.h:1173
#define MOUSEEVENTF_MOVE
Definition: winuser.h:1169
#define WM_LBUTTONUP
Definition: winuser.h:1753
#define WM_MBUTTONDOWN
Definition: winuser.h:1758
#define MOUSEEVENTF_XUP
Definition: winuser.h:1177
DWORD IntFixMouseInputButtons(DWORD dwFlags)
Definition: mouse.c:138
MOUSEMOVEPOINT gMouseHistoryOfMoves[64]
Definition: mouse.c:13
#define VK_MBUTTON
Definition: winuser.h:2147
#define MOUSEEVENTF_RIGHTDOWN
Definition: winuser.h:1172

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

◆ UserSetDefaultInputLang()

BOOL NTAPI UserSetDefaultInputLang ( HKL  hKl)

Definition at line 395 of file kbdlayout.c.

396 {
397  PKL pKl;
398 
399  pKl = UserHklToKbl(hKl);
400  if (!pKl)
401  return FALSE;
402 
403  gspklBaseLayout = pKl;
404  return TRUE;
405 }
#define TRUE
Definition: types.h:120
PKL gspklBaseLayout
Definition: kbdlayout.c:20
Definition: input.h:26
PKL NTAPI UserHklToKbl(HKL hKl)
Definition: kbdlayout.c:370

Referenced by SpiGetSet().

◆ W32kGetDefaultKeyLayout()

PKL W32kGetDefaultKeyLayout ( VOID  )

Definition at line 343 of file kbdlayout.c.

344 {
345  PKL pKl = gspklBaseLayout;
346 
347  if (!pKl)
348  return NULL;
349 
350  /* Return not unloaded layout */
351  do
352  {
353  if (!(pKl->dwKL_Flags & KLF_UNLOAD))
354  return pKl;
355 
356  pKl = pKl->pklPrev; /* Confirmed on Win2k */
357  } while(pKl != gspklBaseLayout);
358 
359  /* We have not found proper KL */
360  return NULL;
361 }
struct tagKL * pklPrev
Definition: input.h:30
#define KLF_UNLOAD
Definition: input.h:51
PKL gspklBaseLayout
Definition: kbdlayout.c:20
smooth NULL
Definition: ftsmooth.c:416
Definition: input.h:26
DWORD dwKL_Flags
Definition: input.h:31

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

Variable Documentation

◆ gafAsyncKeyState

◆ gdwLanguageToggleKey

DWORD gdwLanguageToggleKey

◆ ghKeyboardDevice

HANDLE ghKeyboardDevice

Definition at line 19 of file input.c.

Referenced by ProcessKeyEvent(), and RawInputThreadMain().

◆ gKeyboardInfo

KEYBOARD_ATTRIBUTES gKeyboardInfo

◆ gLanguageToggleKeyState

int gLanguageToggleKeyState

Definition at line 18 of file keyboard.c.

Referenced by co_IntProcessKeyboardMessage().

◆ gpai

Definition at line 17 of file input.c.

Referenced by IsRemoveAttachThread(), and UserAttachThreadInput().

◆ gspklBaseLayout

◆ gSystemCPCharSet

UINT gSystemCPCharSet

Definition at line 23 of file kbdlayout.c.

Referenced by UserLoadKbdLayout().

◆ gSystemFS

DWORD gSystemFS

Definition at line 22 of file kbdlayout.c.

Referenced by co_IntProcessKeyboardMessage(), and UserLoadKbdLayout().

◆ ptiRawInput

PTHREADINFO ptiRawInput

Definition at line 15 of file input.c.

Referenced by IntSetTimer(), and RawInputThreadMain().