https://git.reactos.org/?p=reactos.git;a=commitdiff;h=626aaf227c692e91be3957...
commit 626aaf227c692e91be395751c7b5e2c108edd270 Author: Eric Kohl eric.kohl@reactos.org AuthorDate: Sun Apr 7 16:41:56 2019 +0200 Commit: Eric Kohl eric.kohl@reactos.org CommitDate: Sun Apr 7 16:42:58 2019 +0200
[NTOSKRNL] Use global power capabilities and report button presence
- Add and initialize a global power capabilities variable. - Return the global power capabilities via NtPowerInformation.SystemPowerCapabilities. - Report the presence of power button, sleep button and lid. --- ntoskrnl/include/internal/po.h | 1 + ntoskrnl/po/events.c | 22 ++++++++++++++++------ ntoskrnl/po/power.c | 13 ++++++++++--- 3 files changed, 27 insertions(+), 9 deletions(-)
diff --git a/ntoskrnl/include/internal/po.h b/ntoskrnl/include/internal/po.h index f9d57e3e59..0d72234738 100644 --- a/ntoskrnl/include/internal/po.h +++ b/ntoskrnl/include/internal/po.h @@ -365,4 +365,5 @@ extern KGUARDED_MUTEX PopVolumeLock; extern LIST_ENTRY PopVolumeDevices; extern KSPIN_LOCK PopDopeGlobalLock; extern POP_POWER_ACTION PopAction; +extern SYSTEM_POWER_CAPABILITIES PopCapabilities;
diff --git a/ntoskrnl/po/events.c b/ntoskrnl/po/events.c index e79f6df12e..b6392bd931 100644 --- a/ntoskrnl/po/events.c +++ b/ntoskrnl/po/events.c @@ -242,13 +242,23 @@ PopAddRemoveSysCapsCallback(IN PVOID NotificationStructure, return STATUS_INSUFFICIENT_RESOURCES; }
- /* FIXME: What do do with the capabilities? */ + DPRINT("Device capabilities: 0x%x\n", Caps); + if (Caps & SYS_BUTTON_POWER) { - DPRINT("Device capabilities: 0x%x (", Caps); - if (Caps & SYS_BUTTON_POWER) DPRINT(" POWER"); - if (Caps & SYS_BUTTON_SLEEP) DPRINT(" SLEEP"); - if (Caps & SYS_BUTTON_LID) DPRINT(" LID"); - DPRINT(" )\n"); + DPRINT("POWER button present\n"); + PopCapabilities.PowerButtonPresent = TRUE; + } + + if (Caps & SYS_BUTTON_SLEEP) + { + DPRINT("SLEEP button present\n"); + PopCapabilities.SleepButtonPresent = TRUE; + } + + if (Caps & SYS_BUTTON_LID) + { + DPRINT("LID present\n"); + PopCapabilities.LidPresent = TRUE; }
SysButtonContext = ExAllocatePoolWithTag(NonPagedPool, diff --git a/ntoskrnl/po/power.c b/ntoskrnl/po/power.c index a0dd4fb3af..f249d0eb1a 100644 --- a/ntoskrnl/po/power.c +++ b/ntoskrnl/po/power.c @@ -26,6 +26,7 @@ PDEVICE_NODE PopSystemPowerDeviceNode = NULL; BOOLEAN PopAcpiPresent = FALSE; POP_POWER_ACTION PopAction; WORK_QUEUE_ITEM PopShutdownWorkItem; +SYSTEM_POWER_CAPABILITIES PopCapabilities;
/* PRIVATE FUNCTIONS *********************************************************/
@@ -323,6 +324,9 @@ PoInitSystem(IN ULONG BootPhase) return TRUE; }
+ /* Initialize the power capabilities */ + RtlZeroMemory(&PopCapabilities, sizeof(SYSTEM_POWER_CAPABILITIES)); + /* Get the Command Line */ CommandLine = KeLoaderBlock->LoadOptions;
@@ -343,6 +347,9 @@ PoInitSystem(IN ULONG BootPhase) PopAcpiPresent = KeLoaderBlock->Extension->AcpiTable != NULL ? TRUE : FALSE; }
+ /* Enable shutdown by power button */ + if (PopAcpiPresent) + PopCapabilities.SystemS5 = TRUE;
/* Initialize volume support */ InitializeListHead(&PopVolumeDevices); @@ -720,9 +727,9 @@ NtPowerInformation(IN POWER_INFORMATION_LEVEL PowerInformationLevel,
_SEH2_TRY { - /* Just zero the struct (and thus set PowerCapabilities->SystemBatteriesPresent = FALSE) */ - RtlZeroMemory(PowerCapabilities, sizeof(SYSTEM_POWER_CAPABILITIES)); - //PowerCapabilities->SystemBatteriesPresent = 0; + RtlCopyMemory(PowerCapabilities, + &PopCapabilities, + sizeof(SYSTEM_POWER_CAPABILITIES));
Status = STATUS_SUCCESS; }