2 * PROJECT: ReactOS InPort (Bus) Mouse Driver
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
5 * COPYRIGHT: Copyright 2020 Dmitry Borisov (di.sean@protonmail.com)
8 /* INCLUDES *******************************************************************/
15 /* GLOBALS ********************************************************************/
18 #pragma alloc_text(PAGE, InPortWmi)
19 #pragma alloc_text(PAGE, InPortWmiRegistration)
20 #pragma alloc_text(PAGE, InPortWmiDeRegistration)
21 #pragma alloc_text(PAGE, InPortQueryWmiRegInfo)
22 #pragma alloc_text(PAGE, InPortQueryWmiDataBlock)
25 GUID GuidWmiPortData
= POINTER_PORT_WMI_STD_DATA_GUID
;
27 WMIGUIDREGINFO InPortWmiGuidList
[] =
29 {&GuidWmiPortData
, 1, 0}
32 /* FUNCTIONS ******************************************************************/
36 InPortQueryWmiRegInfo(
37 _Inout_ PDEVICE_OBJECT DeviceObject
,
38 _Inout_ PULONG RegFlags
,
39 _Inout_ PUNICODE_STRING InstanceName
,
40 _Out_opt_ PUNICODE_STRING
*RegistryPath
,
41 _Inout_ PUNICODE_STRING MofResourceName
,
42 _Out_opt_ PDEVICE_OBJECT
*Pdo
)
44 PINPORT_DEVICE_EXTENSION DeviceExtension
= DeviceObject
->DeviceExtension
;
46 UNREFERENCED_PARAMETER(InstanceName
);
47 UNREFERENCED_PARAMETER(MofResourceName
);
51 DPRINT("%s()\n", __FUNCTION__
);
53 *RegFlags
= WMIREG_FLAG_INSTANCE_PDO
;
54 *RegistryPath
= &DriverRegistryPath
;
55 *Pdo
= DeviceExtension
->Pdo
;
57 return STATUS_SUCCESS
;
62 InPortQueryWmiDataBlock(
63 _Inout_ PDEVICE_OBJECT DeviceObject
,
66 _In_ ULONG InstanceIndex
,
67 _In_ ULONG InstanceCount
,
68 _Out_opt_ PULONG InstanceLengthArray
,
69 _In_ ULONG BufferAvail
,
70 _Out_opt_ PUCHAR Buffer
)
73 PPOINTER_PORT_WMI_STD_DATA InPortData
;
74 PINPORT_DEVICE_EXTENSION DeviceExtension
= DeviceObject
->DeviceExtension
;
78 DPRINT("%s()\n", __FUNCTION__
);
80 if (GuidIndex
> RTL_NUMBER_OF(InPortWmiGuidList
))
82 Status
= STATUS_WMI_GUID_NOT_FOUND
;
86 /* Only register 1 instance per GUID */
87 if (InstanceIndex
!= 0 || InstanceCount
!= 1)
89 Status
= STATUS_WMI_INSTANCE_NOT_FOUND
;
93 if (!InstanceLengthArray
|| BufferAvail
< sizeof(POINTER_PORT_WMI_STD_DATA
))
95 Status
= STATUS_BUFFER_TOO_SMALL
;
99 InPortData
= (PPOINTER_PORT_WMI_STD_DATA
)Buffer
;
101 /* Bus mouse connector isn't defined in the DDK, so set type to something generic */
102 InPortData
->ConnectorType
= POINTER_PORT_WMI_STD_I8042
;
104 InPortData
->DataQueueSize
= 1;
105 /* Not supported by device */
106 InPortData
->ErrorCount
= 0;
108 InPortData
->Buttons
= DeviceExtension
->MouseAttributes
.NumberOfButtons
;
109 InPortData
->HardwareType
= POINTER_PORT_WMI_STD_MOUSE
;
110 *InstanceLengthArray
= sizeof(POINTER_PORT_WMI_STD_DATA
);
112 Status
= STATUS_SUCCESS
;
115 return WmiCompleteRequest(DeviceObject
,
118 sizeof(POINTER_PORT_WMI_STD_DATA
),
124 InPortWmiRegistration(
125 _Inout_ PINPORT_DEVICE_EXTENSION DeviceExtension
)
129 DeviceExtension
->WmiLibInfo
.GuidCount
= RTL_NUMBER_OF(InPortWmiGuidList
);
130 DeviceExtension
->WmiLibInfo
.GuidList
= InPortWmiGuidList
;
132 DeviceExtension
->WmiLibInfo
.QueryWmiRegInfo
= InPortQueryWmiRegInfo
;
133 DeviceExtension
->WmiLibInfo
.QueryWmiDataBlock
= InPortQueryWmiDataBlock
;
134 DeviceExtension
->WmiLibInfo
.SetWmiDataBlock
= NULL
;
135 DeviceExtension
->WmiLibInfo
.SetWmiDataItem
= NULL
;
136 DeviceExtension
->WmiLibInfo
.ExecuteWmiMethod
= NULL
;
137 DeviceExtension
->WmiLibInfo
.WmiFunctionControl
= NULL
;
139 return IoWMIRegistrationControl(DeviceExtension
->Self
,
140 WMIREG_ACTION_REGISTER
);
145 InPortWmiDeRegistration(
146 _Inout_ PINPORT_DEVICE_EXTENSION DeviceExtension
)
150 return IoWMIRegistrationControl(DeviceExtension
->Self
,
151 WMIREG_ACTION_DEREGISTER
);
157 _In_ PDEVICE_OBJECT DeviceObject
,
161 SYSCTL_IRP_DISPOSITION Disposition
;
162 PINPORT_DEVICE_EXTENSION DeviceExtension
= DeviceObject
->DeviceExtension
;
166 DPRINT("%s(%p, %p) %X\n", __FUNCTION__
, DeviceObject
, Irp
,
167 IoGetCurrentIrpStackLocation(Irp
)->MinorFunction
);
169 Status
= IoAcquireRemoveLock(&DeviceExtension
->RemoveLock
, Irp
);
170 if (!NT_SUCCESS(Status
))
172 Irp
->IoStatus
.Information
= 0;
173 Irp
->IoStatus
.Status
= Status
;
174 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
179 Status
= WmiSystemControl(&DeviceExtension
->WmiLibInfo
,
188 case IrpNotCompleted
:
189 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
194 IoSkipCurrentIrpStackLocation(Irp
);
195 Status
= IoCallDriver(DeviceExtension
->Ldo
, Irp
);
199 IoReleaseRemoveLock(&DeviceExtension
->RemoveLock
, Irp
);