1129 lines
27 KiB
C
1129 lines
27 KiB
C
/*++ BUILD Version: 0001 // Increment this if a change has global effects
|
|
|
|
Copyright (c) 1995 Microsoft Corporation
|
|
|
|
Module Name:
|
|
pnp.h
|
|
|
|
Abstract:
|
|
|
|
This module contains the internal structure definitions and APIs used by
|
|
the kernel-mode Plug and Play manager.
|
|
|
|
This file is included by including "ntos.h".
|
|
|
|
Author:
|
|
Lonny McMichael (lonnym) 02/09/95
|
|
*/
|
|
|
|
#ifndef _PNP_
|
|
#define _PNP_
|
|
|
|
|
|
// The following global variables provide/control access to PnP Manager data.
|
|
|
|
// NOTE: If both registry AND bus list resources are required, then the
|
|
// bus list resource (PpBusResource) must be acquired FIRST.
|
|
|
|
|
|
extern ERESOURCE PpRegistryDeviceResource;
|
|
extern PDRIVER_OBJECT IoPnpDriverObject;
|
|
|
|
// begin_ntddk begin_nthal begin_ntifs begin_wdm
|
|
|
|
|
|
// Define PnP Device Property for IoGetDeviceProperty
|
|
|
|
|
|
typedef enum {
|
|
DevicePropertyDeviceDescription,
|
|
DevicePropertyHardwareID,
|
|
DevicePropertyCompatibleIDs,
|
|
DevicePropertyBootConfiguration,
|
|
DevicePropertyBootConfigurationTranslated,
|
|
DevicePropertyClassName,
|
|
DevicePropertyClassGuid,
|
|
DevicePropertyDriverKeyName,
|
|
DevicePropertyManufacturer,
|
|
DevicePropertyFriendlyName,
|
|
DevicePropertyLocationInformation,
|
|
DevicePropertyPhysicalDeviceObjectName,
|
|
DevicePropertyBusTypeGuid,
|
|
DevicePropertyLegacyBusType,
|
|
DevicePropertyBusNumber,
|
|
DevicePropertyEnumeratorName,
|
|
DevicePropertyAddress,
|
|
DevicePropertyUINumber
|
|
} DEVICE_REGISTRY_PROPERTY;
|
|
|
|
typedef BOOLEAN (*PTRANSLATE_BUS_ADDRESS)(
|
|
IN PVOID Context,
|
|
IN PHYSICAL_ADDRESS BusAddress,
|
|
IN ULONG Length,
|
|
IN OUT PULONG AddressSpace,
|
|
OUT PPHYSICAL_ADDRESS TranslatedAddress
|
|
);
|
|
|
|
typedef struct _DMA_ADAPTER *(*PGET_DMA_ADAPTER)(
|
|
IN PVOID Context,
|
|
IN struct _DEVICE_DESCRIPTION *DeviceDescriptor,
|
|
OUT PULONG NumberOfMapRegisters
|
|
);
|
|
|
|
typedef ULONG (*PGET_SET_DEVICE_DATA)(
|
|
IN PVOID Context,
|
|
IN ULONG DataType,
|
|
IN PVOID Buffer,
|
|
IN ULONG Offset,
|
|
IN ULONG Length
|
|
);
|
|
|
|
|
|
// Define structure returned in response to IRP_MN_QUERY_BUS_INFORMATION by a
|
|
// PDO indicating the type of bus the device exists on.
|
|
|
|
|
|
typedef struct _PNP_BUS_INFORMATION {
|
|
GUID BusTypeGuid;
|
|
INTERFACE_TYPE LegacyBusType;
|
|
ULONG BusNumber;
|
|
} PNP_BUS_INFORMATION, *PPNP_BUS_INFORMATION;
|
|
|
|
|
|
// Define structure returned in response to IRP_MN_QUERY_LEGACY_BUS_INFORMATION
|
|
// by an FDO indicating the type of bus it is. This is normally the same bus
|
|
// type as the device's children (i.e., as retrieved from the child PDO's via
|
|
// IRP_MN_QUERY_BUS_INFORMATION) except for cases like CardBus, which can
|
|
// support both 16-bit (PCMCIABus) and 32-bit (PCIBus) cards.
|
|
|
|
|
|
typedef struct _LEGACY_BUS_INFORMATION {
|
|
GUID BusTypeGuid;
|
|
INTERFACE_TYPE LegacyBusType;
|
|
ULONG BusNumber;
|
|
} LEGACY_BUS_INFORMATION, *PLEGACY_BUS_INFORMATION;
|
|
|
|
typedef struct _BUS_INTERFACE_STANDARD {
|
|
|
|
// generic interface header
|
|
|
|
USHORT Size;
|
|
USHORT Version;
|
|
PVOID Context;
|
|
PINTERFACE_REFERENCE InterfaceReference;
|
|
PINTERFACE_DEREFERENCE InterfaceDereference;
|
|
|
|
// standard bus interfaces
|
|
|
|
PTRANSLATE_BUS_ADDRESS TranslateBusAddress;
|
|
PGET_DMA_ADAPTER GetDmaAdapter;
|
|
PGET_SET_DEVICE_DATA SetBusData;
|
|
PGET_SET_DEVICE_DATA GetBusData;
|
|
|
|
} BUS_INTERFACE_STANDARD, *PBUS_INTERFACE_STANDARD;
|
|
|
|
|
|
// The following definitions are used in ACPI QueryInterface
|
|
|
|
typedef BOOLEAN (* PGPE_SERVICE_ROUTINE) (
|
|
PVOID,
|
|
PVOID);
|
|
|
|
typedef NTSTATUS (* PGPE_CONNECT_VECTOR) (
|
|
PDEVICE_OBJECT,
|
|
ULONG,
|
|
KINTERRUPT_MODE,
|
|
BOOLEAN,
|
|
PGPE_SERVICE_ROUTINE,
|
|
PVOID,
|
|
PVOID);
|
|
|
|
typedef NTSTATUS (* PGPE_DISCONNECT_VECTOR) (
|
|
PVOID);
|
|
|
|
typedef NTSTATUS (* PGPE_ENABLE_EVENT) (
|
|
PDEVICE_OBJECT,
|
|
PVOID);
|
|
|
|
typedef NTSTATUS (* PGPE_DISABLE_EVENT) (
|
|
PDEVICE_OBJECT,
|
|
PVOID);
|
|
|
|
typedef NTSTATUS (* PGPE_CLEAR_STATUS) (
|
|
PDEVICE_OBJECT,
|
|
PVOID);
|
|
|
|
typedef VOID (* PDEVICE_NOTIFY_CALLBACK) (
|
|
PVOID,
|
|
ULONG);
|
|
|
|
typedef NTSTATUS (* PREGISTER_FOR_DEVICE_NOTIFICATIONS) (
|
|
PDEVICE_OBJECT,
|
|
PDEVICE_NOTIFY_CALLBACK,
|
|
PVOID);
|
|
|
|
typedef void (* PUNREGISTER_FOR_DEVICE_NOTIFICATIONS) (
|
|
PDEVICE_OBJECT,
|
|
PDEVICE_NOTIFY_CALLBACK);
|
|
|
|
typedef struct _ACPI_INTERFACE_STANDARD {
|
|
|
|
// Generic interface header
|
|
|
|
USHORT Size;
|
|
USHORT Version;
|
|
PVOID Context;
|
|
PINTERFACE_REFERENCE InterfaceReference;
|
|
PINTERFACE_DEREFERENCE InterfaceDereference;
|
|
|
|
// ACPI interfaces
|
|
|
|
PGPE_CONNECT_VECTOR GpeConnectVector;
|
|
PGPE_DISCONNECT_VECTOR GpeDisconnectVector;
|
|
PGPE_ENABLE_EVENT GpeEnableEvent;
|
|
PGPE_DISABLE_EVENT GpeDisableEvent;
|
|
PGPE_CLEAR_STATUS GpeClearStatus;
|
|
PREGISTER_FOR_DEVICE_NOTIFICATIONS RegisterForDeviceNotifications;
|
|
PUNREGISTER_FOR_DEVICE_NOTIFICATIONS UnregisterForDeviceNotifications;
|
|
|
|
} ACPI_INTERFACE_STANDARD, *PACPI_INTERFACE_STANDARD;
|
|
|
|
// end_wdm
|
|
|
|
typedef enum _ACPI_REG_TYPE {
|
|
PM1a_ENABLE,
|
|
PM1b_ENABLE,
|
|
PM1a_STATUS,
|
|
PM1b_STATUS,
|
|
PM1a_CONTROL,
|
|
PM1b_CONTROL,
|
|
GP_STATUS,
|
|
GP_ENABLE,
|
|
SMI_CMD,
|
|
MaxRegType
|
|
} ACPI_REG_TYPE, *PACPI_REG_TYPE;
|
|
|
|
typedef USHORT (*PREAD_ACPI_REGISTER) (
|
|
IN ACPI_REG_TYPE AcpiReg,
|
|
IN ULONG Register);
|
|
|
|
typedef VOID (*PWRITE_ACPI_REGISTER) (
|
|
IN ACPI_REG_TYPE AcpiReg,
|
|
IN ULONG Register,
|
|
IN USHORT Value
|
|
);
|
|
|
|
typedef struct ACPI_REGS_INTERFACE_STANDARD {
|
|
|
|
// generic interface header
|
|
|
|
USHORT Size;
|
|
USHORT Version;
|
|
PVOID Context;
|
|
PINTERFACE_REFERENCE InterfaceReference;
|
|
PINTERFACE_DEREFERENCE InterfaceDereference;
|
|
|
|
|
|
// READ/WRITE_ACPI_REGISTER functions
|
|
|
|
PREAD_ACPI_REGISTER ReadAcpiRegister;
|
|
PWRITE_ACPI_REGISTER WriteAcpiRegister;
|
|
|
|
} ACPI_REGS_INTERFACE_STANDARD, *PACPI_REGS_INTERFACE_STANDARD;
|
|
|
|
|
|
// These definitions are used for getting PCI Interrupt Routing interfaces
|
|
|
|
|
|
typedef struct {
|
|
PVOID LinkNode;
|
|
ULONG StaticVector;
|
|
UCHAR Flags;
|
|
} ROUTING_TOKEN, *PROUTING_TOKEN;
|
|
|
|
|
|
// Flag indicating that the device supports
|
|
// MSI interrupt routing or that the provided token contains
|
|
// MSI routing information
|
|
|
|
|
|
#define PCI_MSI_ROUTING 0x1
|
|
|
|
typedef
|
|
NTSTATUS
|
|
(*PGET_INTERRUPT_ROUTING)(
|
|
IN PDEVICE_OBJECT Pdo,
|
|
OUT ULONG *Bus,
|
|
OUT ULONG *PciSlot,
|
|
OUT UCHAR *InterruptLine,
|
|
OUT UCHAR *InterruptPin,
|
|
OUT UCHAR *ClassCode,
|
|
OUT UCHAR *SubClassCode,
|
|
OUT PDEVICE_OBJECT *ParentPdo,
|
|
OUT ROUTING_TOKEN *RoutingToken,
|
|
OUT UCHAR *Flags
|
|
);
|
|
|
|
typedef
|
|
NTSTATUS
|
|
(*PSET_INTERRUPT_ROUTING_TOKEN)(
|
|
IN PDEVICE_OBJECT Pdo,
|
|
IN PROUTING_TOKEN RoutingToken
|
|
);
|
|
|
|
typedef
|
|
VOID
|
|
(*PUPDATE_INTERRUPT_LINE)(
|
|
IN PDEVICE_OBJECT Pdo,
|
|
IN UCHAR LineRegister
|
|
);
|
|
|
|
typedef struct _INT_ROUTE_INTERFACE_STANDARD {
|
|
|
|
// generic interface header
|
|
|
|
USHORT Size;
|
|
USHORT Version;
|
|
PVOID Context;
|
|
PINTERFACE_REFERENCE InterfaceReference;
|
|
PINTERFACE_DEREFERENCE InterfaceDereference;
|
|
|
|
// standard bus interfaces
|
|
|
|
PGET_INTERRUPT_ROUTING GetInterruptRouting;
|
|
PSET_INTERRUPT_ROUTING_TOKEN SetInterruptRoutingToken;
|
|
PUPDATE_INTERRUPT_LINE UpdateInterruptLine;
|
|
|
|
} INT_ROUTE_INTERFACE_STANDARD, *PINT_ROUTE_INTERFACE_STANDARD;
|
|
|
|
// Some well-known interface versions supported by the PCI Bus Driver
|
|
|
|
#define PCI_INT_ROUTE_INTRF_STANDARD_VER 1
|
|
|
|
// end_ntddk end_nthal end_ntifs
|
|
|
|
NTKERNELAPI
|
|
BOOLEAN
|
|
PpInitSystem (
|
|
VOID
|
|
);
|
|
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
PpDeviceRegistration(
|
|
IN PUNICODE_STRING DeviceInstancePath,
|
|
IN BOOLEAN Add,
|
|
IN PUNICODE_STRING ServiceKeyName OPTIONAL
|
|
);
|
|
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
IoSynchronousInvalidateDeviceRelations(
|
|
PDEVICE_OBJECT DeviceObject,
|
|
DEVICE_RELATION_TYPE Type
|
|
);
|
|
|
|
// begin_ntddk begin_nthal begin_ntifs
|
|
|
|
typedef struct _IO_ASSIGNED_RESOURCES {
|
|
ULONG Count;
|
|
PASSIGNED_RESOURCE AssignedResources[1];
|
|
} IO_ASSIGNED_RESOURCES, *PIO_ASSIGNED_RESOURCES;
|
|
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
IoGetAssignedResourcesForSuballocation (
|
|
IN INTERFACE_TYPE InterfaceType,
|
|
IN ULONG BusNumber,
|
|
IN ULONG SlotNumber,
|
|
IN PIO_RESOURCE_DESCRIPTOR ResourceDescriptor,
|
|
OUT PIO_ASSIGNED_RESOURCES *List
|
|
);
|
|
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
IoReportDetectedDevice(
|
|
IN PDRIVER_OBJECT DriverObject,
|
|
IN INTERFACE_TYPE LegacyBusType,
|
|
IN ULONG BusNumber,
|
|
IN ULONG SlotNumber,
|
|
IN PCM_RESOURCE_LIST ResourceList,
|
|
IN PIO_RESOURCE_REQUIREMENTS_LIST ResourceRequirements OPTIONAL,
|
|
IN BOOLEAN ResourceAssigned,
|
|
IN OUT PDEVICE_OBJECT *DeviceObject
|
|
);
|
|
|
|
// begin_wdm
|
|
|
|
NTKERNELAPI
|
|
VOID
|
|
IoInvalidateDeviceRelations(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN DEVICE_RELATION_TYPE Type
|
|
);
|
|
|
|
NTKERNELAPI
|
|
VOID
|
|
IoRequestDeviceEject(
|
|
IN PDEVICE_OBJECT PhysicalDeviceObject
|
|
);
|
|
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
IoGetDeviceProperty(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN DEVICE_REGISTRY_PROPERTY DeviceProperty,
|
|
IN ULONG BufferLength,
|
|
OUT PVOID PropertyBuffer,
|
|
OUT PULONG ResultLength
|
|
);
|
|
|
|
|
|
// The following definitions are used in IoOpenDeviceRegistryKey
|
|
|
|
|
|
#define PLUGPLAY_REGKEY_DEVICE 1
|
|
#define PLUGPLAY_REGKEY_DRIVER 2
|
|
#define PLUGPLAY_REGKEY_CURRENT_HWPROFILE 4
|
|
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
IoOpenDeviceRegistryKey(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN ULONG DevInstKeyType,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
OUT PHANDLE DevInstRegKey
|
|
);
|
|
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
IoRegisterDeviceInterface(
|
|
IN PDEVICE_OBJECT PhysicalDeviceObject,
|
|
IN CONST GUID *InterfaceClassGuid,
|
|
IN PUNICODE_STRING ReferenceString, OPTIONAL
|
|
OUT PUNICODE_STRING SymbolicLinkName
|
|
);
|
|
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
IoOpenDeviceInterfaceRegistryKey(
|
|
IN PUNICODE_STRING SymbolicLinkName,
|
|
IN ACCESS_MASK DesiredAccess,
|
|
OUT PHANDLE DeviceInterfaceKey
|
|
);
|
|
|
|
// begin_ntsrv
|
|
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
IoSetDeviceInterfaceState(
|
|
IN PUNICODE_STRING SymbolicLinkName,
|
|
IN BOOLEAN Enable
|
|
);
|
|
|
|
// end_ntsrv
|
|
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
IoGetDeviceInterfaces(
|
|
IN CONST GUID *InterfaceClassGuid,
|
|
IN PDEVICE_OBJECT PhysicalDeviceObject OPTIONAL,
|
|
IN ULONG Flags,
|
|
OUT PWSTR *SymbolicLinkList
|
|
);
|
|
|
|
#define DEVICE_INTERFACE_INCLUDE_NONACTIVE 0x00000001
|
|
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
NTAPI
|
|
IoGetDeviceInterfaceAlias(
|
|
IN PUNICODE_STRING SymbolicLinkName,
|
|
IN CONST GUID *AliasInterfaceClassGuid,
|
|
OUT PUNICODE_STRING AliasSymbolicLinkName
|
|
);
|
|
|
|
|
|
// Define PnP notification event categories
|
|
|
|
|
|
typedef enum _IO_NOTIFICATION_EVENT_CATEGORY {
|
|
EventCategoryReserved,
|
|
EventCategoryHardwareProfileChange,
|
|
EventCategoryDeviceInterfaceChange,
|
|
EventCategoryTargetDeviceChange
|
|
} IO_NOTIFICATION_EVENT_CATEGORY;
|
|
|
|
|
|
// Define flags that modify the behavior of IoRegisterPlugPlayNotification
|
|
// for the various event categories...
|
|
|
|
|
|
#define PNPNOTIFY_DEVICE_INTERFACE_INCLUDE_EXISTING_INTERFACES 0x00000001
|
|
|
|
typedef
|
|
NTSTATUS
|
|
(*PDRIVER_NOTIFICATION_CALLBACK_ROUTINE) (
|
|
IN PVOID NotificationStructure,
|
|
IN PVOID Context
|
|
);
|
|
|
|
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
IoRegisterPlugPlayNotification(
|
|
IN IO_NOTIFICATION_EVENT_CATEGORY EventCategory,
|
|
IN ULONG EventCategoryFlags,
|
|
IN PVOID EventCategoryData OPTIONAL,
|
|
IN PDRIVER_OBJECT DriverObject,
|
|
IN PDRIVER_NOTIFICATION_CALLBACK_ROUTINE CallbackRoutine,
|
|
IN PVOID Context,
|
|
OUT PVOID *NotificationEntry
|
|
);
|
|
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
IoUnregisterPlugPlayNotification(
|
|
IN PVOID NotificationEntry
|
|
);
|
|
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
IoReportTargetDeviceChange(
|
|
IN PDEVICE_OBJECT PhysicalDeviceObject,
|
|
IN PVOID NotificationStructure // always begins with a PLUGPLAY_NOTIFICATION_HEADER
|
|
);
|
|
|
|
typedef
|
|
VOID
|
|
(*PDEVICE_CHANGE_COMPLETE_CALLBACK)(
|
|
IN PVOID Context
|
|
);
|
|
|
|
NTKERNELAPI
|
|
VOID
|
|
IoInvalidateDeviceState(
|
|
IN PDEVICE_OBJECT PhysicalDeviceObject
|
|
);
|
|
|
|
#define IoAdjustPagingPathCount(_count_,_paging_) { \
|
|
if (_paging_) { \
|
|
InterlockedIncrement(_count_); \
|
|
} else { \
|
|
InterlockedDecrement(_count_); \
|
|
} \
|
|
}
|
|
|
|
// end_wdm
|
|
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
IoReportTargetDeviceChangeAsynchronous(
|
|
IN PDEVICE_OBJECT PhysicalDeviceObject,
|
|
IN PVOID NotificationStructure, // always begins with a PLUGPLAY_NOTIFICATION_HEADER
|
|
IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback, OPTIONAL
|
|
IN PVOID Context OPTIONAL
|
|
);
|
|
|
|
// end_ntddk end_nthal end_ntifs
|
|
|
|
|
|
// begin_ntddk begin_nthal begin_ntifs
|
|
|
|
|
|
// Resource arbiter declarations
|
|
|
|
|
|
typedef enum _ARBITER_ACTION {
|
|
ArbiterActionTestAllocation,
|
|
ArbiterActionRetestAllocation,
|
|
ArbiterActionCommitAllocation,
|
|
ArbiterActionRollbackAllocation,
|
|
ArbiterActionQueryAllocatedResources,
|
|
ArbiterActionWriteReservedResources,
|
|
ArbiterActionQueryConflict,
|
|
ArbiterActionQueryArbitrate,
|
|
ArbiterActionAddReserved,
|
|
ArbiterActionBootAllocation
|
|
} ARBITER_ACTION, *PARBITER_ACTION;
|
|
|
|
typedef struct _ARBITER_CONFLICT_INFO {
|
|
|
|
// The device object owning the device that is causing the conflict
|
|
|
|
PDEVICE_OBJECT OwningObject;
|
|
|
|
|
|
// The start of the conflicting range
|
|
|
|
ULONGLONG Start;
|
|
|
|
|
|
// The end of the conflicting range
|
|
|
|
ULONGLONG End;
|
|
|
|
} ARBITER_CONFLICT_INFO, *PARBITER_CONFLICT_INFO;
|
|
|
|
|
|
// The parameters for those actions
|
|
|
|
|
|
typedef struct _ARBITER_PARAMETERS {
|
|
|
|
union {
|
|
|
|
struct {
|
|
|
|
|
|
// Doubly linked list of ARBITER_LIST_ENTRY's
|
|
|
|
IN OUT PLIST_ENTRY ArbitrationList;
|
|
|
|
|
|
// The size of the AllocateFrom array
|
|
|
|
IN ULONG AllocateFromCount;
|
|
|
|
|
|
// Array of resource descriptors describing the resources available
|
|
// to the arbiter for it to arbitrate
|
|
|
|
IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
|
|
|
|
} TestAllocation;
|
|
|
|
struct {
|
|
|
|
|
|
// Doubly linked list of ARBITER_LIST_ENTRY's
|
|
|
|
IN OUT PLIST_ENTRY ArbitrationList;
|
|
|
|
|
|
// The size of the AllocateFrom array
|
|
|
|
IN ULONG AllocateFromCount;
|
|
|
|
|
|
// Array of resource descriptors describing the resources available
|
|
// to the arbiter for it to arbitrate
|
|
|
|
IN PCM_PARTIAL_RESOURCE_DESCRIPTOR AllocateFrom;
|
|
|
|
} RetestAllocation;
|
|
|
|
struct {
|
|
|
|
|
|
// Doubly linked list of ARBITER_LIST_ENTRY's
|
|
|
|
IN OUT PLIST_ENTRY ArbitrationList;
|
|
|
|
} BootAllocation;
|
|
|
|
struct {
|
|
|
|
|
|
// The resources that are currently allocated
|
|
|
|
OUT PCM_PARTIAL_RESOURCE_LIST *AllocatedResources;
|
|
|
|
} QueryAllocatedResources;
|
|
|
|
struct {
|
|
|
|
|
|
// This is the device we are trying to find a conflict for
|
|
|
|
IN PDEVICE_OBJECT PhysicalDeviceObject;
|
|
|
|
|
|
// This is the resource to find the conflict for
|
|
|
|
IN PIO_RESOURCE_DESCRIPTOR ConflictingResource;
|
|
|
|
|
|
// Number of devices conflicting on the resource
|
|
|
|
OUT PULONG ConflictCount;
|
|
|
|
|
|
// Pointer to array describing the conflicting device objects and ranges
|
|
|
|
OUT PARBITER_CONFLICT_INFO *Conflicts;
|
|
|
|
} QueryConflict;
|
|
|
|
struct {
|
|
|
|
|
|
// Doubly linked list of ARBITER_LIST_ENTRY's - should have
|
|
// only one entry
|
|
|
|
IN PLIST_ENTRY ArbitrationList;
|
|
|
|
} QueryArbitrate;
|
|
|
|
struct {
|
|
|
|
|
|
// Indicates the device whose resources are to be marked as reserved
|
|
|
|
PDEVICE_OBJECT ReserveDevice;
|
|
|
|
} AddReserved;
|
|
|
|
} Parameters;
|
|
|
|
} ARBITER_PARAMETERS, *PARBITER_PARAMETERS;
|
|
|
|
|
|
|
|
typedef enum _ARBITER_REQUEST_SOURCE {
|
|
|
|
ArbiterRequestUndefined = -1,
|
|
ArbiterRequestLegacyReported, // IoReportResourceUsage
|
|
ArbiterRequestHalReported, // IoReportHalResourceUsage
|
|
ArbiterRequestLegacyAssigned, // IoAssignResources
|
|
ArbiterRequestPnpDetected, // IoReportResourceForDetection
|
|
ArbiterRequestPnpEnumerated // IRP_MN_QUERY_RESOURCE_REQUIREMENTS
|
|
|
|
} ARBITER_REQUEST_SOURCE;
|
|
|
|
|
|
typedef enum _ARBITER_RESULT {
|
|
|
|
ArbiterResultUndefined = -1,
|
|
ArbiterResultSuccess,
|
|
ArbiterResultExternalConflict, // This indicates that the request can never be solved for devices in this list
|
|
ArbiterResultNullRequest // The request was for length zero and thus no translation should be attempted
|
|
|
|
} ARBITER_RESULT;
|
|
|
|
|
|
// ARBITER_FLAG_BOOT_CONFIG - this indicates that the request is for the
|
|
// resources assigned by the firmware/BIOS. It should be succeeded even if
|
|
// it conflicts with another devices boot config.
|
|
|
|
|
|
#define ARBITER_FLAG_BOOT_CONFIG 0x00000001
|
|
|
|
NTKERNELAPI
|
|
NTSTATUS
|
|
IoReportResourceForDetection(
|
|
IN PDRIVER_OBJECT DriverObject,
|
|
IN PCM_RESOURCE_LIST DriverList OPTIONAL,
|
|
IN ULONG DriverListSize OPTIONAL,
|
|
IN PDEVICE_OBJECT DeviceObject OPTIONAL,
|
|
IN PCM_RESOURCE_LIST DeviceList OPTIONAL,
|
|
IN ULONG DeviceListSize OPTIONAL,
|
|
OUT PBOOLEAN ConflictDetected
|
|
);
|
|
|
|
|
|
typedef struct _ARBITER_LIST_ENTRY {
|
|
|
|
|
|
// This is a doubly linked list of entries for easy sorting
|
|
|
|
LIST_ENTRY ListEntry;
|
|
|
|
|
|
// The number of alternative allocation
|
|
|
|
ULONG AlternativeCount;
|
|
|
|
|
|
// Pointer to an array of resource descriptors for the possible allocations
|
|
|
|
PIO_RESOURCE_DESCRIPTOR Alternatives;
|
|
|
|
|
|
// The device object of the device requesting these resources.
|
|
|
|
PDEVICE_OBJECT PhysicalDeviceObject;
|
|
|
|
|
|
// Indicates where the request came from
|
|
|
|
ARBITER_REQUEST_SOURCE RequestSource;
|
|
|
|
|
|
// Flags these indicate a variety of things (use ARBITER_FLAG_*)
|
|
|
|
ULONG Flags;
|
|
|
|
|
|
// Space to aid the arbiter in processing the list it is initialized to 0 when
|
|
// the entry is created. The system will not attempt to interpret it.
|
|
|
|
LONG_PTR WorkSpace;
|
|
|
|
|
|
// Interface Type, Slot Number and Bus Number from Resource Requirements list,
|
|
// used only for reverse identification.
|
|
|
|
INTERFACE_TYPE InterfaceType;
|
|
ULONG SlotNumber;
|
|
ULONG BusNumber;
|
|
|
|
|
|
// A pointer to a descriptor to indicate the resource that was allocated.
|
|
// This is allocated by the system and filled in by the arbiter in response to an
|
|
// ArbiterActionTestAllocation.
|
|
|
|
PCM_PARTIAL_RESOURCE_DESCRIPTOR Assignment;
|
|
|
|
|
|
// Pointer to the alternative that was chosen from to provide the assignment.
|
|
// This is filled in by the arbiter in response to an ArbiterActionTestAllocation.
|
|
|
|
PIO_RESOURCE_DESCRIPTOR SelectedAlternative;
|
|
|
|
|
|
// The result of the operation
|
|
// This is filled in by the arbiter in response to an ArbiterActionTestAllocation.
|
|
|
|
ARBITER_RESULT Result;
|
|
|
|
} ARBITER_LIST_ENTRY, *PARBITER_LIST_ENTRY;
|
|
|
|
|
|
// The arbiter's entry point
|
|
|
|
|
|
typedef
|
|
NTSTATUS
|
|
(*PARBITER_HANDLER) (
|
|
IN PVOID Context,
|
|
IN ARBITER_ACTION Action,
|
|
IN OUT PARBITER_PARAMETERS Parameters
|
|
);
|
|
|
|
|
|
// Arbiter interface
|
|
|
|
|
|
|
|
// A partial arbiter is one which may not arbitrate all the resources for
|
|
// its children but may defer to the next arbiter in the chain by returning
|
|
// STATUS_ARBITRATION_UNHANDLED.
|
|
|
|
|
|
#define ARBITER_PARTIAL 0x00000001
|
|
|
|
|
|
typedef struct _ARBITER_INTERFACE {
|
|
|
|
|
|
// Generic interface header
|
|
|
|
USHORT Size;
|
|
USHORT Version;
|
|
PVOID Context;
|
|
PINTERFACE_REFERENCE InterfaceReference;
|
|
PINTERFACE_DEREFERENCE InterfaceDereference;
|
|
|
|
|
|
// Entry point to the arbiter
|
|
|
|
PARBITER_HANDLER ArbiterHandler;
|
|
|
|
|
|
// Other information about the arbiter, use ARBITER_* flags
|
|
|
|
ULONG Flags;
|
|
|
|
} ARBITER_INTERFACE, *PARBITER_INTERFACE;
|
|
|
|
|
|
// The directions translation can take place in
|
|
|
|
|
|
typedef enum _RESOURCE_TRANSLATION_DIRECTION {
|
|
TranslateChildToParent,
|
|
TranslateParentToChild
|
|
} RESOURCE_TRANSLATION_DIRECTION;
|
|
|
|
|
|
// Translation functions
|
|
|
|
|
|
typedef
|
|
NTSTATUS
|
|
(*PTRANSLATE_RESOURCE_HANDLER)(
|
|
IN PVOID Context,
|
|
IN PCM_PARTIAL_RESOURCE_DESCRIPTOR Source,
|
|
IN RESOURCE_TRANSLATION_DIRECTION Direction,
|
|
IN ULONG AlternativesCount, OPTIONAL
|
|
IN IO_RESOURCE_DESCRIPTOR Alternatives[], OPTIONAL
|
|
IN PDEVICE_OBJECT PhysicalDeviceObject,
|
|
OUT PCM_PARTIAL_RESOURCE_DESCRIPTOR Target
|
|
);
|
|
|
|
typedef
|
|
NTSTATUS
|
|
(*PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER)(
|
|
IN PVOID Context,
|
|
IN PIO_RESOURCE_DESCRIPTOR Source,
|
|
IN PDEVICE_OBJECT PhysicalDeviceObject,
|
|
OUT PULONG TargetCount,
|
|
OUT PIO_RESOURCE_DESCRIPTOR *Target
|
|
);
|
|
|
|
|
|
// Translator Interface
|
|
|
|
|
|
typedef struct _TRANSLATOR_INTERFACE {
|
|
USHORT Size;
|
|
USHORT Version;
|
|
PVOID Context;
|
|
PINTERFACE_REFERENCE InterfaceReference;
|
|
PINTERFACE_DEREFERENCE InterfaceDereference;
|
|
PTRANSLATE_RESOURCE_HANDLER TranslateResources;
|
|
PTRANSLATE_RESOURCE_REQUIREMENTS_HANDLER TranslateResourceRequirements;
|
|
} TRANSLATOR_INTERFACE, *PTRANSLATOR_INTERFACE;
|
|
|
|
// end_wdm
|
|
|
|
|
|
// Legacy Device Detection Handler
|
|
|
|
|
|
typedef
|
|
NTSTATUS
|
|
(*PLEGACY_DEVICE_DETECTION_HANDLER)(
|
|
IN PVOID Context,
|
|
IN INTERFACE_TYPE LegacyBusType,
|
|
IN ULONG BusNumber,
|
|
IN ULONG SlotNumber,
|
|
OUT PDEVICE_OBJECT *PhysicalDeviceObject
|
|
);
|
|
|
|
|
|
// Legacy Device Detection Interface
|
|
|
|
|
|
typedef struct _LEGACY_DEVICE_DETECTION_INTERFACE {
|
|
USHORT Size;
|
|
USHORT Version;
|
|
PVOID Context;
|
|
PINTERFACE_REFERENCE InterfaceReference;
|
|
PINTERFACE_DEREFERENCE InterfaceDereference;
|
|
PLEGACY_DEVICE_DETECTION_HANDLER LegacyDeviceDetection;
|
|
} LEGACY_DEVICE_DETECTION_INTERFACE, *PLEGACY_DEVICE_DETECTION_INTERFACE;
|
|
|
|
// end_ntddk end_nthal end_ntifs
|
|
|
|
// begin_wdm begin_ntddk begin_ntifs begin_nthal
|
|
|
|
|
|
// Header structure for all Plug&Play notification events...
|
|
|
|
|
|
typedef struct _PLUGPLAY_NOTIFICATION_HEADER {
|
|
USHORT Version; // presently at version 1.
|
|
USHORT Size; // size (in bytes) of header + event-specific data.
|
|
GUID Event;
|
|
|
|
// Event-specific stuff starts here.
|
|
|
|
} PLUGPLAY_NOTIFICATION_HEADER, *PPLUGPLAY_NOTIFICATION_HEADER;
|
|
|
|
|
|
// Notification structure for all EventCategoryHardwareProfileChange events...
|
|
|
|
|
|
typedef struct _HWPROFILE_CHANGE_NOTIFICATION {
|
|
USHORT Version;
|
|
USHORT Size;
|
|
GUID Event;
|
|
|
|
// (No event-specific data)
|
|
|
|
} HWPROFILE_CHANGE_NOTIFICATION, *PHWPROFILE_CHANGE_NOTIFICATION;
|
|
|
|
|
|
|
|
// Notification structure for all EventCategoryDeviceInterfaceChange events...
|
|
|
|
|
|
typedef struct _DEVICE_INTERFACE_CHANGE_NOTIFICATION {
|
|
USHORT Version;
|
|
USHORT Size;
|
|
GUID Event;
|
|
|
|
// Event-specific data
|
|
|
|
GUID InterfaceClassGuid;
|
|
PUNICODE_STRING SymbolicLinkName;
|
|
} DEVICE_INTERFACE_CHANGE_NOTIFICATION, *PDEVICE_INTERFACE_CHANGE_NOTIFICATION;
|
|
|
|
|
|
|
|
// Notification structures for EventCategoryTargetDeviceChange...
|
|
|
|
|
|
|
|
// The following structure is used for TargetDeviceQueryRemove,
|
|
// TargetDeviceRemoveCancelled, and TargetDeviceRemoveComplete:
|
|
|
|
typedef struct _TARGET_DEVICE_REMOVAL_NOTIFICATION {
|
|
USHORT Version;
|
|
USHORT Size;
|
|
GUID Event;
|
|
|
|
// Event-specific data
|
|
|
|
PFILE_OBJECT FileObject;
|
|
} TARGET_DEVICE_REMOVAL_NOTIFICATION, *PTARGET_DEVICE_REMOVAL_NOTIFICATION;
|
|
|
|
|
|
// The following structure header is used for all other (i.e., 3rd-party)
|
|
// target device change events. The structure accommodates both a
|
|
// variable-length binary data buffer, and a variable-length unicode text
|
|
// buffer. The header must indicate where the text buffer begins, so that
|
|
// the data can be delivered in the appropriate format (ANSI or Unicode)
|
|
// to user-mode recipients (i.e., that have registered for handle-based
|
|
// notification via RegisterDeviceNotification).
|
|
|
|
|
|
typedef struct _TARGET_DEVICE_CUSTOM_NOTIFICATION {
|
|
USHORT Version;
|
|
USHORT Size;
|
|
GUID Event;
|
|
|
|
// Event-specific data
|
|
|
|
PFILE_OBJECT FileObject; // This field must be set to NULL by callers of
|
|
// IoReportTargetDeviceChange. Clients that
|
|
// have registered for target device change
|
|
// notification on the affected PDO will be
|
|
// called with this field set to the file object
|
|
// they specified during registration.
|
|
|
|
LONG NameBufferOffset; // offset (in bytes) from beginning of
|
|
// CustomDataBuffer where text begins (-1 if none)
|
|
|
|
UCHAR CustomDataBuffer[1]; // variable-length buffer, containing (optionally)
|
|
// a binary data at the start of the buffer,
|
|
// followed by an optional unicode text buffer
|
|
// (word-aligned).
|
|
|
|
} TARGET_DEVICE_CUSTOM_NOTIFICATION, *PTARGET_DEVICE_CUSTOM_NOTIFICATION;
|
|
|
|
// end_wdm end_ntddk end_ntifs end_nthal
|
|
|
|
NTSTATUS
|
|
PpSetCustomTargetEvent(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PKEVENT SyncEvent OPTIONAL,
|
|
OUT PULONG Result OPTIONAL,
|
|
IN PDEVICE_CHANGE_COMPLETE_CALLBACK Callback OPTIONAL,
|
|
IN PVOID Context OPTIONAL,
|
|
IN PTARGET_DEVICE_CUSTOM_NOTIFICATION NotificationStructure
|
|
);
|
|
|
|
NTSTATUS
|
|
PpSetTargetDeviceRemove(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN BOOLEAN KernelInitiated,
|
|
IN BOOLEAN NoRestart,
|
|
IN BOOLEAN DoEject,
|
|
IN ULONG Problem,
|
|
IN PKEVENT SyncEvent OPTIONAL,
|
|
OUT PULONG Result OPTIONAL,
|
|
OUT PPNP_VETO_TYPE VetoType OPTIONAL,
|
|
OUT PUNICODE_STRING VetoName OPTIONAL
|
|
);
|
|
|
|
NTSTATUS
|
|
PpSetDeviceRemovalSafe(
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PKEVENT SyncEvent OPTIONAL,
|
|
OUT PULONG Result OPTIONAL
|
|
);
|
|
|
|
NTSTATUS
|
|
PpNotifyUserModeRemovalSafe(
|
|
IN PDEVICE_OBJECT DeviceObject
|
|
);
|
|
|
|
#define TDF_DEVICEEJECTABLE 0x00000001
|
|
#define TDF_NO_RESTART 0x00000002
|
|
#define TDF_KERNEL_INITIATED 0x00000004
|
|
|
|
NTSTATUS
|
|
PpSetDeviceClassChange(
|
|
IN CONST GUID *EventGuid,
|
|
IN CONST GUID *ClassGuid,
|
|
IN PUNICODE_STRING SymbolicLinkName
|
|
);
|
|
|
|
VOID
|
|
PpSetPlugPlayEvent(
|
|
IN CONST GUID *EventGuid,
|
|
IN PDEVICE_OBJECT DeviceObject
|
|
);
|
|
|
|
NTSTATUS
|
|
PpInitializeNotification(
|
|
VOID
|
|
);
|
|
|
|
VOID
|
|
PpShutdownSystem (
|
|
IN BOOLEAN Reboot,
|
|
IN ULONG Phase,
|
|
IN OUT PVOID *Context
|
|
);
|
|
|
|
NTSTATUS
|
|
PpSetPowerEvent(
|
|
IN ULONG EventCode,
|
|
IN PKEVENT CompletionEvent OPTIONAL,
|
|
OUT PNTSTATUS CompletionStatus OPTIONAL,
|
|
OUT PPNP_VETO_TYPE VetoType OPTIONAL,
|
|
OUT PUNICODE_STRING VetoName OPTIONAL
|
|
);
|
|
|
|
NTSTATUS
|
|
PpSetHwProfileChangeEvent(
|
|
IN CONST GUID *EventGuid,
|
|
IN PKEVENT CompletionEvent OPTIONAL,
|
|
OUT PNTSTATUS CompletionStatus OPTIONAL,
|
|
OUT PPNP_VETO_TYPE VetoType OPTIONAL,
|
|
OUT PUNICODE_STRING VetoName OPTIONAL
|
|
);
|
|
|
|
NTSTATUS
|
|
PpSynchronizeDeviceEventQueue(
|
|
VOID
|
|
);
|
|
|
|
NTSTATUS
|
|
PpSetPowerVetoEvent(
|
|
IN POWER_ACTION VetoedPowerOperation,
|
|
IN PKEVENT CompletionEvent OPTIONAL,
|
|
OUT PNTSTATUS CompletionStatus OPTIONAL,
|
|
IN PDEVICE_OBJECT DeviceObject,
|
|
IN PNP_VETO_TYPE VetoType,
|
|
IN PUNICODE_STRING VetoName OPTIONAL
|
|
);
|
|
|
|
|
|
// Entry point for USER to deliver notifications (public)
|
|
|
|
|
|
ULONG
|
|
IoPnPDeliverServicePowerNotification(
|
|
ULONG PwrNotification,
|
|
BOOLEAN Synchronous
|
|
);
|
|
|
|
#endif // _PNP_
|