19 ULONG InputDataConsumed;
21 if (!DeviceExtension->ClassService)
25 ASSERT(DeviceExtension->ClassService);
26 ASSERT(DeviceExtension->ClassDeviceObject);
32 (*(
PSERVICE_CALLBACK_ROUTINE)DeviceExtension->ClassService)(DeviceExtension->ClassDeviceObject, InputData, InputData + 1, &InputDataConsumed);
55 DPRINT(
"[KBDHID] ScanCode Index %lu ScanCode %x\n",
Index, NewScanCodes[
Index] & 0xFF);
70 if (NewScanCodes[
Index] & 0x80)
115 DPRINT1(
"[KBDHID] ReadCompletion terminating read Status %x\n",
Irp->IoStatus.Status);
132 DPRINT(
"[KBDHID] ReadCompletion %02x %02x %02x %02x %02x %02x %02x %02x %02x\n", DeviceExtension->
Report[0], DeviceExtension->
Report[1], DeviceExtension->
Report[2],
199 DeviceExtension->Irp->MdlAddress = DeviceExtension->ReportMDL;
205 IoStack->
Parameters.Read.Length = DeviceExtension->ReportLength;
209 IoStack->
FileObject = DeviceExtension->FileObject;
215 DeviceExtension->ReadReportActive =
TRUE;
247 DPRINT(
"[KBDHID]: IRP_MJ_CREATE\n");
296 DPRINT(
"[KBDHID] KbdHid_InitiateRead: status %x\n",
Status);
363 DPRINT(
"[KBDHID] InternalDeviceControl %x\n", IoStack->
Parameters.DeviceIoControl.IoControlCode);
368 switch (IoStack->
Parameters.DeviceIoControl.IoControlCode)
375 DPRINT1(
"[KBDHID] IOCTL_KEYBOARD_QUERY_ATTRIBUTES Buffer too small\n");
495 Irp->AssociatedIrp.SystemBuffer,
500 Irp->IoStatus.Information = 0;
515 Irp->AssociatedIrp.SystemBuffer,
520 Irp->IoStatus.Information = 0;
526 DPRINT1(
"IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION not implemented\n");
533 DPRINT1(
"[KBDHID] Unknown DeviceControl %x\n", IoStack->
Parameters.DeviceIoControl.IoControlCode);
589 ULONG InputBufferSize,
591 ULONG OutputBufferSize,
661 DPRINT1(
"[KBDHID] failed to obtain collection information with %x\n",
Status);
684 DPRINT1(
"[KBDHID] failed to obtain collection information with %x\n",
Status);
808 if (DeviceExtension->
Report)
913 Irp->IoStatus.Status = 0;
NTSTATUS KbdHid_InitiateRead(IN PKBDHID_DEVICE_EXTENSION DeviceExtension)
#define DO_DEVICE_INITIALIZING
KEYBOARD_TYPEMATIC_PARAMETERS KeyRepeatMaximum
#define IRP_MN_CANCEL_REMOVE_DEVICE
return STATUS_NOT_SUPPORTED
PUSAGE_AND_PAGE MakeUsageList
#define STATUS_PRIVILEGE_NOT_HELD
#define IOCTL_KEYBOARD_QUERY_TYPEMATIC
#define KeRaiseIrql(irql, oldIrql)
_In_ __drv_aliasesMem PSTRING Prefix
#define IOCTL_KEYBOARD_QUERY_INDICATOR_TRANSLATION
#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
_In_ ULONG _In_ ULONG _In_ ULONG Length
PUSAGE_AND_PAGE BreakUsageList
PUSAGE_AND_PAGE PreviousUsageList
#define IRP_MJ_FLUSH_BUFFERS
VOID NTAPI IoReuseIrp(IN OUT PIRP Irp, IN NTSTATUS Status)
#define STATUS_MORE_PROCESSING_REQUIRED
IN BOOLEAN OUT PSTR Buffer
HIDAPI ULONG NTAPI HidP_MaxUsageListLength(IN HIDP_REPORT_TYPE ReportType, IN USAGE UsagePage OPTIONAL, IN PHIDP_PREPARSED_DATA PreparsedData)
#define STATUS_INVALID_PARAMETER
NTSTATUS NTAPI KbdHid_Create(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
PDEVICE_OBJECT ClassDeviceObject
NTSTATUS NTAPI KbdHid_FreeResources(IN PDEVICE_OBJECT DeviceObject)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG _In_opt_ PVOID Data
VOID NTAPI MmBuildMdlForNonPagedPool(IN PMDL Mdl)
_In_ ULONG _In_ ULONG State
VOID NTAPI IoDetachDevice(IN PDEVICE_OBJECT TargetDevice)
KEYBOARD_TYPEMATIC_PARAMETERS KeyboardTypematic
PDEVICE_OBJECT PhysicalDeviceObject
PDEVICE_OBJECT NextDeviceObject
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)
struct _KEYBOARD_TYPEMATIC_PARAMETERS KEYBOARD_TYPEMATIC_PARAMETERS
_In_ WDFREQUEST _In_ NTSTATUS _In_ ULONG_PTR Information
#define IOCTL_HID_GET_COLLECTION_DESCRIPTOR
#define RtlMoveMemory(Destination, Source, Length)
#define STATUS_BUFFER_TOO_SMALL
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
struct _KEYBOARD_INDICATOR_PARAMETERS KEYBOARD_INDICATOR_PARAMETERS
FORCEINLINE VOID IoCopyCurrentIrpStackLocationToNext(_Inout_ PIRP Irp)
PUSAGE_AND_PAGE CurrentUsageList
_In_ PDEVICE_OBJECT DeviceObject
return STATUS_NOT_IMPLEMENTED
NTSTATUS NTAPI KbdHid_ReadCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
#define KEYBOARD_TYPEMATIC_RATE_MINIMUM
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 IOCTL_KEYBOARD_SET_TYPEMATIC
#define KEYBOARD_TYPEMATIC_DELAY_MAXIMUM
PDEVICE_OBJECT NTAPI IoAttachDeviceToDeviceStack(IN PDEVICE_OBJECT SourceDevice, IN PDEVICE_OBJECT TargetDevice)
NTSTATUS KbdHid_SubmitRequest(PDEVICE_OBJECT DeviceObject, ULONG IoControlCode, ULONG InputBufferSize, PVOID InputBuffer, ULONG OutputBufferSize, PVOID OutputBuffer)
_In_ PVOID _In_ ULONG Event
#define HID_USAGE_PAGE_KEYBOARD
KEYBOARD_INDICATOR_PARAMETERS KeyboardIndicator
#define KEYBOARD_TYPE_UNKNOWN
#define MICROSOFT_KBD_FUNC
KEVENT ReadCompletionEvent
#define MICROSOFT_KBD_101_TYPE
#define IoCompleteRequest
#define IOCTL_INTERNAL_KEYBOARD_DISABLE
BOOLEAN NTAPI KbdHid_InsertScanCodes(IN PVOID Context, IN PCHAR NewScanCodes, IN ULONG Length)
HIDAPI NTSTATUS NTAPI HidP_GetCaps(IN PHIDP_PREPARSED_DATA PreparsedData, OUT PHIDP_CAPS Capabilities)
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR OutputBuffer
KEYBOARD_TYPEMATIC_PARAMETERS KeyRepeatMinimum
#define STATUS_DEVICE_NOT_CONNECTED
VOID NTAPI KbdHid_Unload(IN PDRIVER_OBJECT DriverObject)
#define IRP_MN_QUERY_STOP_DEVICE
NTSTATUS NTAPI DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegPath)
#define IOCTL_KEYBOARD_QUERY_INDICATORS
#define IOCTL_INTERNAL_KEYBOARD_DISCONNECT
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR InputBuffer
#define IRP_MN_SURPRISE_REMOVAL
static const TBBUTTON Buttons[]
#define IRP_MN_STOP_DEVICE
NTSTATUS NTAPI KbdHid_InternalDeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define NT_SUCCESS(StatCode)
_In_ WDFCOLLECTION _In_ ULONG Index
struct _HIDP_PREPARSED_DATA * PHIDP_PREPARSED_DATA
USHORT NumberOfIndicators
NTSTATUS NTAPI KbdHid_Pnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define IRP_MN_START_DEVICE
NTSTATUS NTAPI KbdHid_Flush(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define IRP_MJ_INTERNAL_DEVICE_CONTROL
_Must_inspect_result_ HIDAPI NTSTATUS NTAPI HidP_TranslateUsageAndPagesToI8042ScanCodes(_In_reads_(UsageListLength) PUSAGE_AND_PAGE ChangedUsageList, _In_ ULONG UsageListLength, _In_ HIDP_KEYBOARD_DIRECTION KeyAction, _Inout_ PHIDP_KEYBOARD_MODIFIER_STATE ModifierState, _In_ PHIDP_INSERT_SCANCODES InsertCodesProcedure, _In_opt_ PVOID InsertCodesContext)
VOID NTAPI IoFreeMdl(PMDL Mdl)
#define IOCTL_INTERNAL_KEYBOARD_CONNECT
#define IOCTL_HID_GET_COLLECTION_INFORMATION
#define ExAllocatePoolWithTag(hernya, size, tag)
_Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PDEVICE_OBJECT _Inout_opt_ PDEVICE_OBJECT * NextDeviceObject
NTSTATUS NTAPI KbdHid_StartDevice(IN PDEVICE_OBJECT DeviceObject)
VOID(STDAPICALLTYPE * PSERVICE_CALLBACK_ROUTINE)(IN PVOID NormalContext, IN PVOID SystemArgument1, IN PVOID SystemArgument2, IN OUT PVOID SystemArgument3)
NTSTATUS NTAPI KbdHid_DeviceControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
_In_ WDFREQUEST _In_ size_t _In_ size_t _In_ ULONG IoControlCode
KEYBOARD_ID KeyboardIdentifier
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
NTSTATUS NTAPI KbdHid_CreateCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
#define IRP_MJ_SYSTEM_CONTROL
NTSTATUS NTAPI KbdHid_SystemControl(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define KEYBOARD_TYPEMATIC_RATE_DEFAULT
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 KeInitializeEvent(pEvt, foo, foo2)
VOID NTAPI PoStartNextPowerIrp(IN PIRP Irp)
USHORT NumberOfFunctionKeys
NTSTATUS NTAPI KbdHid_AddDevice(IN PDRIVER_OBJECT DriverObject, IN PDEVICE_OBJECT PhysicalDeviceObject)
NTSTATUS NTAPI KbdHid_StartDeviceCompletion(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context)
ULONG InputDataQueueLength
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define IoSkipCurrentIrpStackLocation(Irp)
NTSTATUS NTAPI KbdHid_Close(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
#define IOCTL_INTERNAL_KEYBOARD_ENABLE
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)
struct tagContext Context
VOID NTAPI IoFreeIrp(IN PIRP Irp)
PHIDP_PREPARSED_DATA PreparsedData
#define IOCTL_KEYBOARD_QUERY_ATTRIBUTES
__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 RtlCopyMemory(Destination, Source, Length)
NTSTATUS NTAPI KbdHid_Power(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
PIRP NTAPI IoAllocateIrp(IN CCHAR StackSize, IN BOOLEAN ChargeQuota)
#define HIDP_STATUS_SUCCESS
KEYBOARD_ATTRIBUTES Attributes
#define IRP_MN_CANCEL_STOP_DEVICE
#define ExFreePoolWithTag(_P, _T)
HIDAPI NTSTATUS NTAPI HidP_GetUsagesEx(IN HIDP_REPORT_TYPE ReportType, IN USHORT LinkCollection, OUT PUSAGE_AND_PAGE ButtonList, IN OUT ULONG *UsageLength, IN PHIDP_PREPARSED_DATA PreparsedData, IN PCHAR Report, IN ULONG ReportLength)
struct _NAMED_PIPE_CREATE_PARAMETERS * Parameters
#define IOCTL_KEYBOARD_SET_INDICATORS
VOID NTAPI KeClearEvent(IN PKEVENT Event)
#define KEYBOARD_TYPEMATIC_DELAY_MINIMUM
struct _MOUSE_ATTRIBUTES MOUSE_ATTRIBUTES
#define IOCTL_HID_FLUSH_QUEUE
HRESULT Create([out]ITransactionReceiver **ppReceiver)
#define FILE_DEVICE_KEYBOARD
USHORT InputReportByteLength
HIDAPI NTSTATUS NTAPI HidP_UsageAndPageListDifference(IN PUSAGE_AND_PAGE PreviousUsageList, IN PUSAGE_AND_PAGE CurrentUsageList, OUT PUSAGE_AND_PAGE BreakUsageList, OUT PUSAGE_AND_PAGE MakeUsageList, IN ULONG UsageListLength)
HIDP_KEYBOARD_MODIFIER_STATE ModifierState
VOID KbdHid_DispatchInputData(IN PKBDHID_DEVICE_EXTENSION DeviceExtension, IN PKEYBOARD_INPUT_DATA InputData)
#define IRP_MJ_DEVICE_CONTROL
_Must_inspect_result_ _In_ WDFDMAENABLER _In_ _In_opt_ PWDF_OBJECT_ATTRIBUTES Attributes