ReactOS  0.4.15-dev-1384-g878186b
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 
17 #ifdef ALLOC_PRAGMA
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)
23 #endif
24 
26 
28 {
29  {&GuidWmiPortData, 1, 0}
30 };
31 
32 /* FUNCTIONS ******************************************************************/
33 
35 NTAPI
43 {
44  PINPORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
45 
48 
49  PAGED_CODE();
50 
51  DPRINT("%s()\n", __FUNCTION__);
52 
55  *Pdo = DeviceExtension->Pdo;
56 
57  return STATUS_SUCCESS;
58 }
59 
61 NTAPI
68  _Out_opt_ PULONG InstanceLengthArray,
71 {
73  PPOINTER_PORT_WMI_STD_DATA InPortData;
74  PINPORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
75 
76  PAGED_CODE();
77 
78  DPRINT("%s()\n", __FUNCTION__);
79 
81  {
83  goto Complete;
84  }
85 
86  /* Only register 1 instance per GUID */
87  if (InstanceIndex != 0 || InstanceCount != 1)
88  {
90  goto Complete;
91  }
92 
93  if (!InstanceLengthArray || BufferAvail < sizeof(POINTER_PORT_WMI_STD_DATA))
94  {
96  goto Complete;
97  }
98 
99  InPortData = (PPOINTER_PORT_WMI_STD_DATA)Buffer;
100 
101  /* Bus mouse connector isn't defined in the DDK, so set type to something generic */
103  /* 1 packet */
104  InPortData->DataQueueSize = 1;
105  /* Not supported by device */
106  InPortData->ErrorCount = 0;
107 
108  InPortData->Buttons = DeviceExtension->MouseAttributes.NumberOfButtons;
110  *InstanceLengthArray = sizeof(POINTER_PORT_WMI_STD_DATA);
111 
113 
114 Complete:
116  Irp,
117  Status,
120 }
121 
122 NTSTATUS
123 NTAPI
125  _Inout_ PINPORT_DEVICE_EXTENSION DeviceExtension)
126 {
127  PAGED_CODE();
128 
129  DeviceExtension->WmiLibInfo.GuidCount = RTL_NUMBER_OF(InPortWmiGuidList);
130  DeviceExtension->WmiLibInfo.GuidList = InPortWmiGuidList;
131 
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;
138 
139  return IoWMIRegistrationControl(DeviceExtension->Self,
141 }
142 
143 NTSTATUS
144 NTAPI
146  _Inout_ PINPORT_DEVICE_EXTENSION DeviceExtension)
147 {
148  PAGED_CODE();
149 
150  return IoWMIRegistrationControl(DeviceExtension->Self,
152 }
153 
154 NTSTATUS
155 NTAPI
158  _Inout_ PIRP Irp)
159 {
162  PINPORT_DEVICE_EXTENSION DeviceExtension = DeviceObject->DeviceExtension;
163 
164  PAGED_CODE();
165 
166  DPRINT("%s(%p, %p) %X\n", __FUNCTION__, DeviceObject, Irp,
168 
169  Status = IoAcquireRemoveLock(&DeviceExtension->RemoveLock, Irp);
170  if (!NT_SUCCESS(Status))
171  {
172  Irp->IoStatus.Information = 0;
173  Irp->IoStatus.Status = Status;
175 
176  return Status;
177  }
178 
179  Status = WmiSystemControl(&DeviceExtension->WmiLibInfo,
180  DeviceObject,
181  Irp,
182  &Disposition);
183  switch (Disposition)
184  {
185  case IrpProcessed:
186  break;
187 
188  case IrpNotCompleted:
190  break;
191 
192  case IrpForward:
193  case IrpNotWmi:
195  Status = IoCallDriver(DeviceExtension->Ldo, Irp);
196  break;
197  }
198 
199  IoReleaseRemoveLock(&DeviceExtension->RemoveLock, Irp);
200 
201  return Status;
202 }
PDEVICE_OBJECT Ldo
Definition: inport.h:44
#define STATUS_WMI_GUID_NOT_FOUND
Definition: ntstatus.h:776
WMIGUIDREGINFO InPortWmiGuidList[]
Definition: wmi.c:27
#define WMIREG_ACTION_DEREGISTER
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:317
WMILIB_CONTEXT WmiLibInfo
Definition: inport.h:47
unsigned char * PUCHAR
Definition: retypes.h:3
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:62
NTSTATUS NTAPI WmiSystemControl(IN PWMILIB_CONTEXT WmiLibInfo, IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, OUT PSYSCTL_IRP_DISPOSITION IrpDisposition)
Definition: wmilib.c:48
LONG NTSTATUS
Definition: precomp.h:26
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
Definition: wdfdriver.h:213
_In_ LPGUID _In_ ULONG InstanceIndex
Definition: classpnp.h:1250
#define IoReleaseRemoveLock(_RemoveLock, _Tag)
Definition: iofuncs.h:2760
NTSTATUS NTAPI WmiCompleteRequest(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN NTSTATUS Status, IN ULONG BufferUsed, IN CCHAR PriorityBoost)
Definition: wmilib.c:24
_In_ ACCESS_MASK _In_ POBJECT_ATTRIBUTES _Reserved_ ULONG _In_opt_ PUNICODE_STRING _In_ ULONG _Out_opt_ PULONG Disposition
Definition: cmfuncs.h:50
#define STATUS_WMI_INSTANCE_NOT_FOUND
Definition: ntstatus.h:777
#define STATUS_BUFFER_TOO_SMALL
Definition: shellext.h:69
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:36
_In_ PDEVICE_OBJECT DeviceObject
Definition: wdfdevice.h:2055
NTSTATUS(* NTAPI)(IN PFILE_FULL_EA_INFORMATION EaBuffer, IN ULONG EaLength, OUT PULONG ErrorOffset)
Definition: IoEaTest.cpp:117
NTSTATUS NTAPI InPortWmiDeRegistration(_Inout_ PINPORT_DEVICE_EXTENSION DeviceExtension)
Definition: wmi.c:145
struct _POINTER_PORT_WMI_STD_DATA * PPOINTER_PORT_WMI_STD_DATA
_In_ PIRP Irp
Definition: csq.h:116
pRequest Complete(RequestStatus)
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:64
_In_ UCHAR _In_ UCHAR MinorFunction
Definition: wdfdevice.h:1697
_Out_ ULONG * RegFlags
Definition: classpnp.h:403
#define IoCompleteRequest
Definition: irp.c:1240
_In_ PIRP _In_ ULONG GuidIndex
Definition: classpnp.h:418
void DPRINT(...)
Definition: polytest.cpp:61
#define WMIREG_FLAG_INSTANCE_PDO
Definition: wmistr.h:69
Definition: bufpool.h:45
struct _POINTER_PORT_WMI_STD_DATA POINTER_PORT_WMI_STD_DATA
NTSTATUS NTAPI IoWMIRegistrationControl(IN PDEVICE_OBJECT DeviceObject, IN ULONG Action)
Definition: wmi.c:68
#define POINTER_PORT_WMI_STD_DATA_GUID
Definition: wmidata.h:315
Status
Definition: gdiplustypes.h:24
#define _Out_opt_
Definition: no_sal2.h:214
#define WMIREG_ACTION_REGISTER
enum _SYSCTL_IRP_DISPOSITION SYSCTL_IRP_DISPOSITION
#define NT_SUCCESS(StatCode)
Definition: apphelp.c:32
NTSTATUS NTAPI InPortWmiRegistration(_Inout_ PINPORT_DEVICE_EXTENSION DeviceExtension)
Definition: wmi.c:124
#define _Inout_
Definition: no_sal2.h:162
GUID GuidWmiPortData
Definition: wmi.c:25
PDEVICE_OBJECT Pdo
Definition: inport.h:43
IO_REMOVE_LOCK RemoveLock
Definition: inport.h:46
_In_ PIRP _In_ ULONG _In_ ULONG BufferAvail
Definition: classpnp.h:418
_Must_inspect_result_ _In_ WDFDEVICE _In_ PCUNICODE_STRING MofResourceName
Definition: wdfdevice.h:2461
#define _In_
Definition: no_sal2.h:158
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(_In_ PIRP Irp)
Definition: iofuncs.h:2789
#define POINTER_PORT_WMI_STD_MOUSE
Definition: wmidata.h:3180
MOUSE_ATTRIBUTES MouseAttributes
Definition: inport.h:74
UNICODE_STRING DriverRegistryPath
Definition: inport.c:24
#define POINTER_PORT_WMI_STD_I8042
Definition: wmidata.h:3169
#define RTL_NUMBER_OF(x)
Definition: RtlRegistry.c:12
NTSTATUS NTAPI InPortWmi(_In_ PDEVICE_OBJECT DeviceObject, _Inout_ PIRP Irp)
Definition: wmi.c:156
unsigned int * PULONG
Definition: retypes.h:1
#define NULL
Definition: types.h:112
NTSTATUS NTAPI IoCallDriver(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
Definition: irp.c:1218
#define IoSkipCurrentIrpStackLocation(Irp)
Definition: ntifs_ex.h:421
_Must_inspect_result_ _Inout_ PFLT_VOLUME _In_opt_ PCUNICODE_STRING InstanceName
Definition: fltkernel.h:1162
unsigned int ULONG
Definition: retypes.h:1
#define IO_NO_INCREMENT
Definition: iotypes.h:581
_In_ ULONG InstanceCount
Definition: iofuncs.h:1319
#define STATUS_SUCCESS
Definition: shellext.h:65
#define __FUNCTION__
Definition: types.h:112
USHORT NumberOfButtons
Definition: ntddmou.h:110
#define IoAcquireRemoveLock(RemoveLock, Tag)
#define PAGED_CODE()