2 * PROJECT: ReactOS ACPI-Compliant Control Method Battery
3 * LICENSE: BSD - See COPYING.ARM in the top level directory
4 * FILE: boot/drivers/bus/acpi/cmbatt/cmbwmi.c
5 * PURPOSE: WMI Interface
6 * PROGRAMMERS: ReactOS Portable Systems Group
9 /* INCLUDES *******************************************************************/
13 /* GLOBALS ********************************************************************/
15 WMIGUIDREGINFO CmBattWmiGuidList
[1] =
17 {&GUID_POWER_DEVICE_WAKE_ENABLE
, 1, 0}
20 /* FUNCTIONS ******************************************************************/
24 WMIMinorFunctionString(IN UCHAR MinorFunction
)
26 switch (MinorFunction
)
28 case IRP_MN_CHANGE_SINGLE_INSTANCE
:
29 return "IRP_MN_CHANGE_SINGLE_INSTANCE";
30 case IRP_MN_CHANGE_SINGLE_ITEM
:
31 return "IRP_MN_CHANGE_SINGLE_ITEM";
32 case IRP_MN_DISABLE_COLLECTION
:
33 return "IRP_MN_DISABLE_COLLECTION";
34 case IRP_MN_DISABLE_EVENTS
:
35 return "IRP_MN_DISABLE_EVENTS";
36 case IRP_MN_ENABLE_COLLECTION
:
37 return "IRP_MN_ENABLE_COLLECTION";
38 case IRP_MN_ENABLE_EVENTS
:
39 return "IRP_MN_ENABLE_EVENTS";
40 case IRP_MN_EXECUTE_METHOD
:
41 return "IRP_MN_EXECUTE_METHOD";
42 case IRP_MN_QUERY_ALL_DATA
:
43 return "IRP_MN_QUERY_ALL_DATA";
44 case IRP_MN_QUERY_SINGLE_INSTANCE
:
45 return "IRP_MN_QUERY_SINGLE_INSTANCE";
47 return "IRP_MN_REGINFO";
49 return "IRP_MN_?????";
55 CmBattQueryWmiRegInfo(PDEVICE_OBJECT DeviceObject
,
57 PUNICODE_STRING InstanceName
,
58 PUNICODE_STRING
*RegistryPath
,
59 PUNICODE_STRING MofResourceName
,
63 return STATUS_NOT_IMPLEMENTED
;
68 CmBattQueryWmiDataBlock(PDEVICE_OBJECT DeviceObject
,
73 PULONG InstanceLengthArray
,
78 return STATUS_NOT_IMPLEMENTED
;
83 CmBattSetWmiDataBlock(PDEVICE_OBJECT DeviceObject
,
91 return STATUS_NOT_IMPLEMENTED
;
96 CmBattSetWmiDataItem(PDEVICE_OBJECT DeviceObject
,
105 return STATUS_NOT_IMPLEMENTED
;
110 CmBattWmiDeRegistration(IN PCMBATT_DEVICE_EXTENSION DeviceExtension
)
115 return IoWMIRegistrationControl(DeviceExtension
->FdoDeviceObject
,
116 WMIREG_ACTION_DEREGISTER
);
121 CmBattWmiRegistration(IN PCMBATT_DEVICE_EXTENSION DeviceExtension
)
125 /* GUID information */
126 DeviceExtension
->WmiLibInfo
.GuidCount
= sizeof(CmBattWmiGuidList
) /
127 sizeof(WMIGUIDREGINFO
);
128 DeviceExtension
->WmiLibInfo
.GuidList
= CmBattWmiGuidList
;
131 DeviceExtension
->WmiLibInfo
.QueryWmiRegInfo
= CmBattQueryWmiRegInfo
;
132 DeviceExtension
->WmiLibInfo
.QueryWmiDataBlock
= CmBattQueryWmiDataBlock
;
133 DeviceExtension
->WmiLibInfo
.SetWmiDataBlock
= CmBattSetWmiDataBlock
;
134 DeviceExtension
->WmiLibInfo
.SetWmiDataItem
= CmBattSetWmiDataItem
;
135 DeviceExtension
->WmiLibInfo
.ExecuteWmiMethod
= NULL
;
136 DeviceExtension
->WmiLibInfo
.WmiFunctionControl
= NULL
;
139 return IoWMIRegistrationControl(DeviceExtension
->FdoDeviceObject
,
140 WMIREG_ACTION_REGISTER
);
145 CmBattSystemControl(IN PDEVICE_OBJECT DeviceObject
,
149 PCMBATT_DEVICE_EXTENSION DeviceExtension
;
150 PWMILIB_CONTEXT WmiLibContext
;
151 SYSCTL_IRP_DISPOSITION Disposition
= IrpForward
;
154 DbgPrint("CmBatt: SystemControl: %s\n",
155 WMIMinorFunctionString(IoGetCurrentIrpStackLocation(Irp
)->MinorFunction
));
157 /* Acquire the remove lock */
158 DeviceExtension
= DeviceObject
->DeviceExtension
;
159 Status
= IoAcquireRemoveLock(&DeviceExtension
->RemoveLock
, 0);
160 if (!NT_SUCCESS(Status
))
162 /* It's too late, fail */
163 Irp
->IoStatus
.Status
= STATUS_DEVICE_REMOVED
;
164 IofCompleteRequest(Irp
, IO_NO_INCREMENT
);
165 return STATUS_DEVICE_REMOVED
;
168 /* What kind of device is this? */
169 WmiLibContext
= &DeviceExtension
->WmiLibInfo
;
170 if (DeviceExtension
->FdoType
== CmBattBattery
)
172 /* For batteries, let the class driver handle it */
173 Status
= BatteryClassSystemControl(DeviceExtension
->ClassData
,
181 /* Otherwise, call the wmi library directly */
182 Status
= WmiSystemControl(WmiLibContext
,
188 /* Check what happened */
191 case IrpNotCompleted
:
193 /* Complete it here */
194 if (CmBattDebug
& 2) DbgPrint("CmBatt: SystemControl: Irp Not Completed.\n");
195 IofCompleteRequest(Irp
, IO_NO_INCREMENT
);
200 /* Forward it to ACPI */
201 if (CmBattDebug
& 2) DbgPrint("CmBatt: SystemControl: Irp Forward.\n");
202 IoSkipCurrentIrpStackLocation(Irp
);
203 Status
= IoCallDriver(DeviceExtension
->AttachedDevice
, Irp
);
209 if (CmBattDebug
& 2) DbgPrint("CmBatt: SystemControl: Irp Processed.\n");
216 /* Release the lock and return */
217 IoReleaseRemoveLock(&DeviceExtension
->RemoveLock
, 0);