- Rameshkumar Subramanian
While
developing CloudStorage Drive [virtual drive] application I came
across exploring windows power management to remount the CloudStorage
Drive after getting up from hibernate state. Usually you can see our
local drive / regular drive, like C:\, gets mounted when the system
wakes up from sleep state.
We
know that the operating system controls power management across the
entire PC system. For example, suppose if you have paused a video and
go to the hibernate state the process goes idle here. You can see the
video remain on the same state when the system is on back.
The
software developers can now make their application power-aware by handling
the WM_POWERBROADCAST message provided by the windows operating
system and scaling features accordingly. This article describes how
to handle the WM_POWERBROADCAST message and also describes the
sequence of messages for four typical cases. This is very helpful for
whoever wants to re-launch the application after the system get back
to power state.
Power
States
To
the user, the PC is either on or off, and other conditions are not
visible. However, the ACPI (Advanced Configuration and Power
Interface) specification defines a number of different power states
that are supported by windows operating system.
State
|
Description
|
S0/Working
|
On. The CPU is fully up and running. power
conversation is on a per-device basis.
|
S1 Sleep
|
Appears off. The CPU is stopped. RAM is
refreshed, the system is running in a low power mode.
|
S2 Sleep
|
Appears off. The CPU has no power. RAM is
refreshed. The system is in a lower mode than S1.
|
S3 Sleep
|
Appears off. The CPU has no power. RAM is
in slow refresh. The power supply is in a reduced power mode.
|
S4 Hibernate
|
Appears off. The hardware is completely
off. But system memory has been saved to disk.
|
S5/Off
|
Off. The hardware is completely off. The
operating system has shut down, nothing has been saved. Requires a
complete reboot to return to the working state.
|
The
power management functions and messages retrieve the system power
status and notify applications of power management events. The
windows offer WM_POWERBROADCAST message which will be send to the
application to indicate power changes. The documentation for each of
these is provided as:
Event
|
Meaning
|
PBT_APMBATTERY LOW
|
Battery power is low.
|
PBT_APMOEMEVENT
|
OEM-defined event occurred.
|
PBT_APMPOWERSTATUSCHANGE
|
Power status has changed.
|
PBT_APMQUERYSUSPEND
|
Request for permission to suspend.
|
PBT_APMQUERYSUSPENDFAILED
|
Suspension request denied.
|
PBT_APMRESUMEAUTOMATIC
|
Operation resuming automatically after event.
|
PBT_APMRESUMECRITICAL
|
Operation resuming after critical suspension.
|
PBT_APMRESUMESUSPEND
|
Operation resuming after suspension.
|
PBT_APMSUSPEND
|
System is suspending operation.
|
The
window proc receives the entire event which we can easily implement
as shown below. In .Net you have to using interop service namespace
for those things .
protected override void WndProc(ref Message m)
{
base.WndProc(ref m);
switch (m.Msg)
{
case WM_POWERBROADCAST:
{
switch (m.WParam.ToInt32())
{
case (int)PBT.PBT_APMQUERYSUSPEND:
. . .
. . .
}
}
}
}
The
above code can be made use to handle the power suspend states like
when system goes sleep or to hibernate mode.