https://git.reactos.org/?p=reactos.git;a=commitdiff;h=626aaf227c692e91be395…
commit 626aaf227c692e91be395751c7b5e2c108edd270
Author: Eric Kohl <eric.kohl(a)reactos.org>
AuthorDate: Sun Apr 7 16:41:56 2019 +0200
Commit: Eric Kohl <eric.kohl(a)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;
}