reactos/drivers/bus/acpi/cmbatt/cmbwmi.c
2021-06-11 15:33:08 +03:00

223 lines
6.6 KiB
C

/*
* PROJECT: ReactOS ACPI-Compliant Control Method Battery
* LICENSE: BSD - See COPYING.ARM in the top level directory
* FILE: boot/drivers/bus/acpi/cmbatt/cmbwmi.c
* PURPOSE: WMI Interface
* PROGRAMMERS: ReactOS Portable Systems Group
*/
/* INCLUDES *******************************************************************/
#include "cmbatt.h"
#include <debug.h>
/* GLOBALS ********************************************************************/
WMIGUIDREGINFO CmBattWmiGuidList[1] =
{
{&GUID_POWER_DEVICE_WAKE_ENABLE, 1, 0}
};
/* FUNCTIONS ******************************************************************/
PCHAR
NTAPI
WMIMinorFunctionString(IN UCHAR MinorFunction)
{
switch (MinorFunction)
{
case IRP_MN_CHANGE_SINGLE_INSTANCE:
return "IRP_MN_CHANGE_SINGLE_INSTANCE";
case IRP_MN_CHANGE_SINGLE_ITEM:
return "IRP_MN_CHANGE_SINGLE_ITEM";
case IRP_MN_DISABLE_COLLECTION:
return "IRP_MN_DISABLE_COLLECTION";
case IRP_MN_DISABLE_EVENTS:
return "IRP_MN_DISABLE_EVENTS";
case IRP_MN_ENABLE_COLLECTION:
return "IRP_MN_ENABLE_COLLECTION";
case IRP_MN_ENABLE_EVENTS:
return "IRP_MN_ENABLE_EVENTS";
case IRP_MN_EXECUTE_METHOD:
return "IRP_MN_EXECUTE_METHOD";
case IRP_MN_QUERY_ALL_DATA:
return "IRP_MN_QUERY_ALL_DATA";
case IRP_MN_QUERY_SINGLE_INSTANCE:
return "IRP_MN_QUERY_SINGLE_INSTANCE";
case IRP_MN_REGINFO:
return "IRP_MN_REGINFO";
default:
return "IRP_MN_?????";
}
}
NTSTATUS
NTAPI
CmBattQueryWmiRegInfo(PDEVICE_OBJECT DeviceObject,
PULONG RegFlags,
PUNICODE_STRING InstanceName,
PUNICODE_STRING *RegistryPath,
PUNICODE_STRING MofResourceName,
PDEVICE_OBJECT *Pdo)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
NTSTATUS
NTAPI
CmBattQueryWmiDataBlock(PDEVICE_OBJECT DeviceObject,
PIRP Irp,
ULONG GuidIndex,
ULONG InstanceIndex,
ULONG InstanceCount,
PULONG InstanceLengthArray,
ULONG BufferAvail,
PUCHAR Buffer)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
NTSTATUS
NTAPI
CmBattSetWmiDataBlock(PDEVICE_OBJECT DeviceObject,
PIRP Irp,
ULONG GuidIndex,
ULONG InstanceIndex,
ULONG BufferSize,
PUCHAR Buffer)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
NTSTATUS
NTAPI
CmBattSetWmiDataItem(PDEVICE_OBJECT DeviceObject,
PIRP Irp,
ULONG GuidIndex,
ULONG InstanceIndex,
ULONG DataItemId,
ULONG BufferSize,
PUCHAR Buffer)
{
UNIMPLEMENTED;
return STATUS_NOT_IMPLEMENTED;
}
NTSTATUS
NTAPI
CmBattWmiDeRegistration(IN PCMBATT_DEVICE_EXTENSION DeviceExtension)
{
PAGED_CODE();
/* De-register */
return IoWMIRegistrationControl(DeviceExtension->FdoDeviceObject,
WMIREG_ACTION_DEREGISTER);
}
NTSTATUS
NTAPI
CmBattWmiRegistration(IN PCMBATT_DEVICE_EXTENSION DeviceExtension)
{
PAGED_CODE();
/* GUID information */
DeviceExtension->WmiLibInfo.GuidCount = sizeof(CmBattWmiGuidList) /
sizeof(WMIGUIDREGINFO);
DeviceExtension->WmiLibInfo.GuidList = CmBattWmiGuidList;
/* Callbacks */
DeviceExtension->WmiLibInfo.QueryWmiRegInfo = CmBattQueryWmiRegInfo;
DeviceExtension->WmiLibInfo.QueryWmiDataBlock = CmBattQueryWmiDataBlock;
DeviceExtension->WmiLibInfo.SetWmiDataBlock = CmBattSetWmiDataBlock;
DeviceExtension->WmiLibInfo.SetWmiDataItem = CmBattSetWmiDataItem;
DeviceExtension->WmiLibInfo.ExecuteWmiMethod = NULL;
DeviceExtension->WmiLibInfo.WmiFunctionControl = NULL;
/* Register */
return IoWMIRegistrationControl(DeviceExtension->FdoDeviceObject,
WMIREG_ACTION_REGISTER);
}
NTSTATUS
NTAPI
CmBattSystemControl(IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp)
{
NTSTATUS Status;
PCMBATT_DEVICE_EXTENSION DeviceExtension;
PWMILIB_CONTEXT WmiLibContext;
SYSCTL_IRP_DISPOSITION Disposition = IrpForward;
PAGED_CODE();
if (CmBattDebug & 2)
DbgPrint("CmBatt: SystemControl: %s\n",
WMIMinorFunctionString(IoGetCurrentIrpStackLocation(Irp)->MinorFunction));
/* Acquire the remove lock */
DeviceExtension = DeviceObject->DeviceExtension;
Status = IoAcquireRemoveLock(&DeviceExtension->RemoveLock, 0);
if (!NT_SUCCESS(Status))
{
/* It's too late, fail */
Irp->IoStatus.Status = STATUS_DEVICE_REMOVED;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return STATUS_DEVICE_REMOVED;
}
/* What kind of device is this? */
WmiLibContext = &DeviceExtension->WmiLibInfo;
if (DeviceExtension->FdoType == CmBattBattery)
{
/* For batteries, let the class driver handle it */
Status = BatteryClassSystemControl(DeviceExtension->ClassData,
WmiLibContext,
DeviceObject,
Irp,
&Disposition);
}
else
{
/* Otherwise, call the wmi library directly */
Status = WmiSystemControl(WmiLibContext,
DeviceObject,
Irp,
&Disposition);
}
/* Check what happened */
switch (Disposition)
{
case IrpNotCompleted:
/* Complete it here */
if (CmBattDebug & 2) DbgPrint("CmBatt: SystemControl: Irp Not Completed.\n");
IoCompleteRequest(Irp, IO_NO_INCREMENT);
break;
case IrpForward:
/* Forward it to ACPI */
if (CmBattDebug & 2) DbgPrint("CmBatt: SystemControl: Irp Forward.\n");
IoSkipCurrentIrpStackLocation(Irp);
Status = IoCallDriver(DeviceExtension->AttachedDevice, Irp);
break;
case IrpProcessed:
/* Nothing to do */
if (CmBattDebug & 2) DbgPrint("CmBatt: SystemControl: Irp Processed.\n");
break;
default:
ASSERT(FALSE);
}
/* Release the lock and return */
IoReleaseRemoveLock(&DeviceExtension->RemoveLock, 0);
return Status;
}
/* EOF */