805 lines
22 KiB
C
805 lines
22 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1996 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
acpiosnt.h
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
This contains information that is specific to the NT ACPI module
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Stephane Plante (splante)
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
NT Kernel Model Driver only
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#ifndef _ACPIOSNT_H_
|
||
|
#define _ACPIOSNT_H_
|
||
|
|
||
|
//
|
||
|
// Additonal status bits
|
||
|
//
|
||
|
#define PM1_GPE_PENDING 0x00010000
|
||
|
#define PM1_DPC_IN_PROGRESS 0x80000000
|
||
|
|
||
|
//
|
||
|
// Define the Maximum number of ACPI suffixes that we should try
|
||
|
//
|
||
|
#define ACPI_MAX_SUFFIX_LENGTH 99
|
||
|
|
||
|
typedef
|
||
|
VOID
|
||
|
(*PDEVICE_WORKER) (
|
||
|
IN struct _DEVICE_EXTENSION *DevExt,
|
||
|
IN ULONG Events
|
||
|
);
|
||
|
|
||
|
typedef struct {
|
||
|
PDRIVER_DISPATCH CreateClose;
|
||
|
PDRIVER_DISPATCH DeviceControl;
|
||
|
PDRIVER_DISPATCH PnpStartDevice;
|
||
|
PDRIVER_DISPATCH *Pnp;
|
||
|
PDRIVER_DISPATCH *Power;
|
||
|
PDRIVER_DISPATCH SystemControl;
|
||
|
PDRIVER_DISPATCH Other;
|
||
|
PDEVICE_WORKER Worker;
|
||
|
} IRP_DISPATCH_TABLE, *PIRP_DISPATCH_TABLE;
|
||
|
|
||
|
typedef struct {
|
||
|
PUCHAR PnPId;
|
||
|
PIRP_DISPATCH_TABLE DispatchTable;
|
||
|
} INTERNAL_DEVICE_TABLE, *PINTERNAL_DEVICE_TABLE;
|
||
|
|
||
|
typedef struct {
|
||
|
PUCHAR PnPId;
|
||
|
ULONGLONG Flags;
|
||
|
} INTERNAL_DEVICE_FLAG_TABLE, *PINTERNAL_DEVICE_FLAG_TABLE;
|
||
|
|
||
|
struct _DEVICE_EXTENSION ;
|
||
|
typedef struct _DEVICE_EXTENSION DEVICE_EXTENSION, *PDEVICE_EXTENSION ;
|
||
|
|
||
|
//
|
||
|
// Some bits to realize what state the device is in
|
||
|
//
|
||
|
typedef enum _ACPI_DEVICE_STATE {
|
||
|
Stopped = 0,
|
||
|
Inactive,
|
||
|
Started,
|
||
|
Removed,
|
||
|
SurpriseRemoved,
|
||
|
Invalid
|
||
|
} ACPI_DEVICE_STATE;
|
||
|
|
||
|
//
|
||
|
// For START_DEVICE's we want to drop from DISPATCH_LEVEL (the level that the
|
||
|
// Power Management Engine runs at) to PASSIVE_LEVEL so that we can either
|
||
|
// a) pass the irp along, or b) run some code was designed to run at passive
|
||
|
// level
|
||
|
//
|
||
|
typedef struct {
|
||
|
|
||
|
//
|
||
|
// Pointer to the work item that we will queue up.
|
||
|
//
|
||
|
WORK_QUEUE_ITEM Item;
|
||
|
|
||
|
//
|
||
|
// The device object --- we need to have a reference back to ourself
|
||
|
//
|
||
|
PDEVICE_OBJECT DeviceObject;
|
||
|
|
||
|
//
|
||
|
// The Start Irp
|
||
|
//
|
||
|
PIRP Irp;
|
||
|
|
||
|
} WORK_QUEUE_CONTEXT, *PWORK_QUEUE_CONTEXT;
|
||
|
|
||
|
|
||
|
typedef struct _FDO_DEVICE_EXTENSION {
|
||
|
|
||
|
//
|
||
|
// Must be first. Must match up with the structure that we will put in the
|
||
|
// Union that will allow the driver to "know" where the item is, regardless
|
||
|
// of what the device extension type is
|
||
|
//
|
||
|
WORK_QUEUE_CONTEXT WorkContext;
|
||
|
|
||
|
//
|
||
|
// Location of our Interrupt Object
|
||
|
//
|
||
|
PKINTERRUPT InterruptObject;
|
||
|
|
||
|
//
|
||
|
// Pending PM1 status bits which need handled
|
||
|
//
|
||
|
union {
|
||
|
ULONG Pm1Status;
|
||
|
struct {
|
||
|
ULONG Tmr_Sts:1;
|
||
|
ULONG Reserved1:3;
|
||
|
ULONG Bm_Sts:1;
|
||
|
ULONG Gbl_Sts:1;
|
||
|
ULONG Reserved2:2;
|
||
|
ULONG PwrBtn_Sts:1;
|
||
|
ULONG SlpBtn_Sts:1;
|
||
|
ULONG Rtc_Sts:1;
|
||
|
ULONG Reserved3:4;
|
||
|
ULONG Wak_Sts:1;
|
||
|
ULONG Gpe_Sts:1;
|
||
|
ULONG Reserved4:14;
|
||
|
ULONG Dpc_Sts:1;
|
||
|
} UPm1Status;
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// The storage for our DPC object
|
||
|
//
|
||
|
KDPC InterruptDpc;
|
||
|
|
||
|
} FDO_DEVICE_EXTENSION, *PFDO_DEVICE_EXTENSION;
|
||
|
|
||
|
typedef struct _PDO_DEVICE_EXTENSION {
|
||
|
|
||
|
//
|
||
|
// Must be first. Must match up with the structure that we will put in the
|
||
|
// Union that will allow the driver to "know" where the item is, regardless
|
||
|
// of what the device extension type is
|
||
|
//
|
||
|
WORK_QUEUE_CONTEXT WorkContext;
|
||
|
|
||
|
} PDO_DEVICE_EXTENSION, *PPDO_DEVICE_EXTENSION;
|
||
|
|
||
|
typedef struct _FILTER_DEVICE_EXTENSION {
|
||
|
|
||
|
//
|
||
|
// Must be first. Must match up with the structure that we will put in the
|
||
|
// Union that will allow the driver to "know" where the item is, regardless
|
||
|
// of what the device extension type is
|
||
|
//
|
||
|
WORK_QUEUE_CONTEXT WorkContext;
|
||
|
|
||
|
//
|
||
|
// The interfaces that we kick out
|
||
|
//
|
||
|
PBUS_INTERFACE_STANDARD Interface;
|
||
|
|
||
|
} FILTER_DEVICE_EXTENSION, *PFILTER_DEVICE_EXTENSION;
|
||
|
|
||
|
//
|
||
|
// This is the structure that gets used when we want to pass events
|
||
|
// to and from the worker queue
|
||
|
//
|
||
|
typedef struct {
|
||
|
ULONG PendingEvents;
|
||
|
LIST_ENTRY Link;
|
||
|
} EXTENSION_WORKER, *PEXTENSION_WORKER;
|
||
|
|
||
|
//
|
||
|
// This is the extension that is used for button
|
||
|
//
|
||
|
typedef struct {
|
||
|
|
||
|
//
|
||
|
// Must be first to match up with the EXTENSION_WORKER that we put into
|
||
|
// the UNION that this structure also goes in. Ensures that the worker
|
||
|
// thread code knows where the WorkQueue for all of the subextensions
|
||
|
//
|
||
|
EXTENSION_WORKER WorkQueue;
|
||
|
|
||
|
//
|
||
|
// Lock to protect button accesses
|
||
|
//
|
||
|
KSPIN_LOCK SpinLock;
|
||
|
|
||
|
//
|
||
|
// Current Lid State (Pushed or Not)
|
||
|
//
|
||
|
BOOLEAN LidState;
|
||
|
|
||
|
//
|
||
|
// Current Events, Wake/Power/Sleep
|
||
|
//
|
||
|
union {
|
||
|
ULONG Events;
|
||
|
struct {
|
||
|
ULONG Power_Button:1;
|
||
|
ULONG Sleep_Button:1;
|
||
|
ULONG Lid_Switch:1;
|
||
|
ULONG Reserved:28;
|
||
|
ULONG Wake_Capable:1;
|
||
|
} UEvents;
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// What the button is capable of reporting
|
||
|
//
|
||
|
union {
|
||
|
ULONG Capabilities;
|
||
|
struct {
|
||
|
ULONG Power_Button:1;
|
||
|
ULONG Sleep_Button:1;
|
||
|
ULONG Lid_Switch:1;
|
||
|
ULONG Reserved:28;
|
||
|
ULONG Wake_Capable:1;
|
||
|
} UCapabilities;
|
||
|
};
|
||
|
|
||
|
} BUTTON_EXTENSION, *PBUTTON_EXTENSION;
|
||
|
|
||
|
//
|
||
|
// This is the structure that is used for Thermal Zones
|
||
|
//
|
||
|
typedef struct {
|
||
|
|
||
|
//
|
||
|
// Must be first to match up with the EXTENSION_WORKER that we put into
|
||
|
// the UNION that this structure also goes in. Ensures that the worker
|
||
|
// thread code knows where the WorkQueue for all of the subextensions
|
||
|
//
|
||
|
EXTENSION_WORKER WorkQueue;
|
||
|
|
||
|
//
|
||
|
// Lock to protect thermal zone accesses
|
||
|
//
|
||
|
KSPIN_LOCK SpinLock;
|
||
|
|
||
|
//
|
||
|
// Current State of the thermal zone
|
||
|
//
|
||
|
union {
|
||
|
ULONG Flags;
|
||
|
struct {
|
||
|
ULONG Cooling:1;
|
||
|
ULONG Temp:1;
|
||
|
ULONG Trip:1;
|
||
|
ULONG Mode:1;
|
||
|
ULONG Init:1;
|
||
|
ULONG Reserved:24;
|
||
|
ULONG Wait:1;
|
||
|
ULONG Busy:1;
|
||
|
ULONG Loop:1;
|
||
|
} UFlags;
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// Points to the Thermal Information Structure that contains the real
|
||
|
// information
|
||
|
//
|
||
|
PVOID Info;
|
||
|
|
||
|
//
|
||
|
// WMI Context Information Pointer
|
||
|
//
|
||
|
PWMILIB_CONTEXT WmilibContext;
|
||
|
|
||
|
} THERMAL_EXTENSION, *PTHERMAL_EXTENSION;
|
||
|
|
||
|
//
|
||
|
// This is the structure that is used for Link Nodes
|
||
|
//
|
||
|
typedef struct {
|
||
|
|
||
|
//
|
||
|
// Must be first to match up with the EXTENSION_WORKER that we put into
|
||
|
// the UNION that this structure also goes in. Ensures that the worker
|
||
|
// thread code knows where the WorkQueue for all of the subextensions
|
||
|
//
|
||
|
EXTENSION_WORKER WorkQueue; // must be first
|
||
|
|
||
|
//
|
||
|
// To quickly allow the link nodes to be searched, they are linked together
|
||
|
// regardless of their real location in the tree
|
||
|
//
|
||
|
LIST_ENTRY List;
|
||
|
|
||
|
//
|
||
|
// Usage count on the link nodes
|
||
|
//
|
||
|
ULONG ReferenceCount;
|
||
|
|
||
|
//
|
||
|
// Working reference count
|
||
|
//
|
||
|
LONG TempRefCount;
|
||
|
PNSOBJ NameSpaceObject; // Obsolete
|
||
|
|
||
|
//
|
||
|
// The IRQ that the link node is using
|
||
|
//
|
||
|
ULONGLONG CurrentIrq;
|
||
|
|
||
|
//
|
||
|
// State flags - Shared/Exclusive, Level/Edge
|
||
|
//
|
||
|
UCHAR Flags;
|
||
|
|
||
|
} LINK_NODE_EXTENSION, *PLINK_NODE_EXTENSION;
|
||
|
|
||
|
//
|
||
|
// This enum covers the various states of a _DCK device.
|
||
|
//
|
||
|
typedef enum {
|
||
|
|
||
|
IS_UNKNOWN,
|
||
|
IS_ISOLATED,
|
||
|
IS_ISOLATION_DROPPED
|
||
|
|
||
|
} ISOLATION_STATE, *PISOLATION_STATE;
|
||
|
|
||
|
//
|
||
|
// This is the structure that is used for Dock's
|
||
|
//
|
||
|
typedef struct {
|
||
|
|
||
|
//
|
||
|
// Must be first to match up with the EXTENSION_WORKER that we put into
|
||
|
// the UNION that this structure also goes in. Ensures that the worker
|
||
|
// thread code knows where the WorkQueue for all of the subextensions
|
||
|
//
|
||
|
EXTENSION_WORKER WorkQueue;
|
||
|
|
||
|
//
|
||
|
// This is the corresponding ACPI extension for the device
|
||
|
//
|
||
|
PDEVICE_EXTENSION CorrospondingAcpiDevice;
|
||
|
|
||
|
//
|
||
|
// This is how (or more properly when) to handle profile changes
|
||
|
//
|
||
|
PROFILE_DEPARTURE_STYLE ProfileDepartureStyle;
|
||
|
|
||
|
//
|
||
|
// Reference count for the dock interface
|
||
|
//
|
||
|
ULONG InterfaceReferenceCount;
|
||
|
|
||
|
//
|
||
|
// Current state of isolation.
|
||
|
//
|
||
|
ISOLATION_STATE IsolationState;
|
||
|
|
||
|
} DOCK_EXTENSION, *PDOCK_EXTENSION;
|
||
|
|
||
|
typedef struct _PROCESSOR_DEVICE_EXTENSION {
|
||
|
|
||
|
//
|
||
|
// Must be first. Must match up with the structure that we will put in the
|
||
|
// Union that will allow the driver to "know" where the item is, regardless
|
||
|
// of what the device extension type is
|
||
|
//
|
||
|
EXTENSION_WORKER WorkQueue;
|
||
|
|
||
|
//
|
||
|
// Points to the Compatible ID of the device
|
||
|
//
|
||
|
PUCHAR CompatibleID;
|
||
|
|
||
|
//
|
||
|
// This is the index in the ProcessorList for this processor
|
||
|
//
|
||
|
ULONG ProcessorIndex;
|
||
|
|
||
|
} PROCESSOR_DEVICE_EXTENSION, *PPROCESSOR_DEVICE_EXTENSION;
|
||
|
|
||
|
//
|
||
|
// The Device Extension Structure
|
||
|
//
|
||
|
struct _DEVICE_EXTENSION {
|
||
|
|
||
|
//
|
||
|
// Common flags
|
||
|
//
|
||
|
union {
|
||
|
|
||
|
//
|
||
|
// Make sure that these two elements stay in sync
|
||
|
//
|
||
|
ULONGLONG Flags;
|
||
|
struct {
|
||
|
ULONGLONG Type_Never_Present:1;
|
||
|
ULONGLONG Type_Not_Present:1;
|
||
|
ULONGLONG Type_Removed:1;
|
||
|
ULONGLONG Type_Not_Found:1;
|
||
|
ULONGLONG Type_Fdo:1;
|
||
|
ULONGLONG Type_Pdo:1;
|
||
|
ULONGLONG Type_Filter:1;
|
||
|
ULONGLONG Type_Surprise_Removed:1;
|
||
|
ULONGLONG Type_Not_Enumerated:1;
|
||
|
ULONGLONG Reserved1:7;
|
||
|
ULONGLONG Cap_Wake:1;
|
||
|
ULONGLONG Cap_Raw:1;
|
||
|
ULONGLONG Cap_Button:1;
|
||
|
ULONGLONG Cap_Always_PS0:1;
|
||
|
ULONGLONG Cap_No_Filter:1;
|
||
|
ULONGLONG Cap_No_Stop:1;
|
||
|
ULONGLONG Cap_No_Override:1;
|
||
|
ULONGLONG Cap_ISA:1;
|
||
|
ULONGLONG Cap_EIO:1;
|
||
|
ULONGLONG Cap_PCI:1;
|
||
|
ULONGLONG Cap_Serial:1;
|
||
|
ULONGLONG Cap_Thermal_Zone:1;
|
||
|
ULONGLONG Cap_LinkNode:1;
|
||
|
ULONGLONG Cap_No_Show_in_UI:1;
|
||
|
ULONGLONG Cap_Never_show_in_UI:1;
|
||
|
ULONGLONG Cap_Start_in_D3:1;
|
||
|
ULONGLONG Cap_PCI_Device:1;
|
||
|
ULONGLONG Cap_PIC_Device:1;
|
||
|
ULONGLONG Cap_Unattached_Dock:1;
|
||
|
ULONGLONG Cap_No_Disable_Wake:1;
|
||
|
ULONGLONG Cap_Processor:1;
|
||
|
ULONGLONG Cap_Container:1;
|
||
|
ULONGLONG Cap_PCI_Bar_Target:1;
|
||
|
ULONGLONG Cap_No_Remove_or_Eject:1;
|
||
|
ULONGLONG Reserved2:1;
|
||
|
ULONGLONG Prop_Rebuild_Children:1;
|
||
|
ULONGLONG Prop_Invalid_Relations:1;
|
||
|
ULONGLONG Prop_Unloading:1;
|
||
|
ULONGLONG Prop_Address:1;
|
||
|
ULONGLONG Prop_HID:1;
|
||
|
ULONGLONG Prop_UID:1;
|
||
|
ULONGLONG Prop_Fixed_HID:1;
|
||
|
ULONGLONG Prop_Fixed_UID:1;
|
||
|
ULONGLONG Prop_Failed_Init:1;
|
||
|
ULONGLONG Prop_Srs_Present:1;
|
||
|
ULONGLONG Prop_No_Object:1;
|
||
|
ULONGLONG Prop_Exclusive:1;
|
||
|
ULONGLONG Prop_Ran_INI:1;
|
||
|
ULONGLONG Prop_Device_Enabled:1;
|
||
|
ULONGLONG Prop_Device_Failed:1;
|
||
|
ULONGLONG Prop_Acpi_Power:1;
|
||
|
ULONGLONG Prop_Dock:1;
|
||
|
ULONGLONG Prop_Built_Power_Table:1;
|
||
|
ULONGLONG Prop_Has_PME:1;
|
||
|
ULONGLONG Prop_No_Lid_Action:1;
|
||
|
ULONGLONG Prop_Fixed_Address:1;
|
||
|
ULONGLONG Prop_Callback:1;
|
||
|
ULONGLONG Prop_Fixed_CiD:1;
|
||
|
} UFlags;
|
||
|
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// Signature Block
|
||
|
//
|
||
|
ULONG Signature;
|
||
|
|
||
|
//
|
||
|
// Debug Flags
|
||
|
//
|
||
|
ULONG DebugFlags;
|
||
|
|
||
|
//
|
||
|
// Primary irp handlers
|
||
|
//
|
||
|
PIRP_DISPATCH_TABLE DispatchTable;
|
||
|
|
||
|
//
|
||
|
// Note that we cannot have these 2 structures in the 2nd nameless union
|
||
|
// because these structures are basically used by all devices
|
||
|
//
|
||
|
union {
|
||
|
|
||
|
//
|
||
|
// Start device context
|
||
|
//
|
||
|
WORK_QUEUE_CONTEXT WorkContext;
|
||
|
|
||
|
//
|
||
|
// Contains Fdo Specific information
|
||
|
//
|
||
|
FDO_DEVICE_EXTENSION Fdo;
|
||
|
|
||
|
//
|
||
|
// Contains Filter Specific information
|
||
|
//
|
||
|
FILTER_DEVICE_EXTENSION Filter;
|
||
|
|
||
|
//
|
||
|
// Contains PDO specific information
|
||
|
//
|
||
|
PDO_DEVICE_EXTENSION Pdo;
|
||
|
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// Union of those structures that are device type dependent
|
||
|
//
|
||
|
union {
|
||
|
|
||
|
//
|
||
|
// Common device worker queue structure for device types
|
||
|
// which use them
|
||
|
//
|
||
|
EXTENSION_WORKER WorkQueue;
|
||
|
|
||
|
//
|
||
|
// Contains internal button device information
|
||
|
//
|
||
|
BUTTON_EXTENSION Button;
|
||
|
|
||
|
//
|
||
|
// Contains internal thermal device information
|
||
|
//
|
||
|
THERMAL_EXTENSION Thermal;
|
||
|
|
||
|
//
|
||
|
// Contains the information for a link node
|
||
|
//
|
||
|
LINK_NODE_EXTENSION LinkNode;
|
||
|
|
||
|
//
|
||
|
// Contains dock information (such as the extension of the acpi object
|
||
|
// this node represents)
|
||
|
//
|
||
|
DOCK_EXTENSION Dock;
|
||
|
|
||
|
//
|
||
|
// Contains the information about the processor device
|
||
|
//
|
||
|
PROCESSOR_DEVICE_EXTENSION Processor;
|
||
|
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// Device State Flags
|
||
|
//
|
||
|
ACPI_DEVICE_STATE DeviceState;
|
||
|
|
||
|
//
|
||
|
// Previous State Flags (for the Cancel routines)
|
||
|
//
|
||
|
ACPI_DEVICE_STATE PreviousState;
|
||
|
|
||
|
//
|
||
|
// Power Information about the device
|
||
|
//
|
||
|
ACPI_POWER_INFO PowerInfo;
|
||
|
|
||
|
//
|
||
|
// Pointer to a built-up string that represents the
|
||
|
// Device ID or the device address. The flags determine
|
||
|
// which of the following should be used
|
||
|
//
|
||
|
union {
|
||
|
PUCHAR DeviceID;
|
||
|
ULONG Address;
|
||
|
};
|
||
|
|
||
|
//
|
||
|
// The instance ID of this device
|
||
|
//
|
||
|
PUCHAR InstanceID;
|
||
|
|
||
|
//
|
||
|
// The resource list that received
|
||
|
//
|
||
|
PCM_RESOURCE_LIST ResourceList;
|
||
|
|
||
|
//
|
||
|
// The resource list that we output
|
||
|
//
|
||
|
POBJDATA PnpResourceList;
|
||
|
|
||
|
//
|
||
|
// Outstanding IRP Reference Counts ...
|
||
|
//
|
||
|
LONG OutstandingIrpCount;
|
||
|
|
||
|
//
|
||
|
// This is the number of outstanding references to this device extension
|
||
|
// When this drops to zero, the memory may be freed. Each child object
|
||
|
// counts for one reference, as does the associated device object and
|
||
|
// name space object.
|
||
|
//
|
||
|
LONG ReferenceCount;
|
||
|
|
||
|
//
|
||
|
// This is the number of outstanding Hibernate Path notifications on the
|
||
|
// the device
|
||
|
//
|
||
|
LONG HibernatePathCount;
|
||
|
|
||
|
//
|
||
|
// Synchronization Event for our use. Lets us know when a remove occurs.
|
||
|
//
|
||
|
PKEVENT RemoveEvent;
|
||
|
|
||
|
//
|
||
|
// Points to the associated ACPI-Name-space object
|
||
|
//
|
||
|
PNSOBJ AcpiObject;
|
||
|
|
||
|
//
|
||
|
// This is the device object that we are linked to
|
||
|
//
|
||
|
PDEVICE_OBJECT DeviceObject;
|
||
|
|
||
|
//
|
||
|
// This is the driver object we send requests onto
|
||
|
//
|
||
|
PDEVICE_OBJECT TargetDeviceObject;
|
||
|
|
||
|
//
|
||
|
// This is the driver object just below us.
|
||
|
//
|
||
|
PDEVICE_OBJECT PhysicalDeviceObject;
|
||
|
|
||
|
//
|
||
|
// This is our Parent
|
||
|
//
|
||
|
struct _DEVICE_EXTENSION *ParentExtension;
|
||
|
|
||
|
//
|
||
|
// This points to our first child
|
||
|
//
|
||
|
LIST_ENTRY ChildDeviceList;
|
||
|
|
||
|
//
|
||
|
// This points to our next sibling
|
||
|
//
|
||
|
LIST_ENTRY SiblingDeviceList;
|
||
|
|
||
|
//
|
||
|
// This is a list of devices that will be ejected when this device is
|
||
|
//
|
||
|
LIST_ENTRY EjectDeviceHead;
|
||
|
|
||
|
//
|
||
|
// The ejection list is threaded through this entry.
|
||
|
//
|
||
|
LIST_ENTRY EjectDeviceList;
|
||
|
} ;
|
||
|
|
||
|
//
|
||
|
// DEVICE_EXTENSION.Flags
|
||
|
// These are the ones that specify which type of object the current
|
||
|
// extension represents. As you tell, they are not quite mutually exclusive
|
||
|
//
|
||
|
// The difference between the NOT_FOUND, NOT_PRESENT, and NEVER_PRESENT is
|
||
|
//
|
||
|
// NOT_FOUND is used to determine if we have build a PDO/FDO whatever.
|
||
|
// the NOT_FOUND flag is set on an attach or devobj create, and
|
||
|
// is cleared during a devobj delete or in response to a surprise
|
||
|
// remove IRP.
|
||
|
//
|
||
|
// NOT_PRESENT means that the isn't currently present as determined by the
|
||
|
// _STA method in the hardware.
|
||
|
//
|
||
|
// NEVER_PRESENT means that the device will always be NOT_PRESENT
|
||
|
// regardless of what the _STA says
|
||
|
//
|
||
|
// The difference between an extension that has been REMOVED and one that has
|
||
|
// been SURPRISE_REMOVED is that there is a dummy extension for the
|
||
|
// SURPRISE_REMOVED case that replaces the original device extension pointer
|
||
|
// in the device object. This new extension gets the SURPRISE_REMOVED flag, so
|
||
|
// that people know that there is an original extension behind it.
|
||
|
//
|
||
|
//
|
||
|
#define DEV_TYPE_NEVER_PRESENT 0x0000000000000001
|
||
|
#define DEV_TYPE_NOT_PRESENT 0x0000000000000002
|
||
|
#define DEV_TYPE_REMOVED 0x0000000000000004
|
||
|
#define DEV_TYPE_NOT_FOUND 0x0000000000000008
|
||
|
#define DEV_TYPE_FDO 0x0000000000000010
|
||
|
#define DEV_TYPE_PDO 0x0000000000000020
|
||
|
#define DEV_TYPE_FILTER 0x0000000000000040
|
||
|
#define DEV_TYPE_SURPRISE_REMOVED 0x0000000000000080
|
||
|
#define DEV_TYPE_NOT_ENUMERATED 0x0000000000000100
|
||
|
|
||
|
//
|
||
|
// These are the capabilities of the device
|
||
|
//
|
||
|
#define DEV_CAP_WAKE 0x0000000000010000
|
||
|
#define DEV_CAP_RAW 0x0000000000020000
|
||
|
#define DEV_CAP_BUTTON 0x0000000000040000
|
||
|
#define DEV_CAP_ALWAYS_PS0 0x0000000000080000
|
||
|
#define DEV_CAP_NO_FILTER 0x0000000000100000
|
||
|
#define DEV_CAP_NO_STOP 0x0000000000200000
|
||
|
#define DEV_CAP_NO_OVERRIDE 0x0000000000400000
|
||
|
#define DEV_CAP_ISA 0x0000000000800000
|
||
|
#define DEV_CAP_EIO 0x0000000001000000
|
||
|
#define DEV_CAP_PCI 0x0000000002000000
|
||
|
#define DEV_CAP_SERIAL 0x0000000004000000
|
||
|
#define DEV_CAP_THERMAL_ZONE 0x0000000008000000
|
||
|
#define DEV_CAP_LINK_NODE 0x0000000010000000
|
||
|
#define DEV_CAP_NO_SHOW_IN_UI 0x0000000020000000
|
||
|
#define DEV_CAP_NEVER_SHOW_IN_UI 0x0000000040000000
|
||
|
#define DEV_CAP_START_IN_D3 0x0000000080000000
|
||
|
#define DEV_CAP_PCI_DEVICE 0x0000000100000000
|
||
|
#define DEV_CAP_PIC_DEVICE 0x0000000200000000
|
||
|
#define DEV_CAP_UNATTACHED_DOCK 0x0000000400000000
|
||
|
#define DEV_CAP_NO_DISABLE_WAKE 0x0000000800000000
|
||
|
#define DEV_CAP_PROCESSOR 0x0000001000000000
|
||
|
#define DEV_CAP_CONTAINER 0x0000002000000000
|
||
|
#define DEV_CAP_PCI_BAR_TARGET 0x0000004000000000
|
||
|
#define DEV_CAP_NO_REMOVE_OR_EJECT 0x0000008000000000
|
||
|
|
||
|
//
|
||
|
// These are the properties of the device
|
||
|
//
|
||
|
#define DEV_PROP_REBUILD_CHILDREN 0x0000020000000000
|
||
|
#define DEV_PROP_INVALID_RELATIONS 0x0000040000000000
|
||
|
#define DEV_PROP_UNLOADING 0x0000080000000000
|
||
|
#define DEV_PROP_ADDRESS 0x0000100000000000
|
||
|
#define DEV_PROP_HID 0x0000200000000000
|
||
|
#define DEV_PROP_UID 0x0000400000000000
|
||
|
#define DEV_PROP_FIXED_HID 0x0000800000000000
|
||
|
#define DEV_PROP_FIXED_UID 0x0001000000000000
|
||
|
#define DEV_PROP_FAILED_INIT 0x0002000000000000
|
||
|
#define DEV_PROP_SRS_PRESENT 0x0004000000000000
|
||
|
#define DEV_PROP_NO_OBJECT 0x0008000000000000
|
||
|
#define DEV_PROP_EXCLUSIVE 0x0010000000000000
|
||
|
#define DEV_PROP_RAN_INI 0x0020000000000000
|
||
|
#define DEV_PROP_DEVICE_ENABLED 0x0040000000000000
|
||
|
#define DEV_PROP_DEVICE_FAILED 0x0080000000000000
|
||
|
#define DEV_PROP_ACPI_POWER 0x0100000000000000
|
||
|
#define DEV_PROP_DOCK 0x0200000000000000
|
||
|
#define DEV_PROP_BUILT_POWER_TABLE 0x0400000000000000
|
||
|
#define DEV_PROP_HAS_PME 0x0800000000000000
|
||
|
#define DEV_PROP_NO_LID_ACTION 0x1000000000000000
|
||
|
#define DEV_PROP_FIXED_ADDRESS 0x2000000000000000
|
||
|
#define DEV_PROP_CALLBACK 0x4000000000000000
|
||
|
#define DEV_PROP_FIXED_CID 0x8000000000000000
|
||
|
|
||
|
//
|
||
|
// This mask should be used to obtain just unique type bytes
|
||
|
//
|
||
|
#define DEV_MASK_TYPE 0x00000000000001FF
|
||
|
#define DEV_MASK_CAP 0xFFFFFFFFFFFF0000
|
||
|
#define DEV_MASK_UID (DEV_PROP_UID | DEV_PROP_FIXED_UID)
|
||
|
#define DEV_MASK_HID (DEV_PROP_HID | DEV_PROP_FIXED_HID)
|
||
|
#define DEV_MASK_ADDRESS (DEV_PROP_ADDRESS | DEV_PROP_FIXED_ADDRESS)
|
||
|
#define DEV_MASK_NOT_PRESENT (DEV_TYPE_NOT_PRESENT | DEV_PROP_FAILED_INIT)
|
||
|
#define DEV_MASK_BUS (DEV_CAP_ISA | DEV_CAP_PCI | DEV_CAP_EIO)
|
||
|
#define DEV_MASK_INTERNAL_DEVICE (DEV_CAP_NO_FILTER | DEV_CAP_NO_STOP | \
|
||
|
DEV_PROP_EXCLUSIVE)
|
||
|
#define DEV_MASK_THERMAL (DEV_CAP_NO_FILTER | DEV_PROP_EXCLUSIVE)
|
||
|
#define DEV_MASK_INTERNAL_BUS (DEV_CAP_RAW | DEV_CAP_NO_FILTER)
|
||
|
#define DEV_MASK_PCI (DEV_CAP_PCI | DEV_CAP_PCI_DEVICE)
|
||
|
#define DEV_MASK_PRESERVE (DEV_CAP_PCI_BAR_TARGET)
|
||
|
|
||
|
//
|
||
|
// DEVICE_EXTENSION.DebugFlags
|
||
|
//
|
||
|
#define DEVDBG_EJECTOR_FOUND 0x00000001
|
||
|
|
||
|
//
|
||
|
// This is the acpi device extension signature
|
||
|
//
|
||
|
#define ACPI_SIGNATURE 0x5f534750
|
||
|
|
||
|
//
|
||
|
// These are the pooltag signatures
|
||
|
//
|
||
|
#define ACPI_ARBITER_POOLTAG 'ApcA'
|
||
|
#define ACPI_BUFFER_POOLTAG 'BpcA'
|
||
|
#define ACPI_DEVICE_POOLTAG 'DpcA'
|
||
|
#define ACPI_INTERFACE_POOLTAG 'FpcA'
|
||
|
#define ACPI_IRP_POOLTAG 'IpcA'
|
||
|
#define ACPI_MISC_POOLTAG 'MpcA'
|
||
|
#define ACPI_POWER_POOLTAG 'PpcA'
|
||
|
#define ACPI_OBJECT_POOLTAG 'OpcA'
|
||
|
#define ACPI_RESOURCE_POOLTAG 'RpcA'
|
||
|
#define ACPI_STRING_POOLTAG 'SpcA'
|
||
|
#define ACPI_THERMAL_POOLTAG 'TpcA'
|
||
|
#define ACPI_TRANSLATE_POOLTAG 'XpcA'
|
||
|
|
||
|
//
|
||
|
// ACPI Override Attributes
|
||
|
//
|
||
|
#define ACPI_OVERRIDE_NVS_CHECK 0x00000001
|
||
|
#define ACPI_OVERRIDE_STA_CHECK 0x00000002
|
||
|
#define ACPI_OVERRIDE_MP_SLEEP 0x00000004
|
||
|
#define ACPI_OVERRIDE_OPTIONAL_WAKE 0x00000008
|
||
|
#define ACPI_OVERRIDE_DISABLE_S1 0x00000010
|
||
|
#define ACPI_OVERRIDE_DISABLE_S2 0x00000020
|
||
|
#define ACPI_OVERRIDE_DISABLE_S3 0x00000040
|
||
|
#endif
|