Windows2000/private/ntos/io/pnprlist.h
2020-09-30 17:12:32 +02:00

181 lines
5.1 KiB
C

/*++
Copyright (c) 1998 Microsoft Corporation
Module Name:
pnprlist.h
Abstract:
This file declares the routines and data structures used to manipulate
relations list. Relation lists are used by Plug and Play during the
processing of device removal and ejection.
Author:
Robert Nelson (robertn) Apr, 1998.
Revision History:
*/
// A RELATION_LIST_ENTRY is an element of a relation list.
// It contains all the PDEVICE_OBJECTS which exist at the same level in the
// DEVICE_NODE tree.
// Individual PDEVICE_OBJECT entries are tagged by setting their lowest bit.
// MaxCount indicates the size of the Devices array. Count indicates the number
// of elements which are currently being used. When a relation list is
// compressed Count will equal MaxCount.
typedef struct _RELATION_LIST_ENTRY {
ULONG Count; // Number of current entries
ULONG MaxCount; // Size of Entries list
PDEVICE_OBJECT Devices[1]; // Variable length list of device objects
} RELATION_LIST_ENTRY, *PRELATION_LIST_ENTRY;
// A RELATION_LIST contains a number of RELATION_LIST_ENTRY structures.
// Each entry in Entries describes all the devices of a given level in the
// DEVICE_NODE tree. In order to conserve memory, space is only allocated for
// the entries between the lowest and highest levels inclusive. The member
// FirstLevel indicates which level is at index 0 of Entries. MaxLevel
// indicates the last level represented in Entries. The number of entries is
// determined by the formula MaxLevel - FirstLevel + 1. The Entries array can
// be sparse. Each element of Entries will either be a PRELATION_LIST_ENTRY or
// NULL.
// The total number of PDEVICE_OBJECTs in all PRELATION_LIST_ENTRYs is kept in
// Count. Individual PDEVICE_OBJECTS may be tagged. The tag is maintained in
// Bit 0 of the PDEVICE_OBJECT. The total number of PDEVICE_OBJECTs tagged is
// kept in TagCount. This is used to rapidly determine whether or not all
// objects have been tagged.
typedef struct _RELATION_LIST {
ULONG Count; // Count of Devices in all Entries
ULONG TagCount; // Count of Tagged Devices
ULONG FirstLevel; // Level Number of Entries[0]
ULONG MaxLevel; // - FirstLevel + 1 = Number of Entries
PRELATION_LIST_ENTRY Entries[1]; // Variable length list of entries
} RELATION_LIST, *PRELATION_LIST;
// A PENDING_RELATIONS_LIST_ENTRY is used to track relation lists for operations
// which may pend. This includes removal when open handles exist and device
// ejection.
// The Link field is used to link the PENDING_RELATIONS_LIST_ENTRYs together.
// The DeviceObject field is the DEVICE_OBJECT to which the operation was
// originally targetted. It will also exist as a member of the relations list.
// The RelationsList is a list of BusRelations, RemovalRelations, (and
// EjectionRelations in the case of eject) which are related to DeviceObject and
// its relations.
// The EjectIrp is pointer to the Eject IRP which has been sent to the PDO. If
// this is a pending surprise removal then EjectIrp is not used.
typedef struct _PENDING_RELATIONS_LIST_ENTRY {
LIST_ENTRY Link;
WORK_QUEUE_ITEM WorkItem;
PPNP_DEVICE_EVENT_ENTRY DeviceEvent;
PDEVICE_OBJECT DeviceObject;
PRELATION_LIST RelationsList;
PIRP EjectIrp;
ULONG Problem;
BOOLEAN ProfileChangingEject;
BOOLEAN DisplaySafeRemovalDialog;
SYSTEM_POWER_STATE LightestSleepState;
PDOCK_INTERFACE DockInterface;
} PENDING_RELATIONS_LIST_ENTRY, *PPENDING_RELATIONS_LIST_ENTRY;
// Functions exported to other kernel modules.
NTSTATUS
IopAddRelationToList(
IN PRELATION_LIST List,
IN PDEVICE_OBJECT DeviceObject,
IN BOOLEAN DirectDescendant,
IN BOOLEAN Tagged
);
PRELATION_LIST
IopAllocateRelationList(
VOID
);
NTSTATUS
IopCompressRelationList(
IN OUT PRELATION_LIST *List
);
BOOLEAN
IopEnumerateRelations(
IN PRELATION_LIST List,
IN OUT PULONG Marker,
OUT PDEVICE_OBJECT *PhysicalDevice,
OUT BOOLEAN *DirectDescendant, OPTIONAL
OUT BOOLEAN *Tagged, OPTIONAL
BOOLEAN Reverse
);
VOID
IopFreeRelationList(
IN PRELATION_LIST List
);
ULONG
IopGetRelationsCount(
IN PRELATION_LIST List
);
ULONG
IopGetRelationsTaggedCount(
IN PRELATION_LIST List
);
BOOLEAN
IopIsRelationInList(
IN PRELATION_LIST List,
IN PDEVICE_OBJECT DeviceObject
);
NTSTATUS
IopMergeRelationLists(
IN OUT PRELATION_LIST TargetList,
IN PRELATION_LIST SourceList,
IN BOOLEAN Tagged
);
NTSTATUS
IopRemoveIndirectRelationsFromList(
IN PRELATION_LIST List
);
NTSTATUS
IopRemoveRelationFromList(
IN PRELATION_LIST List,
IN PDEVICE_OBJECT DeviceObject
);
VOID
IopSetAllRelationsTags(
IN PRELATION_LIST List,
IN BOOLEAN Tagged
);
NTSTATUS
IopSetRelationsTag(
IN PRELATION_LIST List,
IN PDEVICE_OBJECT DeviceObject,
IN BOOLEAN Tagged
);