Details
-
Bug
-
Resolution: Unresolved
-
Major
-
None
-
None
Description
Summary:
- battc needs to handle "waiting" even if the miniport driver doesn't support notifications.
- The wait should not be synchronous
some pseudo code:
IOCTL_BATTERY_QUERY_STATUS:
|
Status = BattClass->MiniportInfo.QueryStatus(...)
|
if (!NT_SUCCESS(Status)) |
goto Fail; |
|
if (Wait && StatusWithinWaitMargins(&BattStatus, &WaitStatus)) |
{
|
QueueWait(...); // queues WaitStatus + Irp to miniport info |
|
// Determine new margins to include all active queries |
|
Status = BattClass->MiniportInfo.SetStatusNotify(...);
|
if (!NT_SUCCESS(Status)) |
{
|
BattcSetSyntheticStatusNotify(...);
|
}
|
}
|
|
QueueWait:
|
WaitEntry = ExAllocatePool(...);
|
WaitEntry->WaiStatus = WaitStatus;
|
WaitEntry-Irp = Irp;
|
// Set absolute timeout or create timer |
|
InsertTailList(&MiniPortData->WaitList, &WaitEntry->ListLink);
|
|
BattcSetSyntheticStatusNotify:
|
// Enable regular polling event |
|
BattcStatusNotify:
|
// Loop WaitList to process and complete all satisfied IRPs |
References:
- https://learn.microsoft.com/en-us/windows-hardware/drivers/battery/interaction-of-battery-status-and-notification-routines
- https://learn.microsoft.com/en-us/windows/win32/api/batclass/nc-batclass-bclass_query_status_callback
- SimBatt https://github.com/microsoft/Windows-driver-samples/blob/main/simbatt/func/miniclass.c#L564