53 Irp->IoStatus.Information = 0;
70 Irp->IoStatus.Information = 0;
87 Irp->IoStatus.Information = 0;
105 Irp->IoStatus.Information = 0;
143 if (Head->
Flink != Head)
193 WARN_(
CLASS_NAME,
"IRP_MJ_DEVICE_CONTROL / unknown I/O control code 0x%lx\n",
200 Irp->IoStatus.Information = 0;
245 ULONG DefaultConnectMultiplePorts = 1;
246 ULONG DefaultDataQueueSize = 0x64;
247 PCWSTR DefaultDeviceBaseName =
L"PointerClass";
249 ParametersRegistryKey.
Length = 0;
252 if (!ParametersRegistryKey.
Buffer)
267 Parameters[0].DefaultData = &DefaultConnectMultiplePorts;
274 Parameters[1].DefaultData = &DefaultDataQueueSize;
286 ParametersRegistryKey.
Buffer,
362 DeviceIdW = &DeviceNameU.
Buffer[PrefixLength /
sizeof(
WCHAR)];
363 while (DeviceId < 9999)
394 DeviceExtension->Common.IsClassDO =
TRUE;
399 if (!DeviceExtension->ReadData)
406 if (!DeviceExtension->ReadData->PortData)
412 DeviceExtension->DeviceName = DeviceNameU.
Buffer;
414 Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
421 DeviceExtension->DeviceName,
479 SIZE_T InputCount = DataEnd - DataStart;
484 ASSERT(ClassDeviceExtension->Common.IsClassDO);
489 if (ClassDeviceExtension->ReadData->InputCount + InputCount > ClassDeviceExtension->DriverExtension->DataQueueSize)
495 ReadSize = ClassDeviceExtension->DriverExtension->DataQueueSize - ClassDeviceExtension->ReadData->InputCount;
498 ReadSize = InputCount;
505 &ClassDeviceExtension->ReadData->PortData[ClassDeviceExtension->ReadData->InputCount],
510 ClassDeviceExtension->ReadData->InputCount += ReadSize;
512 (*ConsumedCount) += (
ULONG)ReadSize;
536 TRACE_(
CLASS_NAME,
"Connecting PortDO %p to ClassDO %p\n", PortDO, ClassDO);
566 if (ClassDO->StackSize <= PortDO->StackSize)
571 ClassDO->StackSize = PortDO->StackSize + 1;
622 ClassDeviceExtension->DeviceName);
711 Fdo->Flags &= ~DO_DEVICE_INITIALIZING;
717 &GUID_DEVINTERFACE_MOUSE,
768 Irp->IoStatus.Information = 0;
773 DPRINT1(
"Cancelled IRP is not pending. Race condition?\n");
806 NumberOfEntries =
MIN(
818 if (
ReadData->InputCount > NumberOfEntries)
822 &
ReadData->PortData[NumberOfEntries],
826 ReadData->InputCount -= NumberOfEntries;
956 ASSERT(DeviceExtension->Common.IsClassDO);
1001 if (!KeyValueInformation)
1028 INFO_(
CLASS_NAME,
"HKLM\\HARDWARE\\DEVICEMAP\\%wZ is non-existent\n", &PortBaseName);
1068 if (KeyValueInformation !=
NULL)
1070 if (hDeviceMapKey != (
HANDLE)-1)
1072 if (hPortKey != (
HANDLE)-1)
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
static UNICODE_STRING PortName
#define FILE_DEVICE_SECURE_OPEN
NTSYSAPI BOOLEAN NTAPI RtlCreateUnicodeString(PUNICODE_STRING DestinationString, PCWSTR SourceString)
IN PUNICODE_STRING IN POBJECT_ATTRIBUTES ObjectAttributes
#define STATUS_NOT_SUPPORTED
_In_ HANDLE _In_ CONST PDXGKMDT_OPM_GET_INFO_PARAMETERS Parameters
_Check_return_ _In_ DXGK_EVENT_TYPE _In_ ULONG Event
#define NT_SUCCESS(StatCode)
#define RTL_CONSTANT_STRING(s)
static void cleanup(void)
_ACRTIMP size_t __cdecl wcslen(const wchar_t *)
DRIVER_INITIALIZE DriverEntry
_In_ PIO_STACK_LOCATION IrpSp
#define RemoveEntryList(Entry)
#define ExAllocatePoolWithTag(hernya, size, tag)
#define KeWaitForSingleObject(pEvt, foo, a, b, c)
#define KeInitializeEvent(pEvt, foo, foo2)
#define KeReleaseSpinLock(sl, irql)
NTSTATUS RtlAppendUnicodeToString(IN PUNICODE_STRING Str1, IN PWSTR Str2)
#define KeAcquireSpinLock(sl, irql)
#define InitializeListHead(ListHead)
#define KeInitializeSpinLock(sl)
#define RTL_DUPLICATE_UNICODE_STRING_NULL_TERMINATE
#define IOCTL_HID_GET_DRIVER_CONFIG
#define IOCTL_HID_GET_MANUFACTURER_STRING
#define IOCTL_HID_GET_COLLECTION_DESCRIPTOR
#define IOCTL_HID_GET_PRODUCT_STRING
#define IOCTL_HID_SET_POLL_FREQUENCY_MSEC
#define IOCTL_GET_NUM_DEVICE_INPUT_BUFFERS
#define IOCTL_HID_GET_INDEXED_STRING
#define IOCTL_SET_NUM_DEVICE_INPUT_BUFFERS
#define IOCTL_HID_GET_SERIALNUMBER_STRING
#define IOCTL_HID_GET_POLL_FREQUENCY_MSEC
#define IOCTL_HID_GET_MS_GENRE_DESCRIPTOR
#define IOCTL_HID_SET_FEATURE
#define IOCTL_HID_FLUSH_QUEUE
#define IOCTL_HID_GET_HARDWARE_ID
#define IOCTL_GET_PHYSICAL_DESCRIPTOR
#define IOCTL_HID_SET_DRIVER_CONFIG
#define IOCTL_HID_GET_FEATURE
#define IOCTL_HID_GET_COLLECTION_INFORMATION
return ZwOpenKey(Handle, KEY_READ, &Attributes)
_In_ UCXUSBDEVICE _In_ PDEVICE_OBJECT Pdo
struct _PORT_DEVICE_EXTENSION * PPORT_DEVICE_EXTENSION
NTSTATUS DuplicateUnicodeString(IN ULONG Flags, IN PCUNICODE_STRING SourceString, OUT PUNICODE_STRING DestinationString)
DRIVER_DISPATCH ForwardIrpAndForget
#define EXCEPTION_EXECUTE_HANDLER
PLIST_ENTRY NTAPI ExInterlockedInsertTailList(IN OUT PLIST_ENTRY ListHead, IN OUT PLIST_ENTRY ListEntry, IN OUT PKSPIN_LOCK Lock)
IoSetCancelRoutine(Irp, CancelRoutine)
struct _CLASS_DRIVER_EXTENSION * PCLASS_DRIVER_EXTENSION
#define IOCTL_INTERNAL_MOUSE_DISCONNECT
#define IOCTL_INTERNAL_MOUSE_CONNECT
_In_ PIRP _In_ PIO_COMPLETION_ROUTINE _In_ PVOID Context
#define ExFreePoolWithTag(_P, _T)
#define _swprintf(buf, format,...)
static PVOID ExAllocatePoolZero(ULONG PoolType, SIZE_T NumberOfBytes, ULONG Tag)
#define InitializeObjectAttributes(p, n, a, r, s)
static DRIVER_DISPATCH ClassDeviceControl
static DRIVER_DISPATCH ClassRead
static VOID DestroyPortDriver(IN PDEVICE_OBJECT PortDO)
static DRIVER_ADD_DEVICE ClassAddDevice
static DRIVER_CANCEL ClassCancelRoutine
static VOID NTAPI SearchForLegacyDrivers(IN PDRIVER_OBJECT DriverObject, IN PVOID Context, IN ULONG Count)
static NTSTATUS ReadRegistryEntries(IN PUNICODE_STRING RegistryPath, IN PCLASS_DRIVER_EXTENSION DriverExtension)
static BOOLEAN NTAPI ClassCallback(IN PDEVICE_OBJECT ClassDeviceObject, IN OUT PMOUSE_INPUT_DATA DataStart, IN PMOUSE_INPUT_DATA DataEnd, IN OUT PULONG ConsumedCount)
static DRIVER_DISPATCH ClassClose
static NTSTATUS ConnectPortDriver(IN PDEVICE_OBJECT PortDO, IN PDEVICE_OBJECT ClassDO)
static NTSTATUS NTAPI ClassPnp(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
static DRIVER_DISPATCH ClassCleanup
static NTSTATUS HandleReadIrp(IN PDEVICE_OBJECT DeviceObject, IN PREAD_DATA ReadData, IN PIRP Irp OPTIONAL)
static NTSTATUS CreateClassDeviceObject(IN PDRIVER_OBJECT DriverObject, OUT PDEVICE_OBJECT *ClassDO OPTIONAL)
static DRIVER_DISPATCH ClassPower
static DRIVER_DISPATCH ClassCreate
static DRIVER_STARTIO ClassStartIo
static NTSTATUS FillEntries(IN PDEVICE_OBJECT ClassDeviceObject, IN PMOUSE_INPUT_DATA Source, OUT PMOUSE_INPUT_DATA Destination, IN SIZE_T NumberOfEntries)
static DRIVER_UNLOAD DriverUnload
__in UCHAR __in POWER_STATE __in_opt PVOID __in PIO_STATUS_BLOCK IoStatus
_In_ UINT _In_ UINT _In_ PNDIS_PACKET Source
NTSYSAPI NTSTATUS NTAPI ZwOpenFile(_Out_ PHANDLE FileHandle, _In_ ACCESS_MASK DesiredAccess, _In_ POBJECT_ATTRIBUTES ObjectAttributes, _Out_ PIO_STATUS_BLOCK IoStatusBlock, _In_ ULONG ShareAccess, _In_ ULONG OpenOptions)
_In_ PUNICODE_STRING _Inout_ PUNICODE_STRING Destination
DRIVER_DISPATCH(nfs41_FsdDispatch)
NTSYSAPI VOID NTAPI RtlCopyUnicodeString(PUNICODE_STRING DestinationString, PUNICODE_STRING SourceString)
struct _KEY_VALUE_BASIC_INFORMATION KEY_VALUE_BASIC_INFORMATION
@ KeyValueBasicInformation
NTSYSAPI NTSTATUS NTAPI RtlAppendUnicodeStringToString(PUNICODE_STRING Destination, PUNICODE_STRING Source)
#define FILE_READ_ATTRIBUTES
#define RTL_REGISTRY_ABSOLUTE
#define RTL_REGISTRY_DEVICEMAP
#define RTL_QUERY_REGISTRY_DIRECT
#define RTL_REGISTRY_OPTIONAL
struct _MOUSE_INPUT_DATA MOUSE_INPUT_DATA
#define IOCTL_MOUSE_QUERY_ATTRIBUTES
#define IoSkipCurrentIrpStackLocation(Irp)
#define IoCopyCurrentIrpStackLocationToNext(Irp)
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)
NTSTATUS NTAPI IoAttachDeviceToDeviceStackSafe(IN PDEVICE_OBJECT SourceDevice, IN PDEVICE_OBJECT TargetDevice, IN OUT PDEVICE_OBJECT *AttachedToDeviceObject)
VOID NTAPI IoDetachDevice(IN PDEVICE_OBJECT TargetDevice)
VOID NTAPI IoSetStartIoAttributes(IN PDEVICE_OBJECT DeviceObject, IN BOOLEAN DeferredStartIo, IN BOOLEAN NonCancelable)
VOID NTAPI IoDeleteDevice(IN PDEVICE_OBJECT DeviceObject)
NTSTATUS NTAPI IoGetDeviceObjectPointer(IN PUNICODE_STRING ObjectName, IN ACCESS_MASK DesiredAccess, OUT PFILE_OBJECT *FileObject, OUT PDEVICE_OBJECT *DeviceObject)
NTSTATUS NTAPI IoRegisterDeviceInterface(IN PDEVICE_OBJECT PhysicalDeviceObject, IN CONST GUID *InterfaceClassGuid, IN PUNICODE_STRING ReferenceString OPTIONAL, OUT PUNICODE_STRING SymbolicLinkName)
NTSTATUS NTAPI IoSetDeviceInterfaceState(IN PUNICODE_STRING SymbolicLinkName, IN BOOLEAN Enable)
PVOID NTAPI IoGetDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress)
VOID NTAPI IoRegisterDriverReinitialization(IN PDRIVER_OBJECT DriverObject, IN PDRIVER_REINITIALIZE ReinitRoutine, IN PVOID Context)
NTSTATUS NTAPI IoAllocateDriverObjectExtension(IN PDRIVER_OBJECT DriverObject, IN PVOID ClientIdentificationAddress, IN ULONG DriverObjectExtensionSize, OUT PVOID *DriverObjectExtension)
#define IoCompleteRequest
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 IoForwardIrpSynchronously(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
VOID NTAPI IoReleaseCancelSpinLock(IN KIRQL Irql)
VOID NTAPI IoAcquireCancelSpinLock(OUT PKIRQL Irql)
VOID NTAPI PoStartNextPowerIrp(IN PIRP Irp)
#define STATUS_TOO_MANY_NAMES
PPCI_DRIVER_EXTENSION DriverExtension
#define IOCTL_GET_SYS_BUTTON_CAPS
#define IOCTL_GET_SYS_BUTTON_EVENT
#define FILE_DEVICE_MOUSE
#define OBJ_KERNEL_HANDLE
#define OBJ_CASE_INSENSITIVE
#define _SEH2_GetExceptionCode()
#define _SEH2_EXCEPT(...)
#define IRP_MJ_DEVICE_CONTROL
#define STATUS_BUFFER_TOO_SMALL
PULONG MinorVersion OPTIONAL
PDEVICE_OBJECT ClassDeviceObject
struct _IO_STACK_LOCATION::@5136::@5140 Read
struct _IO_STACK_LOCATION::@1823::@1824 DeviceIoControl
struct _LIST_ENTRY * Flink
PDEVICE_OBJECT DeviceObject
UNICODE_STRING InterfaceName
PORT_DEVICE_STATE PnpState
COMMON_DEVICE_EXTENSION Common
PDEVICE_OBJECT LowerDevice
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define RtlMoveMemory(Destination, Source, Length)
#define CONTAINING_RECORD(address, type, field)
_In_ PGUID _In_ ULONG _Out_ PULONG ResultLength
#define STATUS_UNSUCCESSFUL
#define STATUS_OBJECT_NAME_COLLISION
#define STATUS_INSUFFICIENT_RESOURCES
#define STATUS_OBJECT_NAME_NOT_FOUND
_In_ WDFCOLLECTION _In_ ULONG Index
_In_ PDEVICE_OBJECT DeviceObject
_In_ WDFREQUEST _In_ WDFFILEOBJECT FileObject
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_DEVICE_PROPERTY_DATA _In_ DEVPROPTYPE _In_ ULONG Size
_In_ UCHAR _In_ UCHAR MinorFunction
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
_Must_inspect_result_ _In_ WDFDEVICE Fdo
NTSYSAPI NTSTATUS WINAPI RtlDeleteRegistryValue(ULONG, PCWSTR, PCWSTR)
NTSYSAPI NTSTATUS WINAPI RtlWriteRegistryValue(ULONG, PCWSTR, PCWSTR, ULONG, PVOID, ULONG)
NTSYSAPI NTSTATUS WINAPI RtlQueryRegistryValues(ULONG, PCWSTR, PRTL_QUERY_REGISTRY_TABLE, PVOID, PVOID)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
#define IRP_MN_START_DEVICE
#define IRP_MN_REMOVE_DEVICE
#define IO_MOUSE_INCREMENT
#define IRP_MJ_INTERNAL_DEVICE_CONTROL
#define IRP_MN_STOP_DEVICE
#define IRP_MN_QUERY_POWER
_Requires_lock_held_ Interrupt _Releases_lock_ Interrupt _In_ _IRQL_restores_ KIRQL OldIrql
#define MmGetSystemAddressForMdlSafe(_Mdl, _Priority)
#define ObDereferenceObject
#define ObReferenceObject