17{
19 UINT cbSize, cbRequiredSize;
21
23 {
25 cbSize = *pcbSize;
26 }
28 {
31 }
33
36 ;
38 {
41 return Ret;
42 }
43
45
46 switch (uiCommand)
47 {
48 case RIDI_PREPARSEDDATA:
50 cbRequiredSize =
DeviceInfo->Hid.CollectionInformation.DescriptorSize;
51 else
52 cbRequiredSize = 0;
53 break;
54 case RIDI_DEVICENAME:
56 break;
57 case RIDI_DEVICEINFO:
58 cbRequiredSize = sizeof(RID_DEVICE_INFO);
59 break;
60 default:
63 }
64
66 {
68 {
70 *pcbSize = cbRequiredSize;
71 Ret = 0;
73 }
74
75 if (cbSize < cbRequiredSize)
76 {
78 *pcbSize = cbRequiredSize;
81 }
82
84 switch (uiCommand)
85 {
86 case RIDI_PREPARSEDDATA:
89 break;
90 case RIDI_DEVICENAME:
91
92
96 break;
97 case RIDI_DEVICEINFO:
98 {
99 PRID_DEVICE_INFO prdi =
pData;
101 if (prdi->cbSize != cbRequiredSize)
102 {
105 }
106
109 prdi->cbSize = sizeof(*prdi);
111
113 {
114 case RIM_TYPEMOUSE:
115 prdi->mouse.dwId =
DeviceInfo->Mouse.Attributes.MouseIdentifier & ~HORIZONTAL_WHEEL_PRESENT;
116 prdi->mouse.dwNumberOfButtons =
DeviceInfo->Mouse.Attributes.NumberOfButtons;
117 prdi->mouse.dwSampleRate =
DeviceInfo->Mouse.Attributes.SampleRate;
119 break;
120
121 case RIM_TYPEKEYBOARD:
122 prdi->keyboard.dwType =
DeviceInfo->Keyboard.Attributes.KeyboardIdentifier.Type;
123 prdi->keyboard.dwSubType =
DeviceInfo->Keyboard.Attributes.KeyboardIdentifier.Subtype;
124 prdi->keyboard.dwKeyboardMode =
DeviceInfo->Keyboard.Attributes.KeyboardMode;
125 prdi->keyboard.dwNumberOfFunctionKeys =
DeviceInfo->Keyboard.Attributes.NumberOfFunctionKeys;
126 prdi->keyboard.dwNumberOfIndicators =
DeviceInfo->Keyboard.Attributes.NumberOfIndicators;
127 prdi->keyboard.dwNumberOfKeysTotal =
DeviceInfo->Keyboard.Attributes.NumberOfKeysTotal;
128 break;
129
130 case RIM_TYPEHID:
131 prdi->hid.dwVendorId =
DeviceInfo->Hid.CollectionInformation.VendorID;
132 prdi->hid.dwProductId =
DeviceInfo->Hid.CollectionInformation.ProductID;
133 prdi->hid.dwVersionNumber =
DeviceInfo->Hid.CollectionInformation.VersionNumber;
134 prdi->hid.usUsagePage =
DeviceInfo->Hid.Caps.UsagePage;
135 prdi->hid.usUsage =
DeviceInfo->Hid.Caps.Usage;
136 break;
137
138 default:
139 break;
140 }
141 break;
142 }
143 default:
145 break;
146 }
147 Ret = cbRequiredSize;
148 }
150 {
152 }
154
158 return Ret;
159}
#define ERROR_INSUFFICIENT_BUFFER
#define ERROR_INVALID_PARAMETER
#define ERROR_INVALID_HANDLE
static void cleanup(void)
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)
#define EXCEPTION_EXECUTE_HANDLER
#define HORIZONTAL_WHEEL_PRESENT
VOID FASTCALL UserLeave(VOID)
VOID FASTCALL UserEnterShared(VOID)
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
#define _SEH2_YIELD(__stmt)
TW_UINT32 TW_UINT16 TW_UINT16 TW_MEMREF pData
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
VOID FASTCALL SetLastNtError(_In_ NTSTATUS Status)
ENGAPI VOID APIENTRY EngSetLastError(_In_ ULONG iError)