2 * PROJECT: ReactOS Kernel
3 * LICENSE: GPL - See COPYING in the top level directory
4 * FILE: drivers/battery/cmbatt/cmbatt.c
5 * PURPOSE: Control Method Battery Miniclass Driver
6 * PROGRAMMERS: Cameron Gutman (cameron.gutman@reactos.org)
14 LIST_ENTRY BatteryList
;
15 KSPIN_LOCK BatteryListLock
;
19 CmBattUnload(PDRIVER_OBJECT DriverObject
)
21 DPRINT("Control method battery miniclass driver unloaded\n");
26 CmBattDeviceControl(PDEVICE_OBJECT DeviceObject
,
29 PCMBATT_DEVICE_EXTENSION DeviceExtension
= DeviceObject
->DeviceExtension
;
32 Status
= BatteryClassIoctl(DeviceExtension
->BattClassHandle
,
35 if (Status
== STATUS_NOT_SUPPORTED
)
37 Irp
->IoStatus
.Status
= Status
;
38 Irp
->IoStatus
.Information
= 0;
40 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
48 CmBattPnP(PDEVICE_OBJECT DeviceObject
,
51 PCMBATT_DEVICE_EXTENSION DeviceExtension
= DeviceObject
->DeviceExtension
;
55 IoSkipCurrentIrpStackLocation(Irp
);
57 return IoCallDriver(DeviceExtension
->Ldo
, Irp
);
62 CmBattSystemControl(PDEVICE_OBJECT DeviceObject
,
67 Irp
->IoStatus
.Status
= STATUS_WMI_GUID_NOT_FOUND
;
68 Irp
->IoStatus
.Information
= 0;
70 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
72 return STATUS_WMI_GUID_NOT_FOUND
;
77 CmBattPower(PDEVICE_OBJECT DeviceObject
,
80 PCMBATT_DEVICE_EXTENSION DeviceExtension
= DeviceObject
->DeviceExtension
;
84 IoSkipCurrentIrpStackLocation(Irp
);
86 PoStartNextPowerIrp(Irp
);
88 return PoCallDriver(DeviceExtension
->Ldo
, Irp
);
93 CmBattCreateClose(PDEVICE_OBJECT DeviceObject
,
96 Irp
->IoStatus
.Status
= STATUS_SUCCESS
;
97 Irp
->IoStatus
.Information
= 0;
99 IoCompleteRequest(Irp
, IO_NO_INCREMENT
);
101 return STATUS_SUCCESS
;
106 CmBattAddDevice(PDRIVER_OBJECT DriverObject
,
107 PDEVICE_OBJECT PhysicalDeviceObject
)
110 PDEVICE_OBJECT DeviceObject
;
111 PCMBATT_DEVICE_EXTENSION DeviceExtension
;
112 BATTERY_MINIPORT_INFO BattInfo
;
114 Status
= IoCreateDevice(DriverObject
,
115 sizeof(CMBATT_DEVICE_EXTENSION
),
121 if (!NT_SUCCESS(Status
))
124 DeviceExtension
= DeviceObject
->DeviceExtension
;
126 DeviceExtension
->Pdo
= PhysicalDeviceObject
;
127 DeviceExtension
->Fdo
= DeviceObject
;
128 DeviceExtension
->Ldo
= IoAttachDeviceToDeviceStack(DeviceObject
,
129 PhysicalDeviceObject
);
131 DeviceObject
->Flags
|= DO_BUFFERED_IO
| DO_POWER_PAGABLE
;
133 /* We require an extra stack entry */
134 DeviceObject
->StackSize
= PhysicalDeviceObject
->StackSize
+ 2;
136 BattInfo
.MajorVersion
= BATTERY_CLASS_MAJOR_VERSION
;
137 BattInfo
.MinorVersion
= BATTERY_CLASS_MINOR_VERSION
;
138 BattInfo
.Context
= DeviceExtension
;
139 BattInfo
.QueryTag
= CmBattQueryTag
;
140 BattInfo
.QueryInformation
= CmBattQueryInformation
;
141 BattInfo
.SetInformation
= CmBattSetInformation
;
142 BattInfo
.QueryStatus
= CmBattQueryStatus
;
143 BattInfo
.SetStatusNotify
= CmBattSetStatusNotify
;
144 BattInfo
.DisableStatusNotify
= CmBattDisableStatusNotify
;
145 BattInfo
.Pdo
= PhysicalDeviceObject
;
146 BattInfo
.DeviceName
= NULL
;
148 Status
= BatteryClassInitializeDevice(&BattInfo
,
149 &DeviceExtension
->BattClassHandle
);
150 if (!NT_SUCCESS(Status
))
152 IoDetachDevice(DeviceExtension
->Ldo
);
153 IoDeleteDevice(DeviceObject
);
157 ExInterlockedInsertTailList(&BatteryList
,
158 &DeviceExtension
->ListEntry
,
161 DeviceObject
->Flags
&= ~DO_DEVICE_INITIALIZING
;
163 DPRINT("Successfully registered battery with battc (0x%x)\n", DeviceExtension
->BattClassHandle
);
165 return STATUS_SUCCESS
;
170 DriverEntry(PDRIVER_OBJECT DriverObject
,
171 PUNICODE_STRING RegistryPath
)
173 DPRINT("Control method battery miniclass driver initialized\n");
175 DriverObject
->DriverUnload
= CmBattUnload
;
176 DriverObject
->DriverExtension
->AddDevice
= CmBattAddDevice
;
177 DriverObject
->MajorFunction
[IRP_MJ_POWER
] = CmBattPower
;
178 DriverObject
->MajorFunction
[IRP_MJ_PNP
] = CmBattPnP
;
179 DriverObject
->MajorFunction
[IRP_MJ_CREATE
] = CmBattCreateClose
;
180 DriverObject
->MajorFunction
[IRP_MJ_CLOSE
] = CmBattCreateClose
;
181 DriverObject
->MajorFunction
[IRP_MJ_DEVICE_CONTROL
] = CmBattDeviceControl
;
182 DriverObject
->MajorFunction
[IRP_MJ_SYSTEM_CONTROL
] = CmBattSystemControl
;
184 KeInitializeSpinLock(&BatteryListLock
);
185 InitializeListHead(&BatteryList
);
187 return STATUS_SUCCESS
;