https://git.reactos.org/?p=reactos.git;a=commitdiff;h=997b1797f4a90360f6113…
commit 997b1797f4a90360f6113265701245814bf3f934
Author:     Hervé Poussineau <hpoussin(a)reactos.org>
AuthorDate: Sat Nov 16 23:26:51 2024 +0100
Commit:     Hervé Poussineau <hpoussin(a)reactos.org>
CommitDate: Sat Nov 16 23:33:41 2024 +0100
    [BATTC] Fix comparisons when choosing to complete the status IRP
    They were reversed, which meant to immediately complete the IRP
    if conditions were NOT satisfied.
    Remove a now useless/invalid call to QueryStatus, to return the
    status which lead to IRP completion.
---
 drivers/battery/battc/battc.c | 32 ++++++++++----------------------
 1 file changed, 10 insertions(+), 22 deletions(-)
diff --git a/drivers/battery/battc/battc.c b/drivers/battery/battc/battc.c
index 8ddacd64359..dd08a9cd956 100644
--- a/drivers/battery/battc/battc.c
+++ b/drivers/battery/battc/battc.c
@@ -112,9 +112,9 @@ BatteryClassStatusNotify(PVOID ClassData)
             ExAcquireFastMutex(&BattClass->Mutex);
-            if (!(BattWait->PowerState & BattStatus.PowerState) ||
-                (BattWait->HighCapacity > BattStatus.Capacity) ||
-                (BattWait->LowCapacity < BattStatus.Capacity))
+            if (BattWait->PowerState != BattStatus.PowerState ||
+                BattWait->HighCapacity < BattStatus.Capacity ||
+                BattWait->LowCapacity > BattStatus.Capacity)
             {
                 KeSetEvent(&BattClass->WaitEvent, IO_NO_INCREMENT, FALSE);
             }
@@ -274,16 +274,15 @@ BatteryClassIoctl(PVOID ClassData,
             Timeout.QuadPart = Int32x32To64(BattWait.Timeout, -1000);
+            BattStatus = Irp->AssociatedIrp.SystemBuffer;
             Status =
BattClass->MiniportInfo.QueryStatus(BattClass->MiniportInfo.Context,
                                                          BattWait.BatteryTag,
-
(PBATTERY_STATUS)Irp->AssociatedIrp.SystemBuffer);
-
-            BattStatus = Irp->AssociatedIrp.SystemBuffer;
+                                                         BattStatus);
             if (!NT_SUCCESS(Status) ||
-                ((BattWait.PowerState & BattStatus->PowerState) &&
-                 (BattWait.HighCapacity <= BattStatus->Capacity) &&
-                 (BattWait.LowCapacity >= BattStatus->Capacity)))
+                (BattWait.PowerState == BattStatus->PowerState &&
+                 BattWait.HighCapacity >= BattStatus->Capacity &&
+                 BattWait.LowCapacity <= BattStatus->Capacity))
             {
                 BattNotify.PowerState = BattWait.PowerState;
                 BattNotify.HighCapacity = BattWait.HighCapacity;
@@ -304,25 +303,14 @@ BatteryClassIoctl(PVOID ClassData,
                                                KernelMode,
                                                FALSE,
                                                BattWait.Timeout != -1 ? &Timeout :
NULL);
+                if (Status == STATUS_TIMEOUT)
+                    Status = STATUS_SUCCESS;
                 ExAcquireFastMutex(&BattClass->Mutex);
                 BattClass->Waiting = FALSE;
                 ExReleaseFastMutex(&BattClass->Mutex);
BattClass->MiniportInfo.DisableStatusNotify(BattClass->MiniportInfo.Context);
-
-                if (Status == STATUS_SUCCESS)
-                {
-                    Status =
BattClass->MiniportInfo.QueryStatus(BattClass->MiniportInfo.Context,
-                                                                 BattWait.BatteryTag,
-
(PBATTERY_STATUS)Irp->AssociatedIrp.SystemBuffer);
-                    if (NT_SUCCESS(Status))
-                        Irp->IoStatus.Information = sizeof(ULONG);
-                }
-                else
-                {
-                    Status = STATUS_NO_SUCH_DEVICE;
-                }
             }
             else
             {