2005-01-06 13:58:04 +00:00
|
|
|
/* $Id$
|
2005-05-09 01:38:29 +00:00
|
|
|
*
|
2005-01-26 13:58:37 +00:00
|
|
|
* COPYRIGHT: See COPYING in the top level directory
|
2001-04-16 00:51:19 +00:00
|
|
|
* PROJECT: ReactOS kernel
|
|
|
|
* FILE: ntoskrnl/po/power.c
|
|
|
|
* PURPOSE: Power Manager
|
2005-05-09 01:38:29 +00:00
|
|
|
*
|
2005-01-26 13:58:37 +00:00
|
|
|
* PROGRAMMERS: Casper S. Hornstrup (chorns@users.sourceforge.net)
|
1999-08-20 16:31:17 +00:00
|
|
|
*/
|
2001-05-01 23:08:21 +00:00
|
|
|
|
2004-08-15 16:39:12 +00:00
|
|
|
#include <ntoskrnl.h>
|
2001-05-01 23:08:21 +00:00
|
|
|
#define NDEBUG
|
|
|
|
#include <internal/debug.h>
|
|
|
|
|
|
|
|
PDEVICE_NODE PopSystemPowerDeviceNode = NULL;
|
2005-03-12 00:49:18 +00:00
|
|
|
BOOLEAN PopAcpiPresent = FALSE;
|
2001-05-01 23:08:21 +00:00
|
|
|
|
2004-08-07 19:13:27 +00:00
|
|
|
/*
|
|
|
|
* @implemented
|
|
|
|
*/
|
2001-04-16 00:51:19 +00:00
|
|
|
NTSTATUS
|
|
|
|
STDCALL
|
|
|
|
PoCallDriver(
|
|
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
|
|
IN OUT PIRP Irp)
|
|
|
|
{
|
2001-05-01 23:08:21 +00:00
|
|
|
NTSTATUS Status;
|
|
|
|
|
|
|
|
Status = IoCallDriver(DeviceObject, Irp);
|
|
|
|
|
|
|
|
return Status;
|
2001-04-16 00:51:19 +00:00
|
|
|
}
|
1999-08-20 16:31:17 +00:00
|
|
|
|
2003-07-11 01:23:16 +00:00
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
2001-04-16 00:51:19 +00:00
|
|
|
PULONG
|
1999-08-20 16:31:17 +00:00
|
|
|
STDCALL
|
2001-04-16 00:51:19 +00:00
|
|
|
PoRegisterDeviceForIdleDetection(
|
|
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
|
|
IN ULONG ConservationIdleTime,
|
|
|
|
IN ULONG PerformanceIdleTime,
|
|
|
|
IN DEVICE_POWER_STATE State)
|
1999-08-20 16:31:17 +00:00
|
|
|
{
|
2001-04-16 00:51:19 +00:00
|
|
|
return NULL;
|
1999-08-20 16:31:17 +00:00
|
|
|
}
|
|
|
|
|
2003-07-11 01:23:16 +00:00
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
2001-04-16 00:51:19 +00:00
|
|
|
PVOID
|
|
|
|
STDCALL
|
|
|
|
PoRegisterSystemState(
|
|
|
|
IN PVOID StateHandle,
|
|
|
|
IN EXECUTION_STATE Flags)
|
|
|
|
{
|
|
|
|
return NULL;
|
|
|
|
}
|
1999-08-20 16:31:17 +00:00
|
|
|
|
2003-07-11 01:23:16 +00:00
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
2001-04-16 00:51:19 +00:00
|
|
|
NTSTATUS
|
|
|
|
STDCALL
|
|
|
|
PoRequestPowerIrp(
|
|
|
|
IN PDEVICE_OBJECT DeviceObject,
|
2005-05-09 01:38:29 +00:00
|
|
|
IN UCHAR MinorFunction,
|
2001-04-16 00:51:19 +00:00
|
|
|
IN POWER_STATE PowerState,
|
|
|
|
IN PREQUEST_POWER_COMPLETE CompletionFunction,
|
|
|
|
IN PVOID Context,
|
|
|
|
OUT PIRP *Irp OPTIONAL)
|
|
|
|
{
|
|
|
|
return STATUS_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
VOID
|
1999-08-20 16:31:17 +00:00
|
|
|
STDCALL
|
2001-04-16 00:51:19 +00:00
|
|
|
PoSetDeviceBusy(
|
|
|
|
PULONG IdlePointer)
|
1999-08-20 16:31:17 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2003-07-11 01:23:16 +00:00
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
2001-04-16 00:51:19 +00:00
|
|
|
POWER_STATE
|
|
|
|
STDCALL
|
|
|
|
PoSetPowerState(
|
|
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
|
|
IN POWER_STATE_TYPE Type,
|
|
|
|
IN POWER_STATE State)
|
|
|
|
{
|
|
|
|
POWER_STATE ps;
|
2005-05-09 01:38:29 +00:00
|
|
|
|
2005-02-22 21:09:54 +00:00
|
|
|
ASSERT_IRQL(DISPATCH_LEVEL);
|
2001-04-16 00:51:19 +00:00
|
|
|
|
|
|
|
ps.SystemState = PowerSystemWorking; // Fully on
|
|
|
|
ps.DeviceState = PowerDeviceD0; // Fully on
|
|
|
|
|
|
|
|
return ps;
|
|
|
|
}
|
|
|
|
|
2003-07-11 01:23:16 +00:00
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
2001-04-16 00:51:19 +00:00
|
|
|
VOID
|
|
|
|
STDCALL
|
|
|
|
PoSetSystemState(
|
|
|
|
IN EXECUTION_STATE Flags)
|
|
|
|
{
|
|
|
|
}
|
1999-08-20 16:31:17 +00:00
|
|
|
|
2003-07-11 01:23:16 +00:00
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
1999-08-20 16:31:17 +00:00
|
|
|
VOID
|
|
|
|
STDCALL
|
2001-04-16 00:51:19 +00:00
|
|
|
PoStartNextPowerIrp(
|
|
|
|
IN PIRP Irp)
|
1999-08-20 16:31:17 +00:00
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2003-07-11 01:23:16 +00:00
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
2001-04-16 00:51:19 +00:00
|
|
|
VOID
|
|
|
|
STDCALL
|
|
|
|
PoUnregisterSystemState(
|
|
|
|
IN PVOID StateHandle)
|
|
|
|
{
|
|
|
|
}
|
1999-08-20 16:31:17 +00:00
|
|
|
|
2001-05-01 23:08:21 +00:00
|
|
|
NTSTATUS
|
|
|
|
PopSetSystemPowerState(
|
|
|
|
SYSTEM_POWER_STATE PowerState)
|
2005-05-09 01:38:29 +00:00
|
|
|
{
|
2001-05-01 23:08:21 +00:00
|
|
|
IO_STATUS_BLOCK IoStatusBlock;
|
|
|
|
PDEVICE_OBJECT DeviceObject;
|
|
|
|
PIO_STACK_LOCATION IrpSp;
|
|
|
|
PDEVICE_OBJECT Fdo;
|
|
|
|
NTSTATUS Status;
|
|
|
|
KEVENT Event;
|
|
|
|
PIRP Irp;
|
2005-05-09 01:38:29 +00:00
|
|
|
|
2005-03-12 00:49:18 +00:00
|
|
|
if (!PopAcpiPresent) return STATUS_NOT_IMPLEMENTED;
|
2001-05-01 23:08:21 +00:00
|
|
|
|
|
|
|
Status = IopGetSystemPowerDeviceObject(&DeviceObject);
|
|
|
|
if (!NT_SUCCESS(Status)) {
|
|
|
|
CPRINT("No system power driver available\n");
|
|
|
|
return STATUS_UNSUCCESSFUL;
|
|
|
|
}
|
|
|
|
|
|
|
|
Fdo = IoGetAttachedDeviceReference(DeviceObject);
|
|
|
|
|
|
|
|
if (Fdo == DeviceObject)
|
|
|
|
{
|
|
|
|
DPRINT("An FDO was not attached\n");
|
|
|
|
return STATUS_UNSUCCESSFUL;
|
|
|
|
}
|
|
|
|
|
|
|
|
KeInitializeEvent(&Event,
|
|
|
|
NotificationEvent,
|
|
|
|
FALSE);
|
|
|
|
|
|
|
|
Irp = IoBuildSynchronousFsdRequest(IRP_MJ_POWER,
|
|
|
|
Fdo,
|
|
|
|
NULL,
|
|
|
|
0,
|
|
|
|
NULL,
|
|
|
|
&Event,
|
|
|
|
&IoStatusBlock);
|
|
|
|
|
|
|
|
IrpSp = IoGetNextIrpStackLocation(Irp);
|
|
|
|
IrpSp->MinorFunction = IRP_MN_SET_POWER;
|
|
|
|
IrpSp->Parameters.Power.Type = SystemPowerState;
|
|
|
|
IrpSp->Parameters.Power.State.SystemState = PowerState;
|
|
|
|
|
|
|
|
Status = PoCallDriver(Fdo, Irp);
|
|
|
|
if (Status == STATUS_PENDING)
|
|
|
|
{
|
|
|
|
KeWaitForSingleObject(&Event,
|
|
|
|
Executive,
|
|
|
|
KernelMode,
|
|
|
|
FALSE,
|
|
|
|
NULL);
|
|
|
|
Status = IoStatusBlock.Status;
|
|
|
|
}
|
|
|
|
|
|
|
|
ObDereferenceObject(Fdo);
|
|
|
|
|
|
|
|
return Status;
|
|
|
|
}
|
|
|
|
|
2005-05-09 01:38:29 +00:00
|
|
|
VOID
|
2005-03-12 00:49:18 +00:00
|
|
|
INIT_FUNCTION
|
2005-05-09 01:38:29 +00:00
|
|
|
PoInit(PLOADER_PARAMETER_BLOCK LoaderBlock,
|
2005-03-12 00:49:18 +00:00
|
|
|
BOOLEAN ForceAcpiDisable)
|
2001-05-01 23:08:21 +00:00
|
|
|
{
|
2005-03-15 23:02:51 +00:00
|
|
|
if (ForceAcpiDisable)
|
|
|
|
{
|
|
|
|
/* Set the ACPI State to False if it's been forced that way */
|
|
|
|
PopAcpiPresent = FALSE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* Otherwise check the LoaderBlock's Flag */
|
|
|
|
PopAcpiPresent = (LoaderBlock->Flags & MB_FLAGS_ACPI_TABLE) ? TRUE : FALSE;
|
|
|
|
}
|
2001-05-01 23:08:21 +00:00
|
|
|
}
|
|
|
|
|
2004-07-17 03:07:00 +00:00
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
|
|
|
NTSTATUS
|
|
|
|
STDCALL
|
|
|
|
NtInitiatePowerAction (
|
2004-10-24 20:37:27 +00:00
|
|
|
IN POWER_ACTION SystemAction,
|
|
|
|
IN SYSTEM_POWER_STATE MinSystemState,
|
|
|
|
IN ULONG Flags,
|
|
|
|
IN BOOLEAN Asynchronous)
|
2004-07-17 03:07:00 +00:00
|
|
|
{
|
|
|
|
UNIMPLEMENTED;
|
|
|
|
return STATUS_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
* @unimplemented
|
|
|
|
*/
|
2005-05-09 01:38:29 +00:00
|
|
|
NTSTATUS
|
|
|
|
STDCALL
|
2004-07-17 03:07:00 +00:00
|
|
|
NtPowerInformation(
|
2004-10-24 20:37:27 +00:00
|
|
|
IN POWER_INFORMATION_LEVEL PowerInformationLevel,
|
|
|
|
IN PVOID InputBuffer OPTIONAL,
|
|
|
|
IN ULONG InputBufferLength,
|
|
|
|
OUT PVOID OutputBuffer OPTIONAL,
|
|
|
|
IN ULONG OutputBufferLength
|
2004-07-17 03:07:00 +00:00
|
|
|
)
|
|
|
|
{
|
2005-01-07 16:10:48 +00:00
|
|
|
NTSTATUS Status;
|
2005-05-09 01:38:29 +00:00
|
|
|
|
2005-02-22 21:09:54 +00:00
|
|
|
PAGED_CODE();
|
2005-01-07 16:10:48 +00:00
|
|
|
|
|
|
|
DPRINT("NtPowerInformation(PowerInformationLevel 0x%x, InputBuffer 0x%x, "
|
|
|
|
"InputBufferLength 0x%x, OutputBuffer 0x%x, OutputBufferLength 0x%x)\n",
|
|
|
|
PowerInformationLevel,
|
|
|
|
InputBuffer, InputBufferLength,
|
|
|
|
OutputBuffer, OutputBufferLength);
|
|
|
|
switch (PowerInformationLevel)
|
|
|
|
{
|
|
|
|
case SystemBatteryState:
|
|
|
|
{
|
|
|
|
PSYSTEM_BATTERY_STATE BatteryState = (PSYSTEM_BATTERY_STATE)OutputBuffer;
|
|
|
|
|
|
|
|
if (InputBuffer != NULL)
|
|
|
|
return STATUS_INVALID_PARAMETER;
|
|
|
|
if (OutputBufferLength < sizeof(SYSTEM_BATTERY_STATE))
|
|
|
|
return STATUS_BUFFER_TOO_SMALL;
|
|
|
|
|
|
|
|
/* Just zero the struct (and thus set BatteryState->BatteryPresent = FALSE) */
|
|
|
|
RtlZeroMemory(BatteryState, sizeof(SYSTEM_BATTERY_STATE));
|
|
|
|
BatteryState->EstimatedTime = (ULONG)-1;
|
|
|
|
|
|
|
|
Status = STATUS_SUCCESS;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
default:
|
|
|
|
Status = STATUS_NOT_IMPLEMENTED;
|
|
|
|
DPRINT1("PowerInformationLevel 0x%x is UNIMPLEMENTED! Have a nice day.\n",
|
|
|
|
PowerInformationLevel);
|
|
|
|
for (;;);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
return Status;
|
2004-07-17 03:07:00 +00:00
|
|
|
}
|
|
|
|
|
2005-03-29 17:29:02 +00:00
|
|
|
|
|
|
|
NTSTATUS
|
|
|
|
STDCALL
|
|
|
|
PoQueueShutdownWorkItem(
|
|
|
|
IN PWORK_QUEUE_ITEM WorkItem
|
|
|
|
)
|
|
|
|
{
|
|
|
|
PAGED_CODE();
|
2005-05-09 01:38:29 +00:00
|
|
|
|
2005-03-29 17:29:02 +00:00
|
|
|
DPRINT1("PoQueueShutdownWorkItem(%p)\n", WorkItem);
|
|
|
|
|
|
|
|
return STATUS_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
1999-08-20 16:31:17 +00:00
|
|
|
/* EOF */
|