12#ifndef HID_USAGE_PAGE_GENERIC
13#define HID_USAGE_PAGE_GENERIC 0x01
16#ifndef HID_USAGE_GENERIC_MOUSE
17#define HID_USAGE_GENERIC_MOUSE 0x02
20#ifndef HID_USAGE_GENERIC_KEYBOARD
21#define HID_USAGE_GENERIC_KEYBOARD 0x06
31C_ASSERT(
sizeof(RAWINPUTHEADER) +
sizeof(RAWMOUSE) <=
sizeof(RAWINPUT));
32C_ASSERT(
sizeof(RAWINPUTHEADER) +
sizeof(RAWKEYBOARD) <=
sizeof(RAWINPUT));
34#define MAX_RAWINPUT_PER_QUEUE 256
78 case RIDI_PREPARSEDDATA:
80 cbRequiredSize =
DeviceInfo->Hid.CollectionInformation.DescriptorSize;
88 cbRequiredSize =
sizeof(RID_DEVICE_INFO);
100 *pcbSize = cbRequiredSize;
105 if (
cbSize < cbRequiredSize)
108 *pcbSize = cbRequiredSize;
116 case RIDI_PREPARSEDDATA:
120 case RIDI_DEVICENAME:
127 case RIDI_DEVICEINFO:
129 PRID_DEVICE_INFO prdi =
pData;
131 if (prdi->cbSize != cbRequiredSize)
139 prdi->cbSize =
sizeof(*prdi);
145 prdi->mouse.dwId =
DeviceInfo->Mouse.Attributes.MouseIdentifier & ~HORIZONTAL_WHEEL_PRESENT;
146 prdi->mouse.dwNumberOfButtons =
DeviceInfo->Mouse.Attributes.NumberOfButtons;
147 prdi->mouse.dwSampleRate =
DeviceInfo->Mouse.Attributes.SampleRate;
151 case RIM_TYPEKEYBOARD:
152 prdi->keyboard.dwType =
DeviceInfo->Keyboard.Attributes.KeyboardIdentifier.Type;
153 prdi->keyboard.dwSubType =
DeviceInfo->Keyboard.Attributes.KeyboardIdentifier.Subtype;
154 prdi->keyboard.dwKeyboardMode =
DeviceInfo->Keyboard.Attributes.KeyboardMode;
155 prdi->keyboard.dwNumberOfFunctionKeys =
DeviceInfo->Keyboard.Attributes.NumberOfFunctionKeys;
156 prdi->keyboard.dwNumberOfIndicators =
DeviceInfo->Keyboard.Attributes.NumberOfIndicators;
157 prdi->keyboard.dwNumberOfKeysTotal =
DeviceInfo->Keyboard.Attributes.NumberOfKeysTotal;
161 prdi->hid.dwVendorId =
DeviceInfo->Hid.CollectionInformation.VendorID;
162 prdi->hid.dwProductId =
DeviceInfo->Hid.CollectionInformation.ProductID;
163 prdi->hid.dwVersionNumber =
DeviceInfo->Hid.CollectionInformation.VersionNumber;
164 prdi->hid.usUsagePage =
DeviceInfo->Hid.Caps.UsagePage;
165 prdi->hid.usUsage =
DeviceInfo->Hid.Caps.Usage;
177 Ret = cbRequiredSize;
202 case RIM_TYPEKEYBOARD:
233 const RAWINPUTDEVICE *
Device)
243 DPRINT1(
"RIDEV_NOLEGACY for raw %s is accepted but not implemented yet.\n",
244 IsMouse ?
"mouse" :
"keyboard");
249 DPRINT1(
"RIDEV_PAGEONLY is accepted but not implemented yet.\n");
252 DPRINT1(
"RIDEV_EXCLUDE is accepted but not implemented yet.\n");
256 DPRINT1(
"RIDEV_CAPTUREMOUSE for raw mouse is accepted but not implemented yet.\n");
259 DPRINT1(
"RIDEV_NOHOTKEYS for raw keyboard is accepted but not implemented yet.\n");
262 DPRINT1(
"RIDEV_APPKEYS for raw keyboard is accepted but not implemented yet.\n");
264 if (
Device->dwFlags & RIDEV_EXINPUTSINK)
265 DPRINT1(
"RIDEV_EXINPUTSINK is only partially implemented.\n");
267 if (
Device->dwFlags & RIDEV_DEVNOTIFY)
268 DPRINT1(
"RIDEV_DEVNOTIFY is accepted but not implemented yet.\n");
279 if (!MessageQueue || !hRawInput)
287 if ((HRAWINPUT)&RawEntry->
RawInput == hRawInput)
351 RawEntry->
RawInput.header.dwType = dwType;
352 RawEntry->
RawInput.header.dwSize =
sizeof(RAWINPUTHEADER) +
cbData;
353 RawEntry->
RawInput.header.hDevice = hDevice;
359 return (HRAWINPUT)&RawEntry->
RawInput;
390 (pMsg->wParam == RIM_INPUT || pMsg->wParam == RIM_INPUTSINK))
447 pti = pWnd->
head.pti;
456 *pwParam = (pti->
MessageQueue == pFocusQueue) ? RIM_INPUT : RIM_INPUTSINK;
467 *pwParam = RIM_INPUT;
476 *pwParam = RIM_INPUT;
493 if (cbSizeHeader !=
sizeof(RAWINPUTHEADER) || !pcbSize)
502 OutputDataSize = RawInput->header.dwSize;
506 OutputDataSize =
sizeof(RAWINPUTHEADER);
516 *pcbSize = OutputDataSize;
521 if (*pcbSize < OutputDataSize)
523 *pcbSize = OutputDataSize;
528 if (uiCommand == RID_HEADER)
533 return OutputDataSize;
550 if (cbSizeHeader !=
sizeof(RAWINPUTHEADER) || !pcbSize)
573 *pcbSize = RawEntry ? RawEntry->
RawInput.header.dwSize : 0;
590 NextEntry =
Entry->Flink;
601 RawSize = RawEntry->
RawInput.header.dwSize;
628 _Out_opt_ PRAWINPUTDEVICELIST pRawInputDeviceList,
635 if (
cbSize !=
sizeof(RAWINPUTDEVICELIST))
649 if (!pRawInputDeviceList)
652 *puiNumDevices = cDevices;
658 if (*puiNumDevices < cDevices)
661 *puiNumDevices = cDevices;
666 ProbeForWrite(pRawInputDeviceList, cDevices *
sizeof(*pRawInputDeviceList),
sizeof(
PVOID));
670 pRawInputDeviceList[
i].dwType =
DeviceInfo->DeviceType;
698 if (cbSizeHeader !=
sizeof(RAWINPUTHEADER) || !pcbSize)
726 _Out_opt_ PRAWINPUTDEVICE pRawInputDevices,
730 RAWINPUTDEVICE Registrations[2];
732 UINT cDevices = 0, uiNumDevices, Ret = (
UINT)-1;
734 if (
cbSize !=
sizeof(*pRawInputDevices))
753 if (!pRawInputDevices)
756 *puiNumDevices = cDevices;
762 uiNumDevices = *puiNumDevices;
763 if (uiNumDevices == 0)
770 if (uiNumDevices >
MAXULONG /
sizeof(*pRawInputDevices))
776 ProbeForWrite(pRawInputDevices, uiNumDevices *
sizeof(*pRawInputDevices),
sizeof(
PVOID));
777 if (uiNumDevices < cDevices)
780 *puiNumDevices = cDevices;
785 RtlCopyMemory(pRawInputDevices, Registrations, cDevices *
sizeof(*pRawInputDevices));
801 IN PCRAWINPUTDEVICE pRawInputDevices,
807 if (!pRawInputDevices || !uiNumDevices ||
cbSize !=
sizeof(RAWINPUTDEVICE))
816 2 *
sizeof(RAWINPUTDEVICE),
827 for (
i = 0;
i < uiNumDevices; ++
i)
830 const RAWINPUTDEVICE *
Device = &pRawInputDevices[
i];
#define ERROR_NOT_ENOUGH_MEMORY
#define ERROR_INSUFFICIENT_BUFFER
#define ERROR_INVALID_PARAMETER
#define ERROR_INVALID_HANDLE
static void cleanup(void)
static const WCHAR Message[]
#define RemoveEntryList(Entry)
#define InsertTailList(ListHead, Entry)
#define IsListEmpty(ListHead)
VOID NTAPI ProbeForRead(IN CONST VOID *Address, IN SIZE_T Length, IN ULONG Alignment)
VOID NTAPI ProbeForWrite(IN PVOID Address, IN SIZE_T Length, IN ULONG Alignment)
_Must_inspect_result_ _In_ CONST FLT_REGISTRATION * Registration
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
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 const GLfloat const GLdouble const GLfloat GLint i
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
_Must_inspect_result_ _In_ PUCXHUB_DEVICE_CREATE_INFO _Out_ UCXUSBDEVICE * Device
#define UserHMGetHandle(obj)
#define EXCEPTION_EXECUTE_HANDLER
VOID NTAPI ExInitializePagedLookasideList(IN PPAGED_LOOKASIDE_LIST Lookaside, IN PALLOCATE_FUNCTION Allocate OPTIONAL, IN PFREE_FUNCTION Free OPTIONAL, IN ULONG Flags, IN SIZE_T Size, IN ULONG Tag, IN USHORT Depth)
VOID FASTCALL ClearMsgBitsMask(PTHREADINFO pti, UINT MessageBits)
VOID FASTCALL MsqDestroyMessage(PUSER_MESSAGE Message)
#define HORIZONTAL_WHEEL_PRESENT
PVOID NTAPI PsGetCurrentThreadWin32Thread(VOID)
VOID FASTCALL UserLeave(VOID)
VOID FASTCALL UserEnterShared(VOID)
void * EngAllocMem(int zero, unsigned long size, int tag=0)
#define RIDEV_CAPTUREMOUSE
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
#define _SEH2_YIELD(__stmt)
struct _LIST_ENTRY * Flink
struct _USER_MESSAGE_QUEUE * MessageQueue
LIST_ENTRY HardwareMessagesListHead
LIST_ENTRY RawInputListHead
PCBYTE PBYTE SIZE_T cbData
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
TW_UINT32 TW_UINT16 TW_UINT16 MSG
#define FIELD_OFFSET(t, f)
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
PWND FASTCALL UserGetWindowObject(HWND hWnd)
_In_ WDFCOLLECTION _In_ ULONG Index
VOID FASTCALL SetLastNtError(_In_ NTSTATUS Status)
PUSER_MESSAGE_QUEUE FASTCALL IntGetFocusMessageQueue(VOID)
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)
struct LOOKASIDE_ALIGN _PAGED_LOOKASIDE_LIST PAGED_LOOKASIDE_LIST