ReactOS 0.4.15-dev-7924-g5949c20
wmi.c
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS InPort (Bus) Mouse Driver
3 * LICENSE: GPL-2.0-or-later (https://spdx.org/licenses/GPL-2.0-or-later)
4 * PURPOSE: WMI support
5 * COPYRIGHT: Copyright 2020 Dmitry Borisov (di.sean@protonmail.com)
6 */
7
8/* INCLUDES *******************************************************************/
9
10#include "inport.h"
11
12#define NDEBUG
13#include <debug.h>
14
15/* GLOBALS ********************************************************************/
16
18
20{
21 {&GuidWmiPortData, 1, 0}
22};
23
24/* FUNCTIONS ******************************************************************/
25CODE_SEG("PAGE")
35{
36 PINPORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
37
40
41 PAGED_CODE();
42
43 DPRINT("%s()\n", __FUNCTION__);
44
47 *Pdo = DeviceExtension->Pdo;
48
49 return STATUS_SUCCESS;
50}
51
52CODE_SEG("PAGE")
61 _Out_opt_ PULONG InstanceLengthArray,
64{
67 PINPORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
68
69 PAGED_CODE();
70
71 DPRINT("%s()\n", __FUNCTION__);
72
74 {
76 goto Complete;
77 }
78
79 /* Only register 1 instance per GUID */
80 if (InstanceIndex != 0 || InstanceCount != 1)
81 {
83 goto Complete;
84 }
85
86 if (!InstanceLengthArray || BufferAvail < sizeof(POINTER_PORT_WMI_STD_DATA))
87 {
89 goto Complete;
90 }
91
93
94 /* Bus mouse connector isn't defined in the DDK, so set type to something generic */
96 /* 1 packet */
97 InPortData->DataQueueSize = 1;
98 /* Not supported by device */
99 InPortData->ErrorCount = 0;
100
101 InPortData->Buttons = DeviceExtension->MouseAttributes.NumberOfButtons;
103 *InstanceLengthArray = sizeof(POINTER_PORT_WMI_STD_DATA);
104
106
109 Irp,
110 Status,
113}
114
115CODE_SEG("PAGE")
117NTAPI
119 _Inout_ PINPORT_DEVICE_EXTENSION DeviceExtension)
120{
121 PAGED_CODE();
122
123 DeviceExtension->WmiLibInfo.GuidCount = RTL_NUMBER_OF(InPortWmiGuidList);
124 DeviceExtension->WmiLibInfo.GuidList = InPortWmiGuidList;
125
126 DeviceExtension->WmiLibInfo.QueryWmiRegInfo = InPortQueryWmiRegInfo;
127 DeviceExtension->WmiLibInfo.QueryWmiDataBlock = InPortQueryWmiDataBlock;
128 DeviceExtension->WmiLibInfo.SetWmiDataBlock = NULL;
129 DeviceExtension->WmiLibInfo.SetWmiDataItem = NULL;
130 DeviceExtension->WmiLibInfo.ExecuteWmiMethod = NULL;
131 DeviceExtension->WmiLibInfo.WmiFunctionControl = NULL;
132
133 return IoWMIRegistrationControl(DeviceExtension->Self,
135}
136
137CODE_SEG("PAGE")
139NTAPI
141 _Inout_ PINPORT_DEVICE_EXTENSION DeviceExtension)
142{
143 PAGED_CODE();
144
145 return IoWMIRegistrationControl(DeviceExtension->Self,
147}
148
149CODE_SEG("PAGE")
151NTAPI
155{
158 PINPORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
159
160 PAGED_CODE();
161
162 DPRINT("%s(%p, %p) %X\n", __FUNCTION__, DeviceObject, Irp,
164
165 Status = IoAcquireRemoveLock(&DeviceExtension->RemoveLock, Irp);
166 if (!NT_SUCCESS(Status))
167 {
168 Irp->IoStatus.Information = 0;
169 Irp->IoStatus.Status = Status;
171
172 return Status;
173 }
174
175 Status = WmiSystemControl(&DeviceExtension->WmiLibInfo,
177 Irp,
178 &Disposition);
179 switch (Disposition)
180 {
181 case IrpProcessed:
182 break;
183
184 case IrpNotCompleted:
186 break;
187
188 case IrpForward:
189 case IrpNotWmi:
191 Status = IoCallDriver(DeviceExtension->Ldo, Irp);
192 break;
193 }
194
195 IoReleaseRemoveLock(&DeviceExtension->RemoveLock, Irp);
196
197 return Status;
198}
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
#define PAGED_CODE()
#define CODE_SEG(...)
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
LONG NTSTATUS
Definition: precomp.h:26
Definition: bufpool.h:45
_In_ LPGUID _In_ ULONG InstanceIndex
Definition: classpnp.h:1251
_Out_ ULONG * RegFlags
Definition: classpnp.h:403
_In_ PIRP _In_ ULONG GuidIndex
Definition: classpnp.h:419
_In_ PIRP _In_ ULONG _In_ ULONG BufferAvail
Definition: classpnp.h:420
_In_ PIRP Irp
Definition: csq.h:116
#define NULL
Definition: types.h:112
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
#define __FUNCTION__
Definition: types.h:116
WMIGUIDREGINFO InPortWmiGuidList[]
Definition: wmi.c:19
NTSTATUS NTAPI InPortQueryWmiDataBlock(_Inout_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp, _In_ ULONG GuidIndex, _In_ ULONG InstanceIndex, _In_ ULONG InstanceCount, _Out_opt_ PULONG InstanceLengthArray, _In_ ULONG BufferAvail, _Out_opt_ PUCHAR Buffer)
Definition: wmi.c:55
GUID GuidWmiPortData
Definition: wmi.c:17
NTSTATUS NTAPI InPortWmiRegistration(_Inout_ PINPORT_DEVICE_EXTENSION DeviceExtension)
Definition: wmi.c:118
NTSTATUS NTAPI InPortQueryWmiRegInfo(_Inout_ PDEVICE_OBJECT DeviceObject, _Inout_ PULONG RegFlags, _Inout_ PUNICODE_STRING InstanceName, _Out_opt_ PUNICODE_STRING *RegistryPath, _Inout_ PUNICODE_STRING MofResourceName, _Out_opt_ PDEVICE_OBJECT *Pdo)
Definition: wmi.c:28
NTSTATUS NTAPI InPortWmi(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
Definition: wmi.c:152
NTSTATUS NTAPI InPortWmiDeRegistration(_Inout_ PINPORT_DEVICE_EXTENSION DeviceExtension)
Definition: wmi.c:140
_Must_inspect_result_ _Inout_ PFLT_VOLUME _In_opt_ PCUNICODE_STRING InstanceName
Definition: fltkernel.h:1163
pRequest Complete(RequestStatus)
Status
Definition: gdiplustypes.h:25
UNICODE_STRING DriverRegistryPath
Definition: inport.c:17
#define _Out_opt_
Definition: ms_sal.h:346
#define _Inout_
Definition: ms_sal.h:378
#define _In_
Definition: ms_sal.h:308
_In_ ACCESS_MASK _In_ POBJECT_ATTRIBUTES _Reserved_ ULONG _In_opt_ PUNICODE_STRING _In_ ULONG _Out_opt_ PULONG Disposition
Definition: cmfuncs.h:56
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
#define IoSkipCurrentIrpStackLocation(Irp)
Definition: ntifs_ex.h:421
#define IoCompleteRequest
Definition: irp.c:1240
#define IoCallDriver
Definition: irp.c:1225
NTSTATUS NTAPI IoWMIRegistrationControl(IN PDEVICE_OBJECT DeviceObject, IN ULONG Action)
Definition: wmi.c:68
#define STATUS_WMI_INSTANCE_NOT_FOUND
Definition: ntstatus.h:777
#define STATUS_WMI_GUID_NOT_FOUND
Definition: ntstatus.h:776
#define STATUS_SUCCESS
Definition: shellext.h:65
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
#define DPRINT
Definition: sndvol32.h:71
PDEVICE_OBJECT Ldo
Definition: inport.h:46
IO_REMOVE_LOCK RemoveLock
Definition: inport.h:48
PDEVICE_OBJECT Pdo
Definition: inport.h:45
MOUSE_ATTRIBUTES MouseAttributes
Definition: inport.h:76
WMILIB_CONTEXT WmiLibInfo
Definition: inport.h:49
USHORT NumberOfButtons
Definition: ntddmou.h:110
uint32_t * PULONG
Definition: typedefs.h:59
#define NTAPI
Definition: typedefs.h:36
unsigned char * PUCHAR
Definition: typedefs.h:53
uint32_t ULONG
Definition: typedefs.h:59
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING MofResourceName
Definition: wdfdevice.h:2464
_In_ UCHAR _In_ UCHAR MinorFunction
Definition: wdfdevice.h:1699
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:215
WDF_EXTERN_C_START typedef _Must_inspect_result_ _In_ WDFDRIVER _In_opt_ PWDF_OBJECT_ATTRIBUTES _In_ PDEVICE_OBJECT _In_opt_ PDEVICE_OBJECT _In_opt_ PDEVICE_OBJECT Pdo
Definition: wdfminiport.h:72
#define POINTER_PORT_WMI_STD_MOUSE
Definition: wmidata.h:3180
struct _POINTER_PORT_WMI_STD_DATA POINTER_PORT_WMI_STD_DATA
struct _POINTER_PORT_WMI_STD_DATA * PPOINTER_PORT_WMI_STD_DATA
#define POINTER_PORT_WMI_STD_DATA_GUID
Definition: wmidata.h:315
#define POINTER_PORT_WMI_STD_I8042
Definition: wmidata.h:3169
NTSTATUS NTAPI WmiSystemControl(IN PWMILIB_CONTEXT WmiLibInfo, IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, OUT PSYSCTL_IRP_DISPOSITION IrpDisposition)
Definition: wmilib.c:48
NTSTATUS NTAPI WmiCompleteRequest(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN NTSTATUS Status, IN ULONG BufferUsed, IN CCHAR PriorityBoost)
Definition: wmilib.c:24
@ IrpNotWmi
Definition: wmilib.h:15
@ IrpForward
Definition: wmilib.h:16
@ IrpNotCompleted
Definition: wmilib.h:14
@ IrpProcessed
Definition: wmilib.h:13
enum _SYSCTL_IRP_DISPOSITION SYSCTL_IRP_DISPOSITION
#define WMIREG_FLAG_INSTANCE_PDO
Definition: wmistr.h:69
_In_ ULONG InstanceCount
Definition: iofuncs.h:1323
#define IoAcquireRemoveLock(RemoveLock, Tag)
#define IoReleaseRemoveLock(_RemoveLock, _Tag)
Definition: iofuncs.h:2764
#define IO_NO_INCREMENT
Definition: iotypes.h:598
#define WMIREG_ACTION_REGISTER
#define WMIREG_ACTION_DEREGISTER