/*++
Copyright (c) 1990-2000    Microsoft Corporation All Rights Reserved

Module Name:

    power.h

Abstract:

    This module contains the declarations used by power.c

Author:

     Eliyas Yakub   Sep 16, 1998

Environment:

    user and kernel
Notes:


Revision History:


--*/
#ifndef __POWER_H
#define __POWER_H

typedef enum {

    IRP_NEEDS_FORWARDING = 1,
    IRP_ALREADY_FORWARDED

} IRP_DIRECTION;

typedef struct _POWER_COMPLETION_CONTEXT {

    PDEVICE_OBJECT  DeviceObject;
    PIRP            SIrp;

} POWER_COMPLETION_CONTEXT, *PPOWER_COMPLETION_CONTEXT;

typedef struct _WORKER_THREAD_CONTEXT {

    PDEVICE_OBJECT  DeviceObject;
    PIRP            Irp;
    IRP_DIRECTION   IrpDirection;
    PIO_WORKITEM    WorkItem;

} WORKER_THREAD_CONTEXT, *PWORKER_THREAD_CONTEXT;
    
typedef struct {

    PAC_DC_NOTIFY_HANDLER Handler;
    PVOID                 Context;
    
} AC_DC_TRANSITION_NOTIFY, *PAC_DC_TRANSITION_NOTIFY;


NTSTATUS
ProcessorDefaultPowerHandler  (
    IN  PDEVICE_OBJECT  DeviceObject,
    IN OUT  PIRP        Irp
    );


NTSTATUS
ProcessorQueryPowerState  (
    IN  PDEVICE_OBJECT  DeviceObject,
    IN OUT  PIRP        Irp
    );

NTSTATUS
ProcessorSetPowerState  (
    IN  PDEVICE_OBJECT  DeviceObject,
    IN OUT  PIRP        Irp
    );


VOID
HoldIoRequestsWorkerRoutine(
    IN PDEVICE_OBJECT   DeviceObject,
    IN PVOID            Context
);

NTSTATUS
HoldIoRequests(
    IN  PDEVICE_OBJECT      DeviceObject,
    IN  PIRP                Irp,
    IN  IRP_DIRECTION       Direction
    );

NTSTATUS
ProcessorPowerCompletionRoutine (
    IN PDEVICE_OBJECT       DeviceObject,
    IN PIRP                 Irp,
    IN PVOID                Context
    )   ;

VOID
ProcessorPoRequestComplete (
    IN PDEVICE_OBJECT   DeviceObject,
    IN UCHAR            MinorFunction,
    IN POWER_STATE      PowerState,
    IN PVOID            Context,
    IN PIO_STATUS_BLOCK IoStatus
    );

NTSTATUS
HandleSystemPowerIrp(
    IN PDEVICE_OBJECT   DeviceObject,
    IN PIRP             Irp
    );

NTSTATUS
OnFinishSystemPowerUp(
    IN PDEVICE_OBJECT   Fdo,
    IN PIRP             Irp,
    IN PVOID            NotUsed
    );

VOID
QueueCorrespondingDeviceIrp(
    IN PIRP             SIrp,
    IN PDEVICE_OBJECT   DeviceObject
    );

VOID
OnPowerRequestComplete(
    PDEVICE_OBJECT              DeviceObject,
    UCHAR                       MinorFunction,
    POWER_STATE                 state,
    POWER_COMPLETION_CONTEXT*   ctx,
    PIO_STATUS_BLOCK            pstatus
    );

NTSTATUS
HandleDeviceQueryPower(
    PDEVICE_OBJECT  DeviceObject,
    PIRP            Irp
    );

NTSTATUS HandleDeviceSetPower(
    IN PDEVICE_OBJECT   DeviceObject,
    IN PIRP             Irp
    );

NTSTATUS
OnFinishDevicePowerUp(
    IN PDEVICE_OBJECT   DeviceObject,
    IN PIRP             Irp,
    IN PVOID            junk
    );


NTSTATUS
BeginSetDevicePowerState(
    IN  PDEVICE_OBJECT      DeviceObject,
    IN  PIRP                Irp,
    IN  IRP_DIRECTION       Direction
    );

NTSTATUS
FinishDevicePowerIrp(
    IN  PDEVICE_OBJECT      DeviceObject,
    IN  PIRP                Irp,
    IN  IRP_DIRECTION       Direction,
    IN  NTSTATUS            Result
    );
#endif