32 Irp->IoStatus.Information = 0;
131 ULONG PrevPowerState;
138 Irp = BatteryData->Irp;
157 DbgPrint(
"CompBatt: Battery (0x%p) is being removed from composite battery\n", BatteryData);
171 DbgPrint(
"CompBatt: Battery arrived for first time or disappeared (Status 0x%08lx)\n",
Status);
180 BatteryData->InterruptTime = 0;
191 BatteryData->WorkerBuffer.WorkerTag = 0xFFFFFFFF;
194 goto DispatchRequest;
198 Mode = BatteryData->Mode;
208 DbgPrint(
"CompBatt: Battery (Device 0x%p) has a tag of %lu\n",
DeviceObject, BatteryData->WorkerBuffer.WorkerTag);
211 ASSERT(BatteryData->WorkerBuffer.WorkerTag != 0);
214 BatteryData->Tag = BatteryData->WorkerBuffer.WorkerTag;
218 DeviceExtension->
Flags = 0;
244 &BatteryData->WorkerBuffer.WorkerStatus,
245 sizeof(BatteryData->BatteryStatus));
263 if (BatteryData->WaitStatus.LowCapacity >
264 BatteryData->WorkerBuffer.WorkerStatus.Capacity)
266 BatteryData->WaitStatus.LowCapacity = BatteryData->WorkerBuffer.WorkerStatus.Capacity;
269 if (BatteryData->WaitStatus.HighCapacity <
270 BatteryData->WorkerBuffer.WorkerStatus.Capacity)
272 BatteryData->WaitStatus.HighCapacity = BatteryData->WorkerBuffer.WorkerStatus.Capacity;
277 BatteryData->WaitStatus.PowerState = BatteryData->WorkerBuffer.WorkerStatus.PowerState;
290 DeviceExtension->
Tag,
295 DbgPrint(
"CompBatt: Latest composite battery status\n"
296 " PowerState -> 0x%lx\n"
357 BatteryData->WaitStatus.BatteryTag = BatteryData->Tag;
358 BatteryData->WaitStatus.Timeout = 3000;
361 &BatteryData->WaitStatus,
362 sizeof(BatteryData->WaitStatus));
372 Irp->AssociatedIrp.SystemBuffer = &BatteryData->WorkerBuffer;
400 ListHead = &DeviceExtension->BatteryList;
401 NextEntry = ListHead->
Flink;
402 while (NextEntry != ListHead)
409 Tag = DeviceExtension->NextTag;
411 DeviceExtension->Tag =
Tag;
412 DeviceExtension->NextTag =
Tag + 1;
418 NextEntry = NextEntry->
Flink;
472 *
Tag = DeviceExtension->Tag;
498 ListHead = &DeviceExtension->BatteryList;
499 NextEntry = ListHead->
Flink;
500 while (NextEntry != ListHead)
506 NextEntry = NextEntry->
Flink;
548 ULONG LinkedBatteries = 0;
549 ULONG BadBatteriesCount = 0;
550 ULONG ComputedRate = 0;
554 ListHead = &DeviceExtension->BatteryList;
555 for (NextEntry = ListHead->
Flink;
556 NextEntry != ListHead;
557 NextEntry = NextEntry->
Flink)
590 DbgPrint(
"CompBatt: The battery is discharging but in reality it is charging... (Rate %d)\n",
601 DbgPrint(
"CompBatt: The battery is charging but in reality it is discharging... (Rate %d)\n",
612 DbgPrint(
"CompBatt: The battery is neither charging or discharging but has a contradicting rate... (Rate %d)\n",
636 if (BadBatteriesCount > 0)
639 DbgPrint(
"CompBatt: %lu bad batteries have been found!\n", BadBatteriesCount);
642 *TotalRate = ComputedRate;
643 *BatteriesCount = LinkedBatteries;
684 ULONG BatteriesCount;
685 ULONG HighestCapacity;
686 ULONG LowCapDifference, HighCapDifference, LowDelta, HighDelta;
699 DbgPrint(
"CompBatt: Composite battery tag not assigned or not matching (Tag -> %lu, Composite Tag -> %lu)\n",
716 DbgPrint(
"CompBatt: Failed to refresh composite battery's status (Status 0x%08lx)\n",
Status);
723 DbgPrint(
"CompBatt: Latest composite battery status (when setting notify status)\n"
724 " PowerState -> 0x%lx\n"
759 ASSERT(BatteriesCount != 0);
763 ListHead = &DeviceExtension->BatteryList;
764 for (NextEntry = ListHead->
Flink;
765 NextEntry != ListHead;
766 NextEntry = NextEntry->
Flink)
797 LowDelta = LowCapDifference / BatteriesCount;
798 HighDelta = HighCapDifference / BatteriesCount;
853 DbgPrint(
"CompBatt: Configuration wait values are in conflict\n"
854 " BatteryData->WaitStatus.PowerState -> 0x%lx\n"
855 " BatteryData->WorkerBuffer.WorkerWaitStatus.PowerState -> 0x%lx\n"
856 " BatteryData->WaitStatus.LowCapacity -> %u\n"
857 " BatteryData->WorkerBuffer.WorkerWaitStatus.LowCapacity -> %u\n"
858 " BatteryData->WaitStatus.HighCapacity -> %u\n"
859 " BatteryData->WorkerBuffer.WorkerWaitStatus.HighCapacity -> %u\n",
895 DbgPrint(
"CompBatt: Last battery or a battery was removed, the whole composite data must be recomputed\n");
948 (DeviceExtension->Tag !=
Tag))
951 DbgPrint(
"CompBatt: Composite battery tag not assigned or not matching (Tag -> %lu, Composite Tag -> %lu)\n",
952 Tag, DeviceExtension->Tag);
967 LastReadTime = CurrentReadTime - DeviceExtension->InterruptTime;
971 DbgPrint(
"CompBatt: Composite battery status data is fresh, no need to update it again\n");
990 ListHead = &DeviceExtension->BatteryList;
991 for (NextEntry = ListHead->
Flink;
992 NextEntry != ListHead;
993 NextEntry = NextEntry->
Flink)
1004 Wait.BatteryTag = BatteryData->
Tag;
1010 LastReadTime = CurrentReadTime - BatteryData->
InterruptTime;
1108 (DeviceExtension->Tag !=
Tag))
1116 DbgPrint(
"CompBatt: Last battery or a battery was removed, the whole composite data must be recomputed\n");
1140 sizeof(DeviceExtension->BatteryStatus));
1143 DeviceExtension->InterruptTime = CurrentReadTime;
1162 BatteryInfo->DefaultAlert1 = 0;
1163 BatteryInfo->DefaultAlert2 = 0;
1164 BatteryInfo->CriticalBias = 0;
1168 ListHead = &DeviceExtension->BatteryList;
1169 NextEntry = ListHead->
Flink;
1170 while (NextEntry != ListHead)
1212 DbgPrint(
"CompBattGetBatteryInformation: Read individual BATTERY_INFORMATION\n"
1213 "-------- Capabilities = %x\n-------- Technology = %x\n"
1214 "-------- Chemistry[4] = %x\n-------- DesignedCapacity = %x\n"
1215 "-------- FullChargedCapacity = %x\n-------- DefaultAlert1 = %x\n"
1216 "-------- DefaultAlert2 = %x\n-------- CriticalBias = %x\n"
1217 "-------- CycleCount = %x\n",
1245 BatteryInfo->DefaultAlert1 =
max(BatteryInfo->DefaultAlert1,
1249 BatteryInfo->DefaultAlert2 =
max(BatteryInfo->DefaultAlert2,
1253 BatteryInfo->CriticalBias =
max(BatteryInfo->CriticalBias,
1263 NextEntry = NextEntry->
Flink;
1271 if (!BatteryInfo->FullChargedCapacity)
1273 BatteryInfo->FullChargedCapacity = BatteryInfo->DesignedCapacity;
1278 DbgPrint(
"CompBattGetBatteryInformation: Returning BATTERY_INFORMATION\n"
1279 "-------- Capabilities = %x\n-------- Technology = %x\n"
1280 "-------- Chemistry[4] = %x\n-------- DesignedCapacity = %x\n"
1281 "-------- FullChargedCapacity = %x\n-------- DefaultAlert1 = %x\n"
1282 "-------- DefaultAlert2 = %x\n-------- CriticalBias = %x\n"
1283 "-------- CycleCount = %x\n",
1284 BatteryInfo->Capabilities,
1285 BatteryInfo->Technology,
1286 BatteryInfo->Chemistry,
1287 BatteryInfo->DesignedCapacity,
1288 BatteryInfo->FullChargedCapacity,
1289 BatteryInfo->DefaultAlert1,
1290 BatteryInfo->DefaultAlert2,
1291 BatteryInfo->CriticalBias,
1292 BatteryInfo->CycleCount);
1297 sizeof(DeviceExtension->BatteryInformation));
1321 ReportingScale[0].Granularity = -1;
1322 ReportingScale[1].Granularity = -1;
1323 ReportingScale[2].Granularity = -1;
1324 ReportingScale[3].Granularity = -1;
1328 ListHead = &DeviceExtension->BatteryList;
1329 NextEntry = ListHead->
Flink;
1330 while (NextEntry != ListHead)
1354 sizeof(BatteryScale),
1365 for (
i = 0;
i < 4;
i++)
1368 if (BatteryScale[
i].Granularity)
1371 ReportingScale[
i].Granularity =
min(BatteryScale[
i].Granularity,
1372 ReportingScale[
i].Granularity);
1384 NextEntry = NextEntry->
Flink;
1417 LONG ComputedAtRate = 0;
1421 ListHead = &DeviceExtension->BatteryList;
1422 for (NextEntry = ListHead->
Flink;
1423 NextEntry != ListHead;
1424 NextEntry = NextEntry->
Flink)
1437 QueryInformation.
AtRate = 0;
1453 sizeof(QueryInformation),
1473 return ComputedAtRate;
1510 LONG ComputedAtRate;
1520 DeviceExtension->Tag,
1525 DbgPrint(
"CompBatt: Failed to refresh composite battery's status (Status 0x%08lx)\n",
Status);
1532 DbgPrint(
"CompBatt: Latest composite battery status (when querying for estimated time)\n"
1533 " PowerState -> 0x%lx\n"
1552 DbgPrint(
"CompBatt: The system is powered by AC source, estimated time is not available\n");
1566 if (ComputedAtRate == 0)
1569 DbgPrint(
"CompBatt: No battery is discharging and no power is being drained, cannot estimate the run time\n");
1576 ListHead = &DeviceExtension->BatteryList;
1577 for (NextEntry = ListHead->
Flink;
1578 NextEntry != ListHead;
1579 NextEntry = NextEntry->
Flink)
1592 QueryInformation.
AtRate = ComputedAtRate;
1600 sizeof(QueryInformation),
1602 sizeof(ReturnedTime),
1635 *
Time += ReturnedTime;
1639 *
Time = ReturnedTime;
1667 PWCHAR BatteryName =
L"Composite Battery";
1671 ULONG QueryLength = 0;
1677 if ((
Tag != DeviceExtension->Tag) ||
1695 QueryData = &BatteryInfo;
1696 QueryLength =
sizeof(BatteryInfo);
1703 RtlZeroMemory(&BatteryGranularity,
sizeof(BatteryGranularity));
1708 QueryLength =
sizeof(BatteryGranularity);
1709 QueryData = &BatteryGranularity;
1721 QueryLength =
sizeof(
Time);
1730 QueryData = BatteryName;
1731 QueryLength =
sizeof(
L"Composite Battery");
1748 QueryLength =
sizeof(Dummy);
static PIO_STACK_LOCATION IoGetCurrentIrpStackLocation(PIRP Irp)
_In_ ULONG _In_ BATTERY_QUERY_INFORMATION_LEVEL _In_ LONG _In_ ULONG _Out_ PULONG ReturnedLength
#define IOCTL_BATTERY_QUERY_TAG
_In_ ULONG _In_ PBATTERY_NOTIFY BatteryNotify
#define BATTERY_UNKNOWN_CAPACITY
_In_ ULONG _Out_ PBATTERY_STATUS BatteryStatus
#define BATTERY_UNKNOWN_VOLTAGE
_In_ ULONG _In_ BATTERY_QUERY_INFORMATION_LEVEL _In_ LONG AtRate
#define BATTERY_POWER_ON_LINE
#define BATTERY_DISCHARGING
@ BatteryGranularityInformation
#define IOCTL_BATTERY_QUERY_INFORMATION
#define BATTERY_UNKNOWN_RATE
enum _BATTERY_QUERY_INFORMATION_LEVEL BATTERY_QUERY_INFORMATION_LEVEL
#define BATTERY_TAG_INVALID
#define IOCTL_BATTERY_QUERY_STATUS
#define BATTERY_UNKNOWN_TIME
BCLASSAPI NTSTATUS NTAPI BatteryClassStatusNotify(_In_ PVOID ClassData)
BCLASSAPI NTSTATUS NTAPI BatteryClassIoctl(PVOID ClassData, PIRP Irp)
NTSTATUS NTAPI CompBattQueryInformation(_In_ PCOMPBATT_DEVICE_EXTENSION DeviceExtension, _In_ ULONG Tag, _In_ BATTERY_QUERY_INFORMATION_LEVEL InfoLevel, _In_opt_ LONG AtRate, _In_ PVOID Buffer, _In_ ULONG BufferLength, _Out_ PULONG ReturnedLength)
NTSTATUS NTAPI CompBattMonitorIrpComplete(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp, _In_ PVOID Context)
Queues a work item thread worker which is bound to the individual CM (Control Method) ACPI battery to...
NTSTATUS NTAPI CompBattQueryStatus(_In_ PCOMPBATT_DEVICE_EXTENSION DeviceExtension, _In_ ULONG Tag, _Out_ PBATTERY_STATUS BatteryStatus)
Queries the battery status of each individiual connected battery with the composite battery and combi...
NTSTATUS NTAPI CompBattQueryTag(_In_ PCOMPBATT_DEVICE_EXTENSION DeviceExtension, _Out_ PULONG Tag)
NTSTATUS NTAPI CompBattSetStatusNotify(_In_ PCOMPBATT_DEVICE_EXTENSION DeviceExtension, _In_ ULONG BatteryTag, _In_ PBATTERY_NOTIFY BatteryNotify)
Sets a new configuration battery wait status settings of each battery. The purpose of this is so that...
NTSTATUS NTAPI CompBattGetBatteryGranularity(_Out_ PBATTERY_REPORTING_SCALE ReportingScale, _In_ PCOMPBATT_DEVICE_EXTENSION DeviceExtension)
VOID NTAPI CompBattMonitorIrpCompleteWorker(_In_ PCOMPBATT_BATTERY_DATA BatteryData)
The brains of the battery IRP worker. It monitors the state of the IRP as well as sends the IRP down ...
NTSTATUS NTAPI CompBattDisableStatusNotify(_In_ PCOMPBATT_DEVICE_EXTENSION DeviceExtension)
static BOOLEAN CompBattCalculateTotalRateAndLinkedBatteries(_In_ PCOMPBATT_DEVICE_EXTENSION DeviceExtension, _Out_ PULONG TotalRate, _Out_ PULONG BatteriesCount)
Calculates the total discharging/charging rate flow of each individual battery linked with the compos...
NTSTATUS NTAPI CompBattSystemControl(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
VOID NTAPI CompBattRecalculateTag(_In_ PCOMPBATT_DEVICE_EXTENSION DeviceExtension)
NTSTATUS NTAPI CompBattIoctl(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
NTSTATUS NTAPI CompBattOpenClose(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
NTSTATUS NTAPI CompBattGetEstimatedTime(_Out_ PULONG Time, _In_ PCOMPBATT_DEVICE_EXTENSION DeviceExtension)
Retrieves the estimated time of the composite battery based on the power drain rate of all the batter...
static LONG CompBattCalculateAtRateTime(_In_ PCOMPBATT_DEVICE_EXTENSION DeviceExtension)
Calculates the "At Rate" flow of the composite battery based on the sum of all connected batteries,...
NTSTATUS NTAPI CompBattGetBatteryInformation(_Out_ PBATTERY_INFORMATION BatteryInfo, _In_ PCOMPBATT_DEVICE_EXTENSION DeviceExtension)
NTSTATUS NTAPI CompBattPnpDispatch(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
NTSTATUS NTAPI CompBattRemoveBattery(_In_ PUNICODE_STRING BatteryName, _In_ PCOMPBATT_DEVICE_EXTENSION DeviceExtension)
#define COMPBATT_DEBUG_WARN
#define COMPUTE_ATRATE_DRAIN(Batt, Time)
#define COMPUTE_BATT_CAP_DELTA(LowDiff, Batt, TotalRate)
#define COMPBATT_QUERY_TAG
#define COMPBATT_WAIT_MAX_HIGH_CAPACITY
#define COMPBATT_TAG_ASSIGNED
#define COMPBATT_FRESH_STATUS_TIME
NTSTATUS NTAPI BatteryIoctl(_In_ ULONG IoControlCode, _In_ PDEVICE_OBJECT DeviceObject, _In_ PVOID InputBuffer, _In_ ULONG InputBufferLength, _Out_ PVOID OutputBuffer, _Inout_ ULONG OutputBufferLength, _In_ BOOLEAN InternalDeviceIoControl)
#define COMPBATT_BATTERY_INFORMATION_PRESENT
#define COMPBATT_DEBUG_ERR
#define COMPBATT_STATUS_NOTIFY_SET
#define COMPBATT_DEBUG_INFO
NTSTATUS NTAPI CompBattPowerDispatch(_In_ PDEVICE_OBJECT DeviceObject, _In_ PIRP Irp)
NTSTATUS NTAPI CompBattAddDevice(_In_ PDRIVER_OBJECT DriverObject, _In_ PDEVICE_OBJECT PdoDeviceObject)
#define COMPBATT_WAIT_MIN_LOW_CAPACITY
#define COMPBATT_READ_STATUS
#define COMPBATT_DEBUG_TRACE
#define STATUS_NOT_SUPPORTED
#define STATUS_DEVICE_REMOVED
#define NT_SUCCESS(StatCode)
DRIVER_INITIALIZE DriverEntry
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
VOID FASTCALL ExAcquireFastMutex(IN PFAST_MUTEX FastMutex)
VOID FASTCALL ExReleaseFastMutex(IN PFAST_MUTEX FastMutex)
#define IoSetCompletionRoutine(_Irp, _CompletionRoutine, _Context, _InvokeOnSuccess, _InvokeOnError, _InvokeOnCancel)
static PLARGE_INTEGER Time
#define ASSERTMSG(msg, exp)
#define UNREFERENCED_PARAMETER(P)
#define IoSkipCurrentIrpStackLocation(Irp)
#define IoCompleteRequest
BOOLEAN NTAPI IoCancelIrp(IN PIRP Irp)
VOID NTAPI IoFreeIrp(IN PIRP Irp)
#define IRP_MJ_DEVICE_CONTROL
#define KeQueryInterruptTime()
#define STATUS_MORE_PROCESSING_REQUIRED
#define STATUS_BUFFER_TOO_SMALL
PDEVICE_OBJECT DeviceObject
BATTERY_WAIT_STATUS WorkerWaitStatus
BATTERY_INFORMATION BatteryInformation
BATTERY_WAIT_STATUS WaitStatus
BATTERY_STATUS BatteryStatus
IO_REMOVE_LOCK RemoveLock
union _COMPBATT_BATTERY_DATA::@629 WorkerBuffer
BATTERY_WAIT_STATUS WaitNotifyStatus
PDEVICE_OBJECT DeviceObject
PDEVICE_OBJECT AttachedDevice
BATTERY_STATUS BatteryStatus
struct _IO_STACK_LOCATION::@1583::@1584 DeviceIoControl
union _IO_STACK_LOCATION::@1583 Parameters
struct _IO_STACK_LOCATION::@4015::@4054 Others
struct _LIST_ENTRY * Flink
#define RtlCopyMemory(Destination, Source, Length)
#define RtlZeroMemory(Destination, Length)
#define CONTAINING_RECORD(address, type, field)
#define STATUS_INVALID_PARAMETER
#define STATUS_NO_SUCH_DEVICE
_In_ PDEVICE_OBJECT DeviceObject
_Must_inspect_result_ _In_ WDFDEVICE _In_ BOOLEAN _In_opt_ PVOID Tag
_Must_inspect_result_ _In_ WDFDEVICE _In_ DEVICE_REGISTRY_PROPERTY _In_ ULONG BufferLength
_In_ WDFDPC _In_ BOOLEAN Wait
_Must_inspect_result_ _In_ PDRIVER_OBJECT _In_ PCUNICODE_STRING RegistryPath
_Must_inspect_result_ _In_ PDRIVER_OBJECT DriverObject
_Must_inspect_result_ _In_ WDFIOTARGET _In_opt_ WDFREQUEST _In_opt_ PWDF_MEMORY_DESCRIPTOR InputBuffer
VOID NTAPI ExQueueWorkItem(IN PWORK_QUEUE_ITEM WorkItem, IN WORK_QUEUE_TYPE QueueType)
__drv_aliasesMem FORCEINLINE PIO_STACK_LOCATION IoGetNextIrpStackLocation(_In_ PIRP Irp)
#define IoAcquireRemoveLock(RemoveLock, Tag)
#define IoReleaseRemoveLock(_RemoveLock, _Tag)
#define IRP_MJ_SYSTEM_CONTROL