X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=ntoskrnl%2Fpo%2Fpower.c;h=359a035f29481504e9c89c720ca012ed48c47698;hp=e8d37b855fd5caf281caa66c1abe44d4f728dfac;hb=406dfdbc870f3a6874c0959a87428c94f7526d3b;hpb=ec3ea47bd28946ee3c1c4c94c7061e8be281e2af diff --git a/ntoskrnl/po/power.c b/ntoskrnl/po/power.c index e8d37b855fd..359a035f294 100644 --- a/ntoskrnl/po/power.c +++ b/ntoskrnl/po/power.c @@ -52,7 +52,7 @@ PopRequestPowerIrpCompletion(IN PDEVICE_OBJECT DeviceObject, IoFreeIrp(Irp); - return STATUS_SUCCESS; + return STATUS_MORE_PROCESSING_REQUIRED; } VOID @@ -127,6 +127,7 @@ PopSetSystemPowerState(SYSTEM_POWER_STATE PowerState) BOOLEAN NTAPI +INIT_FUNCTION PoInitSystem(IN ULONG BootPhase) { PVOID NotificationEntry; @@ -136,7 +137,7 @@ PoInitSystem(IN ULONG BootPhase) /* Check if this is phase 1 init */ if (BootPhase == 1) { - /* Registry power button notification */ + /* Register power button notification */ IoRegisterPlugPlayNotification(EventCategoryDeviceInterfaceChange, PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES, (PVOID)&GUID_DEVICE_SYS_BUTTON, @@ -145,6 +146,16 @@ PoInitSystem(IN ULONG BootPhase) PopAddRemoveSysCapsCallback, NULL, &NotificationEntry); + + /* Register lid notification */ + IoRegisterPlugPlayNotification(EventCategoryDeviceInterfaceChange, + PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES, + (PVOID)&GUID_DEVICE_LID, + IopRootDeviceNode-> + PhysicalDeviceObject->DriverObject, + PopAddRemoveSysCapsCallback, + NULL, + &NotificationEntry); return TRUE; } @@ -206,6 +217,7 @@ PopIdle0(IN PPROCESSOR_POWER_STATE PowerState) VOID NTAPI +INIT_FUNCTION PoInitializePrcb(IN PKPRCB Prcb) { /* Initialize the Power State */ @@ -360,7 +372,6 @@ PoRequestPowerIrp(IN PDEVICE_OBJECT DeviceObject, PIO_STACK_LOCATION Stack; PIRP Irp; PREQUEST_POWER_ITEM RequestPowerItem; - NTSTATUS Status; if (MinorFunction != IRP_MN_QUERY_POWER && MinorFunction != IRP_MN_SET_POWER @@ -409,7 +420,7 @@ PoRequestPowerIrp(IN PDEVICE_OBJECT DeviceObject, *pIrp = Irp; IoSetCompletionRoutine(Irp, PopRequestPowerIrpCompletion, RequestPowerItem, TRUE, TRUE, TRUE); - Status = IoCallDriver(TopDeviceObject, Irp); + IoCallDriver(TopDeviceObject, Irp); /* Always return STATUS_PENDING. The completion routine * will call CompletionFunction and complete the Irp. @@ -650,6 +661,7 @@ NtSetSystemPowerState(IN POWER_ACTION SystemAction, KPROCESSOR_MODE PreviousMode = KeGetPreviousMode(); POP_POWER_ACTION Action = {0}; NTSTATUS Status; + ULONG Dummy; /* Check for invalid parameter combinations */ if ((MinSystemState >= PowerSystemMaximum) || @@ -733,9 +745,14 @@ NtSetSystemPowerState(IN POWER_ACTION SystemAction, /* Check if we're still in an invalid status */ if (!NT_SUCCESS(Status)) break; + +#ifndef NEWCC + /* Flush dirty cache pages */ + CcRosFlushDirtyPages(-1, &Dummy); +#endif /* Flush all volumes and the registry */ - DPRINT1("Flushing volumes\n"); + DPRINT1("Flushing volumes, cache flushed %d pages\n", Dummy); PopFlushVolumes(PopAction.Shutdown); /* Set IRP for drivers */