47 if (!DeviceExtension->MouseAbsolute)
55 DeviceExtension->PreparsedData,
56 DeviceExtension->Report,
57 DeviceExtension->ReportLength);
65 DeviceExtension->MouseAbsolute =
TRUE;
73 DeviceExtension->PreparsedData,
74 DeviceExtension->Report,
75 DeviceExtension->ReportLength);
81 ASSERT(DeviceExtension->ValueCapsX.LogicalMax > 0);
82 ASSERT(DeviceExtension->ValueCapsX.LogicalMax > DeviceExtension->ValueCapsX.LogicalMin);
97 DeviceExtension->PreparsedData,
98 DeviceExtension->Report,
99 DeviceExtension->ReportLength);
105 ASSERT(DeviceExtension->ValueCapsX.LogicalMax > 0);
106 ASSERT(DeviceExtension->ValueCapsX.LogicalMax > DeviceExtension->ValueCapsX.LogicalMin);
112 if (!DeviceExtension->MouseAbsolute)
120 DeviceExtension->PreparsedData,
121 DeviceExtension->Report,
122 DeviceExtension->ReportLength);
130 DeviceExtension->MouseAbsolute =
TRUE;
138 DeviceExtension->PreparsedData,
139 DeviceExtension->Report,
140 DeviceExtension->ReportLength);
146 ASSERT(DeviceExtension->ValueCapsY.LogicalMax > 0);
147 ASSERT(DeviceExtension->ValueCapsY.LogicalMax > DeviceExtension->ValueCapsY.LogicalMin);
162 DeviceExtension->PreparsedData,
163 DeviceExtension->Report,
164 DeviceExtension->ReportLength);
170 ASSERT(DeviceExtension->ValueCapsY.LogicalMax > 0);
171 ASSERT(DeviceExtension->ValueCapsY.LogicalMax > DeviceExtension->ValueCapsY.LogicalMin);
188 ULONG CurrentUsageListLength;
195 CurrentUsageListLength = DeviceExtension->UsageListLength;
199 DeviceExtension->CurrentUsageList,
200 &CurrentUsageListLength,
201 DeviceExtension->PreparsedData,
202 DeviceExtension->Report,
203 DeviceExtension->ReportLength);
206 DPRINT1(
"MouHid_GetButtonFlags failed to get usages with %x\n",
Status);
212 DeviceExtension->CurrentUsageList,
213 DeviceExtension->BreakUsageList,
214 DeviceExtension->MakeUsageList,
215 DeviceExtension->UsageListLength);
218 DPRINT1(
"MouHid_GetButtonFlags failed to get usages with %x\n",
Status);
222 if (DeviceExtension->UsageListLength)
228 Usage = DeviceExtension->BreakUsageList[
Index];
243 if (DeviceExtension->UsageListLength)
249 Usage = DeviceExtension->MakeUsageList[
Index];
265 TempList = DeviceExtension->CurrentUsageList;
266 DeviceExtension->CurrentUsageList = DeviceExtension->PreviousUsageList;
267 DeviceExtension->PreviousUsageList = TempList;
269 if (DeviceExtension->MouseAbsolute)
282 ULONG InputDataConsumed;
284 if (!DeviceExtension->ClassService)
288 ASSERT(DeviceExtension->ClassService);
289 ASSERT(DeviceExtension->ClassDeviceObject);
295 (*(
PSERVICE_CALLBACK_ROUTINE)DeviceExtension->ClassService)(DeviceExtension->ClassDeviceObject, InputData, InputData + 1, &InputDataConsumed);
325 DPRINT1(
"[MOUHID] ReadCompletion terminating read Status %x\n",
Irp->IoStatus.Status);
350 MouseInputData.
LastX = LastX;
351 MouseInputData.
LastY = LastY;
374 DPRINT(
"[MOUHID] failed to get wheel status with %x\n",
Status);
378 DPRINT(
"[MOUHID] ReportData %02x %02x %02x %02x %02x %02x %02x\n",
379 DeviceExtension->
Report[0] & 0xFF,
380 DeviceExtension->
Report[1] & 0xFF, DeviceExtension->
Report[2] & 0xFF,
381 DeviceExtension->
Report[3] & 0xFF, DeviceExtension->
Report[4] & 0xFF,
382 DeviceExtension->
Report[5] & 0xFF, DeviceExtension->
Report[6] & 0xFF);
407 DeviceExtension->Irp->MdlAddress = DeviceExtension->ReportMDL;
413 IoStack->
Parameters.Read.Length = DeviceExtension->ReportLength;
417 IoStack->
FileObject = DeviceExtension->FileObject;
423 DeviceExtension->ReadReportActive =
TRUE;
455 DPRINT(
"MOUHID: IRP_MJ_CREATE\n");
504 DPRINT(
"[MOUHID] MouHid_InitiateRead: status %x\n",
Status);
571 DPRINT(
"[MOUHID] InternalDeviceControl %x\n", IoStack->
Parameters.DeviceIoControl.IoControlCode);
577 switch (IoStack->
Parameters.DeviceIoControl.IoControlCode)
584 DPRINT1(
"[MOUHID] IOCTL_MOUSE_QUERY_ATTRIBUTES Buffer too small\n");
608 DPRINT(
"[MOUHID] InputDataQueueLength %x\n",
Attributes->InputDataQueueLength);
666 DPRINT1(
"[MOUHID] Unknown DeviceControl %x\n", IoStack->
Parameters.DeviceIoControl.IoControlCode);
722 ULONG InputBufferSize,
724 ULONG OutputBufferSize,
796 DPRINT1(
"[MOUHID] failed to obtain collection information with %x\n",
Status);
819 DPRINT1(
"[MOUHID] failed to obtain collection information with %x\n",
Status);
927 DPRINT(
"[MOUHID] mouse wheel support detected\n",
Status);
945 DPRINT(
"[MOUHID] mouse wheel support detected with z-axis\n",
Status);
1005 if (DeviceExtension->
Report)
1122 Irp->IoStatus.Status = 0;
#define VIRTUAL_SCREEN_SIZE_X
#define DO_DEVICE_INITIALIZING
static USHORT MouHid_ButtonDownFlags[]
#define IRP_MN_CANCEL_REMOVE_DEVICE
return STATUS_NOT_SUPPORTED
#define STATUS_PRIVILEGE_NOT_HELD
#define KeRaiseIrql(irql, oldIrql)
NTSTATUS NTAPI MouHid_Power(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define IRP_MN_REMOVE_DEVICE
#define STATUS_INSUFFICIENT_RESOURCES
#define KeLowerIrql(oldIrql)
_Must_inspect_result_ _Out_writes_to_ DataLength PHIDP_DATA _Inout_ PULONG _In_ PHIDP_PREPARSED_DATA PreparsedData
#define MOUSE_MIDDLE_BUTTON_DOWN
#define MOUSE_LEFT_BUTTON_DOWN
#define IRP_MJ_FLUSH_BUFFERS
VOID NTAPI IoReuseIrp(IN OUT PIRP Irp, IN NTSTATUS Status)
NTSTATUS NTAPI MouHid_Flush(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define STATUS_MORE_PROCESSING_REQUIRED
IN BOOLEAN OUT PSTR Buffer
#define HID_USAGE_GENERIC_POINTER
VOID MouHid_DispatchInputData(IN PMOUHID_DEVICE_EXTENSION DeviceExtension, IN PMOUSE_INPUT_DATA InputData)
HIDAPI ULONG NTAPI HidP_MaxUsageListLength(IN HIDP_REPORT_TYPE ReportType, IN USAGE UsagePage OPTIONAL, IN PHIDP_PREPARSED_DATA PreparsedData)
#define STATUS_INVALID_PARAMETER
HIDP_VALUE_CAPS ValueCapsY
PDEVICE_OBJECT ClassDeviceObject
#define WHEELMOUSE_HID_HARDWARE
_Must_inspect_result_ _In_ USAGE _In_ USHORT _In_ USAGE Usage
#define IOCTL_INTERNAL_MOUSE_ENABLE
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG _In_opt_ PVOID Data
VOID NTAPI MmBuildMdlForNonPagedPool(IN PMDL Mdl)
_Must_inspect_result_ HIDAPI NTSTATUS NTAPI HidP_GetUsageValue(_In_ HIDP_REPORT_TYPE ReportType, _In_ USAGE UsagePage, _In_ USHORT LinkCollection, _In_ USAGE Usage, _Out_ PULONG UsageValue, _In_ PHIDP_PREPARSED_DATA PreparsedData, _In_reads_bytes_(ReportLength) PCHAR Report, _In_ ULONG ReportLength)
#define HIDP_STATUS_BAD_LOG_PHY_VALUES
_Must_inspect_result_ HIDAPI NTSTATUS NTAPI HidP_GetScaledUsageValue(_In_ HIDP_REPORT_TYPE ReportType, _In_ USAGE UsagePage, _In_ USHORT LinkCollection, _In_ USAGE Usage, _Out_ PLONG UsageValue, _In_ PHIDP_PREPARSED_DATA PreparsedData, _In_reads_bytes_(ReportLength) PCHAR Report, _In_ ULONG ReportLength)
static USHORT MouHid_ButtonUpFlags[]
_In_ ULONG _In_ ULONG State
#define STATUS_INVALID_DEVICE_REQUEST
NTSTATUS NTAPI MouHid_DeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
VOID NTAPI IoDetachDevice(IN PDEVICE_OBJECT TargetDevice)
VOID NTAPI MouHid_Unload(IN PDRIVER_OBJECT DriverObject)
#define HID_USAGE_GENERIC_MOUSE
PDEVICE_OBJECT PhysicalDeviceObject
#define VIRTUAL_SCREEN_SIZE_Y
KEVENT ReadCompletionEvent
LONG NTAPI KeSetEvent(IN PKEVENT Event, IN KPRIORITY Increment, IN BOOLEAN Wait)
NTSTATUS NTAPI KeWaitForSingleObject(IN PVOID Object, IN KWAIT_REASON WaitReason, IN KPROCESSOR_MODE WaitMode, IN BOOLEAN Alertable, IN PLARGE_INTEGER Timeout OPTIONAL)
_In_ WDFREQUEST _In_ NTSTATUS _In_ ULONG_PTR Information
_Must_inspect_result_ _In_ USAGE _In_ USHORT _In_ USAGE _Out_ PHIDP_VALUE_CAPS ValueCaps
#define IOCTL_HID_GET_COLLECTION_DESCRIPTOR
#define STATUS_BUFFER_TOO_SMALL
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
FORCEINLINE VOID IoCopyCurrentIrpStackLocationToNext(_Inout_ PIRP Irp)
HIDAPI NTSTATUS NTAPI HidP_GetSpecificValueCaps(IN HIDP_REPORT_TYPE ReportType, IN USAGE UsagePage, IN USHORT LinkCollection, IN USAGE Usage, OUT PHIDP_VALUE_CAPS ValueCaps, IN OUT PUSHORT ValueCapsLength, IN PHIDP_PREPARSED_DATA PreparsedData)
_In_ PDEVICE_OBJECT DeviceObject
return STATUS_NOT_IMPLEMENTED
HIDAPI NTSTATUS NTAPI HidP_UsageListDifference(IN PUSAGE PreviousUsageList, IN PUSAGE CurrentUsageList, OUT PUSAGE BreakUsageList, OUT PUSAGE MakeUsageList, IN ULONG UsageListLength)
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
#define STATUS_SHARING_VIOLATION
#define IRP_MN_QUERY_REMOVE_DEVICE
_Must_inspect_result_ typedef _Out_ PHIDP_CAPS Capabilities
#define MOUSE_BUTTON_4_DOWN
NTSTATUS NTAPI MouHid_Create(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
PDEVICE_OBJECT NTAPI IoAttachDeviceToDeviceStack(IN PDEVICE_OBJECT SourceDevice, IN PDEVICE_OBJECT TargetDevice)
_In_ PVOID _In_ ULONG Event
#define MOUSE_BUTTON_4_UP
#define IoCompleteRequest
PDEVICE_OBJECT NextDeviceObject
#define IOCTL_INTERNAL_MOUSE_DISABLE
HIDAPI NTSTATUS NTAPI HidP_GetCaps(IN PHIDP_PREPARSED_DATA PreparsedData, OUT PHIDP_CAPS Capabilities)
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
NTSTATUS NTAPI MouHid_Close(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR OutputBuffer
#define STATUS_DEVICE_NOT_CONNECTED
#define MOUSE_BUTTON_5_UP
NTSTATUS NTAPI MouHid_InternalDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define HID_USAGE_GENERIC_Z
#define IRP_MN_QUERY_STOP_DEVICE
#define HID_USAGE_PAGE_GENERIC
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR InputBuffer
#define IRP_MN_SURPRISE_REMOVAL
static const TBBUTTON Buttons[]
_Must_inspect_result_ _In_ ULONG Flags
#define IRP_MN_STOP_DEVICE
#define NT_SUCCESS(StatCode)
_In_ WDFCOLLECTION _In_ ULONG Index
#define IRP_MN_START_DEVICE
#define HID_USAGE_GENERIC_WHEEL
#define IRP_MJ_INTERNAL_DEVICE_CONTROL
#define MOUSE_LEFT_BUTTON_UP
#define IOCTL_INTERNAL_MOUSE_DISCONNECT
#define FILE_DEVICE_MOUSE
#define MOUSE_MIDDLE_BUTTON_UP
#define MOUSE_RIGHT_BUTTON_DOWN
VOID NTAPI IoFreeMdl(PMDL Mdl)
#define IOCTL_HID_GET_COLLECTION_INFORMATION
#define STATUS_UNSUCCESSFUL
#define ExAllocatePoolWithTag(hernya, size, tag)
#define IOCTL_INTERNAL_MOUSE_CONNECT
_Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PDEVICE_OBJECT * NextDeviceObject
VOID(STDAPICALLTYPE * PSERVICE_CALLBACK_ROUTINE)(IN PVOID NormalContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2, IN OUT PVOID SystemArgument3)
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
#define HID_USAGE_GENERIC_Y
_Must_inspect_result_ HIDAPI NTSTATUS NTAPI HidP_GetUsages(_In_ HIDP_REPORT_TYPE ReportType, _In_ USAGE UsagePage, _In_ USHORT LinkCollection, _Out_writes_to_(*UsageLength, *UsageLength) USAGE *UsageList, _Inout_ ULONG *UsageLength, _In_ PHIDP_PREPARSED_DATA PreparsedData, _Out_writes_bytes_(ReportLength) PCHAR Report, _In_ ULONG ReportLength)
_Must_inspect_result_ _In_ ULONG UsageListLength
#define IOCTL_MOUSE_QUERY_ATTRIBUTES
_In_ WDFREQUEST _In_ size_t _In_ size_t _In_ ULONG IoControlCode
#define MOUSE_HID_HARDWARE
NTSTATUS NTAPI MouHid_StartDeviceCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
#define IRP_MJ_SYSTEM_CONTROL
PMDL NTAPI IoAllocateMdl(IN PVOID VirtualAddress, IN ULONG Length, IN BOOLEAN SecondaryBuffer, IN BOOLEAN ChargeQuota, IN PIRP Irp)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
#define HIDP_LINK_COLLECTION_UNSPECIFIED
#define HID_USAGE_PAGE_BUTTON
NTSTATUS NTAPI DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegPath)
#define KeInitializeEvent(pEvt, foo, foo2)
VOID MouHid_GetButtonMove(IN PMOUHID_DEVICE_EXTENSION DeviceExtension, OUT PLONG LastX, OUT PLONG LastY)
NTSTATUS MouHid_InitiateRead(IN PMOUHID_DEVICE_EXTENSION DeviceExtension)
VOID NTAPI PoStartNextPowerIrp(IN PIRP Irp)
NTSTATUS NTAPI MouHid_ReadCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
#define HID_USAGE_GENERIC_X
NTSTATUS MouHid_SubmitRequest(PDEVICE_OBJECT DeviceObject, ULONG IoControlCode, ULONG InputBufferSize, PVOID InputBuffer, ULONG OutputBufferSize, PVOID OutputBuffer)
VOID MouHid_GetButtonFlags(IN PMOUHID_DEVICE_EXTENSION DeviceExtension, OUT PUSHORT ButtonFlags, OUT PUSHORT Flags)
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define IoSkipCurrentIrpStackLocation(Irp)
PIRP NTAPI IoBuildDeviceIoControlRequest(IN ULONG IoControlCode, IN PDEVICE_OBJECT DeviceObject, IN PVOID InputBuffer, IN ULONG InputBufferLength, IN PVOID OutputBuffer, IN ULONG OutputBufferLength, IN BOOLEAN InternalDeviceIoControl, IN PKEVENT Event, IN PIO_STATUS_BLOCK IoStatusBlock)
BOOLEAN NTAPI IoCancelIrp(IN PIRP Irp)
NTSTATUS NTAPI MouHid_Pnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
struct tagContext Context
VOID NTAPI IoFreeIrp(IN PIRP Irp)
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
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)
#define RtlZeroMemory(Destination, Length)
POWER_STATE NTAPI PoSetPowerState(IN PDEVICE_OBJECT DeviceObject, IN POWER_STATE_TYPE Type, IN POWER_STATE State)
#define MOUSE_RIGHT_BUTTON_UP
PIRP NTAPI IoAllocateIrp(IN CCHAR StackSize, IN BOOLEAN ChargeQuota)
#define HIDP_STATUS_SUCCESS
HIDP_VALUE_CAPS ValueCapsX
#define MOUSE_BUTTON_5_DOWN
#define IRP_MN_CANCEL_STOP_DEVICE
#define ExFreePoolWithTag(_P, _T)
NTSTATUS NTAPI MouHid_StartDevice(IN PDEVICE_OBJECT DeviceObject)
#define MOUSE_MOVE_ABSOLUTE
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
NTSTATUS NTAPI MouHid_AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject)
VOID NTAPI KeClearEvent(IN PKEVENT Event)
struct _MOUSE_ATTRIBUTES MOUSE_ATTRIBUTES
#define IOCTL_HID_FLUSH_QUEUE
HRESULT Create([out]ITransactionReceiver **ppReceiver)
NTSTATUS NTAPI MouHid_CreateCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
USHORT InputReportByteLength
NTSTATUS NTAPI MouHid_SystemControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define IRP_MJ_DEVICE_CONTROL
NTSTATUS NTAPI MouHid_FreeResources(IN PDEVICE_OBJECT DeviceObject)
_Must_inspect_result_ _In_ USAGE _In_ USHORT _In_ USAGE _Out_ PHIDP_VALUE_CAPS _Inout_ PUSHORT ValueCapsLength
_Must_inspect_result_ _In_ WDFDMAENABLER _In_ _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes