42 AddressDescriptionSize;
83 __in size_t AllocatorBlock,
85 __in size_t TotalDescriptionSize
92 p = FxPoolAllocate(FxDriverGlobals,
NonPagedPool, TotalDescriptionSize);
272 if (pNewEntry ==
NULL) {
300 __in size_t TotalDescriptionSize,
305 m_TotalDescriptionSize(TotalDescriptionSize),
306 m_EvtCreateDevice(FxDriverGlobals),
307 m_EvtScanForChildren(FxDriverGlobals)
371 __in size_t TotalDescriptionSize,
388 childList =
new(FxDriverGlobals, ListAttributes)
390 if (childList ==
NULL) {
393 "No memory for WDFCHILDLIST handle, %!STATUS!",
408 if (
NULL != childList) {
473 Info->IdentificationDescription);
480 Info->IdentificationDescription);
498 pEntry->m_AddressDescription);
572 "Begin scan on WDFCHILDLIST %p, scan count %d",
575 if (ScanTag !=
NULL) {
621 if (ScanTag !=
NULL) {
636 "End scan on WDFCHILDLIST %p, scan count %d",
658 "entry %p modified in last scan, " 659 "mod state %!FxChildListModificationState!," 660 "desc state %!FxChildListDescriptionState!",
662 pEntry->m_DescriptionState);
665 switch (
pEntry->m_ModificationState) {
676 "clone of PDO WDFDEVICE %p, !devobj %p dropped because " 677 "it is missing",
pEntry->m_Pdo->GetHandle(),
678 pEntry->m_Pdo->GetDeviceObject());
717 if (
pEntry->m_PendingDeleteOnScanEnd) {
735 "marking PDO WDFDEVICE %p, !devobj %p as not present",
736 pEntry->m_Pdo->GetHandle(),
737 pEntry->m_Pdo->GetDeviceObject());
743 "marking PDO (entry %p) which needs instantiation as " 847 "Begin iteration on WDFCHILDLIST %p, scan count %d",
859 "end iteration on WDFCHILDLIST");
898 "WDFCHILDLIST %p cannot retrieve next device if the list is not " 933 Info->EvtChildListIdentificationDescriptionCompare !=
NULL) {
935 found =
Info->EvtChildListIdentificationDescriptionCompare(
937 Info->IdentificationDescription,
938 pEntry->m_IdentificationDescription);
965 if (
Info->IdentificationDescription !=
NULL) {
967 pEntry->m_IdentificationDescription);
969 if (
Info->AddressDescription !=
NULL) {
971 pEntry->m_AddressDescription);
974 Info->Status = dstatus;
1015 Info->EvtChildListIdentificationDescriptionCompare !=
NULL) {
1017 found =
Info->EvtChildListIdentificationDescriptionCompare(
1019 Info->IdentificationDescription,
1020 pEntry->m_IdentificationDescription);
1030 if (
Info->IdentificationDescription !=
NULL) {
1032 pEntry->m_IdentificationDescription);
1034 if (
Info->AddressDescription !=
NULL) {
1036 pEntry->m_AddressDescription);
1049 if (found ==
FALSE) {
1061 __in WDFDEVICE PreviousDevice,
1076 if (PreviousDevice ==
NULL) {
1113 if (
pEntry->m_PendingDeleteOnScanEnd) {
1129 else if (pStatic->
Pdo->
GetHandle() == PreviousDevice) {
1151 if (
pEntry->m_PendingDeleteOnScanEnd) {
1167 else if (pStatic->
Pdo->
GetHandle() == PreviousDevice) {
1215 if (
pEntry->IsPresent()) {
1293 if (found ==
FALSE) {
1316 if (
pEntry->IsPresent()) {
1361 if (FromQDR ==
FALSE) {
1372 "Inserting clone modification for PDO WDFDEVICE %p, !devobj %p",
1373 Entry->m_Pdo->GetHandle(),
Entry->m_Pdo->GetDeviceObject());
1391 "Requested reenumeration for PDO WDFDEVICE %p, !devobj %p" 1392 " no possible (pending mod %d, currently present %d)",
1393 Entry->m_Pdo->GetHandle(),
Entry->m_Pdo->GetDeviceObject(),
1433 if (ScanTag !=
NULL) {
1449 pNext =
pCur->Flink;
1467 if (
pEntry->IsPresent()) {
1501 if (ScanTag !=
NULL) {
1517 allocNewEntry =
FALSE;
1527 switch (
pEntry->m_ModificationState) {
1549 allocNewEntry =
TRUE;
1587 allocNewEntry =
TRUE;
1591 if (allocNewEntry) {
1611 &
pEntry->m_ModificationLink);
1687 "attempting to clone PDO WDFDEVICE %p, !devobj %p, From QDR %d",
1688 Entry->m_Pdo->GetHandle(),
Entry->m_Pdo->GetDeviceObject(), FromQDR);
1690 invalidateRelations =
FALSE;
1692 pClone =
Entry->Clone(FreeListHead);
1694 if (pClone !=
NULL) {
1702 Entry->m_Pdo->GetHandle(),
1703 Entry->m_AddressDescription,
1714 "clone successful (new entry is %p), marking PDO " 1715 "WDFDEVICE %p, !devobj %p as missing", pClone,
1716 Entry->m_Pdo->GetHandle(),
Entry->m_Pdo->GetDeviceObject());
1733 if (FromQDR ==
FALSE) {
1735 invalidateRelations =
TRUE;
1752 return invalidateRelations;
1771 "Not processing modifications on WDFCHILDLIST %p (list state %d, " 1778 "Begin processing modifications on WDFCHILDLIST %p",
GetObjectHandle());
1788 pNext =
pCur->Flink;
1792 switch (
pEntry->m_ModificationState) {
1817 invalidateRelations =
FALSE;
1830 "entry %p, mod state is %!FxChildListModificationState!",
1833 switch (
pEntry->m_ModificationState) {
1844 "processing remove on entry %p, description state is " 1845 "%!FxChildListDescriptionState!",
1848 switch (
pEntry->m_DescriptionState) {
1861 "entry %p never reported to pnp, mark for deletion",
pEntry);
1870 "committing PDO WDFDEVICE %p, !devobj %p as not present",
1871 pEntry->m_Pdo->GetHandle(),
pEntry->m_Pdo->GetDeviceObject());
1874 invalidateRelations =
TRUE;
1894 "marking entry %p as needing instantiation",
pEntry);
1898 invalidateRelations =
TRUE;
1911 if (invalidateRelations) {
1932 "end processing modifications on WDFCHILDLIST %p",
GetObjectHandle());
1965 ASSERT(DescriptionEntry->IsPresent());
1969 if (ModificationCanBeQueued) {
1970 if (
IsListEmpty(&DescriptionEntry->m_ModificationLink)) {
1977 ASSERT(DescriptionEntry->m_ModificationState ==
1979 ASSERT(DescriptionEntry->m_FoundInLastScan ==
FALSE);
1996 DescriptionEntry->m_FoundInLastScan =
FALSE;
1999 &DescriptionEntry->m_ModificationLink);
2027 switch (ModificationEntry->m_ModificationState) {
2049 InsertTailList(FreeListHead, &ModificationEntry->m_DescriptionLink);
2152 pEntry->m_AddressDescription);
2266 init.CreatedDevice =
2283 init.CreatedDevice->Destroy();
2286 *InvalidateRelations =
TRUE;
2304 "EvtChildListCreateDevice returned a successful status " 2305 "%!STATUS! but did not create a device object",
status);
2355 "WDFDEVICE %p !devobj %p created, but EvtChildListCreateDevice " 2356 "returned status %!STATUS!",
init.CreatedDevice->GetHandle(),
2357 init.CreatedDevice->GetDeviceObject(),
status);
2370 (
void)
init.CreatedDevice->DeleteDeviceFromFailedCreate(
2424 BOOLEAN needToReportMissingChildren, invalidateRelations, cleanupRelations;
2425 ULONG additionalCount, totalCount,
i;
2433 pNewRelations =
NULL;
2434 invalidateRelations =
FALSE;
2435 cleanupRelations =
TRUE;
2448 additionalCount = 0;
2449 needToReportMissingChildren =
FALSE;
2457 switch (
pEntry->m_DescriptionState) {
2473 "PDO WDFDEVICE %p !devobj %p in a not present state, need to " 2474 "report as missing",
2475 pEntry->m_Pdo->GetHandle(),
pEntry->m_Pdo->GetDeviceObject());
2477 needToReportMissingChildren =
TRUE;
2494 pPriorRelations = *DeviceRelations;
2507 if (additionalCount == 0 &&
2508 (needToReportMissingChildren ==
FALSE || pPriorRelations !=
NULL)) {
2520 if (needToReportMissingChildren) {
2534 "PDO WDFDEVICE %p !devobj %p reported as missing to pnp",
2535 pEntry->m_Pdo->GetHandle(),
pEntry->m_Pdo->GetDeviceObject());
2545 "Nothing to report on WDFCHILDLIST %p, returning early",
GetHandle());
2548 cleanupRelations =
FALSE;
2556 totalCount = additionalCount;
2557 if (pPriorRelations !=
NULL) {
2558 totalCount += pPriorRelations->
Count;
2566 if (pNewRelations ==
NULL) {
2571 "Could not allocate relations for %d devices",
2579 cleanupRelations =
FALSE;
2584 invalidateRelations =
TRUE;
2587 if (needToReportMissingChildren) {
2590 "WDFCHILDLIST %p could not allocate relations required for " 2591 "reporting children as missing after max retries",
2597 "WDFCHILDLIST %p retried %d times to report relations, but " 2601 if (pPriorRelations ==
NULL) {
2630 switch (
pEntry->m_DescriptionState) {
2641 "PDO WDFDEVICE %p !devobj %p being marked as missing " 2642 "because of failure to allocate device relations and " 2643 "an already existing relations %p",
2644 pEntry->m_Pdo->GetHandle(),
2645 pEntry->m_Pdo->GetDeviceObject(), pPriorRelations);
2653 "PDO WDFDEVICE %p !devobj %p being cloned " 2654 "because of the failure to allocate device " 2656 pEntry->m_Pdo->GetHandle(),
2657 pEntry->m_Pdo->GetDeviceObject());
2666 "PDO WDFDEVICE %p !devobj %p is a statically " 2667 "enumerated PDO therefore can not be cloned and is " 2668 "being marked missing because of failure to " 2669 "allocate device relations. It will be surprise " 2670 "removed by pnp manager. Bus driver may continue " 2671 "to function normally but will lose this child PDO",
2672 pEntry->m_Pdo->GetHandle(),
2673 pEntry->m_Pdo->GetDeviceObject());
2686 "PDO WDFDEVICE %p !devobj %p reported as missing to pnp " 2687 "(by using existing relations)",
2688 pEntry->m_Pdo->GetHandle(),
2689 pEntry->m_Pdo->GetDeviceObject());
2703 if (pPriorRelations !=
NULL && pPriorRelations->
Count > 0) {
2706 "WDFCHILDLIST %p prior relations %p contained %d objects",
2728 switch (
pEntry->m_DescriptionState) {
2734 "Creating PDO device object from reported device");
2741 "PDO created successfully, WDFDEVICE %p !devobj %p",
2742 pEntry->m_Pdo->GetHandle(),
pEntry->m_Pdo->GetDeviceObject());
2749 "Reporting PDO WDFDEVICE %p !devobj %p",
2750 pEntry->m_Pdo->GetHandle(),
2751 pEntry->m_Pdo->GetDeviceObject());
2756 pNewRelations->
Count++;
2765 "PDO WDFDEVICE %p !devobj %p reported as missing to pnp",
2766 pEntry->m_Pdo->GetHandle(),
pEntry->m_Pdo->GetDeviceObject());
2798 if (invalidateRelations) {
2811 if (cleanupRelations) {
2812 if (pPriorRelations !=
NULL) {
2815 "Freeing prior relations %p", pPriorRelations);
2818 pPriorRelations =
NULL;
2822 for(
i = 0;
i < pNewRelations->
Count;
i++) {
2827 pNewRelations =
NULL;
2830 *DeviceRelations = pNewRelations;
2868 (
pEntry->m_Pdo->GetPdoPkg())->m_DeviceReportedMissing.Invoke(
2869 pEntry->m_Pdo->GetHandle());
2899 if (
pEntry->m_PendingDeleteOnScanEnd) {
2941 if (
pEntry->m_PendingDeleteOnScanEnd) {
2992 pNext =
pCur->Flink;
3012 if (
pEntry->IsPresent()) {
3065 "WDFCHILDLIST %p: removing children",
GetHandle());
3100 if (
pEntry->m_ProcessingSurpriseRemove ==
FALSE) {
3113 "Removing entry %p, WDFDEVICE %p, PDO %p",
3115 pEntry->m_Pdo->GetPhysicalDevice());
3130 pEntry->m_Pdo->SetParentWaitingOnRemoval();
3154 __in size_t* TotalDescriptionSize
3162 "Invalid Config, NULL is not allowed, %!STATUS!",
status);
3169 "Config->Size incorrect, expected %d, got %d, %!STATUS!",
3173 if (
Config->IdentificationDescriptionSize == 0) {
3176 "Config->IdentificationDescriptionSize must be non zero, " 3180 if (
Config->EvtChildListCreateDevice ==
NULL) {
3183 "Config->EvtChildListCreateDevice, NULL is not allowed, " 3190 TotalDescriptionSize);
3198 __in size_t* TotalDescriptionSize
3201 size_t addressAligned, idAligned;
3204 *TotalDescriptionSize = 0;
3224 "Config->IdentificationDescriptionSize %d too large" 3225 "%!STATUS!",
Config->IdentificationDescriptionSize,
3232 if (addressAligned < Config->AddressDescriptionSize) {
3235 "Config->AddressDescriptionSize %d too large, %!STATUS!",
3243 TotalDescriptionSize
3248 "Could not add ID description size to block size, %!STATUS!",
3253 status = RtlSizeTAdd(*TotalDescriptionSize,
3255 TotalDescriptionSize);
3259 "Could not add address description size to block size, %!STATUS!",
struct _LIST_ENTRY * PLIST_ENTRY
FxChildList * m_DeviceList
FxDeviceDescriptionEntry * SearchBackwardsForMatchingDescriptionLocked(__in PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER Id)
VOID MarkModificationNotPresentWorker(__inout PLIST_ENTRY FreeListHead, __inout FxDeviceDescriptionEntry *ModificationEntry)
BOOLEAN HasAddressDescriptions(VOID)
LIST_ENTRY m_ModificationListHead
_Must_inspect_result_ NTSTATUS VerifyModificationEntry(__in PLIST_ENTRY Entry)
return STATUS_NOT_SUPPORTED
LIST_ENTRY m_DescriptionListHead
#define _Must_inspect_result_
PFN_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COPY m_EvtIdentificationDescriptionCopy
BOOLEAN CloneEntryLocked(__inout PLIST_ENTRY FreeListHead, __inout FxDeviceDescriptionEntry *Entry, __in BOOLEAN FromQDR)
#define STATUS_INSUFFICIENT_RESOURCES
_Must_inspect_result_ NTSTATUS GetNextDevice(__out WDFDEVICE *Device, __inout PWDF_CHILD_LIST_ITERATOR Iterator, __inout_opt PWDF_CHILD_RETRIEVE_INFO Info)
struct png_info_def **typedef void(__cdecl typeof(png_destroy_read_struct))(struct png_struct_def **
#define STATUS_INFO_LENGTH_MISMATCH
#define STATUS_NO_MORE_ENTRIES
VOID CopyAddress(__out PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER Dest, __in_opt PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER Source)
ActualNumberDriverObjects * sizeof(PDRIVER_OBJECT)) PDRIVER_OBJECT *DriverObjectList
VOID PnpProcessEvent(__in FxPnpEvent Event, __in BOOLEAN ProcessEventOnDifferentThread=FALSE)
_Must_inspect_result_ NTSTATUS Invoke(__in WDFCHILDLIST DeviceList, __in PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER IdentificationDescription, __in PWDFDEVICE_INIT ChildInit)
FxDeviceDescriptionEntry * SearchBackwardsForMatchingModificationLocked(__in PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER Id)
#define WDF_PTR_ADD_OFFSET(_ptr, _offset)
PFN_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_DUPLICATE m_EvtAddressDescriptionDuplicate
BOOLEAN m_InvalidationNeeded
VOID CleanupDescriptions(__in_opt PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER IdDescription, __in_opt PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER AddrDescription)
VOID NotifyDeviceSurpriseRemove(VOID)
#define UNREFERENCED_PARAMETER(P)
WDFDEVICE __inline GetHandle(VOID)
#define STATUS_INVALID_PARAMETER
struct _LIST_ENTRY * Blink
PDEVICE_OBJECT Objects[1]
FxChildListScanForChildrenCallback m_EvtScanForChildren
VOID UpdateAllAsPresent(__in_opt PULONG ScanTag=NULL)
PFN_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_COPY m_EvtAddressDescriptionCopy
PFN_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_CLEANUP m_EvtAddressDescriptionCleanup
_Must_inspect_result_ NTSTATUS DuplicateAddress(__out PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER Dest, __in PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER Source)
#define STATUS_OBJECT_NAME_EXISTS
virtual BOOLEAN Dispose(VOID)
struct _WDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER * PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER
WDFDEVICE GetDevice(VOID)
static size_t _ComputeRelationsSize(__in ULONG Count)
VOID SetTransactionedObject(__in FxObject *Object)
VOID InvokeReportedMissingCallback(VOID)
BOOLEAN m_AddedToStaticList
_Must_inspect_result_ NTSTATUS ProcessBusRelations(__inout PDEVICE_RELATIONS *DeviceRelations)
static const WCHAR Description[]
LIST_ENTRY m_ModificationLink
#define InsertTailList(ListHead, Entry)
#define TRACE_LEVEL_INFORMATION
VOID EndIteration(__inout PWDF_CHILD_LIST_ITERATOR Iterator)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
PFN_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_CLEANUP m_EvtIdentificationDescriptionCleanup
#define STATUS_INVALID_DEVICE_STATE
_Must_inspect_result_ _In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR _Out_ WDFDEVICE _Inout_opt_ PWDF_CHILD_RETRIEVE_INFO Info
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
CfxDevice * GetDeviceFromId(__inout PWDF_CHILD_RETRIEVE_INFO Info)
_Must_inspect_result_ NTSTATUS UpdateDeviceAsMissing(__in CfxDevice *Device)
FxChildList(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in size_t TotalDescriptionSize, __in CfxDevice *Device, __in BOOLEAN Static)
_Must_inspect_result_ NTSTATUS DuplicateId(__out PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER Dest, __in PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER Source)
CHECK_RETURN_IF_USER_MODE __inline NTSTATUS Initialize(__in EVENT_TYPE Type, __in BOOLEAN InitialState)
_Must_inspect_result_ _In_ WDFDEVICE _In_ NTSTATUS WaitWakeStatus
BOOLEAN m_FoundInLastScan
#define TRACE_LEVEL_VERBOSE
VOID BeginScan(__out_opt PULONG ScanTag=NULL)
PFN_WDF_CHILD_LIST_DEVICE_REENUMERATED m_EvtChildListDeviceReenumerated
~FxDeviceDescriptionEntry()
VOID EndScan(__inout_opt PULONG ScanTag=NULL)
#define ASSERTMSG(msg, exp)
VOID ProcessModificationsLocked(__inout PLIST_ENTRY FreeListHead)
FORCEINLINE size_t WDF_ALIGN_SIZE_UP(_In_ size_t Length, _In_ size_t AlignTo)
FxChildList * GetParentList(VOID)
VOID MarkDisposeOverride(__in FxObjectLockState State=ObjectLock)
PVOID __inline GetObjectHandle(VOID)
FORCEINLINE VOID KeInitializeSpinLock(_Out_ PKSPIN_LOCK SpinLock)
struct _DEVICE_RELATIONS * PDEVICE_RELATIONS
friend struct FxDeviceDescriptionEntry
_Inout_ PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER AddressDescription
FxChildListModificationState m_ModificationState
PFN_WDF_CHILD_LIST_CREATE_DEVICE m_Method
VOID PostParentToD0(VOID)
FORCEINLINE PLIST_ENTRY RemoveHeadList(_Inout_ PLIST_ENTRY ListHead)
VOID GetAddressDescriptionFromEntry(__in FxDeviceDescriptionEntry *Entry, __out PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER AddressDescription)
BOOLEAN IsStaticList(VOID)
FxChildListDescriptionState m_DescriptionState
FxTransactionedEntry m_TransactionLink
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
struct _LIST_ENTRY * Flink
__inline NTSTATUS FxVerifierCheckIrqlLevel(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in KIRQL Irql)
WDF_EXTERN_C_START enum _WDF_CHILD_LIST_RETRIEVE_DEVICE_STATUS WDF_CHILD_LIST_RETRIEVE_DEVICE_STATUS
PFX_DRIVER_GLOBALS pFxDriverGlobals
_Must_inspect_result_ _In_ ULONG Flags
BOOLEAN m_PendingDeleteOnScanEnd
VOID ProcessDeviceRemoved(VOID)
MdDeviceObject __inline GetPhysicalDevice(VOID)
VOID CancelScan(__in BOOLEAN EndTheScan, __inout_opt PULONG ScanTag)
#define NT_SUCCESS(StatCode)
#define STATUS_NO_SUCH_DEVICE
_Must_inspect_result_ NTSTATUS GetAddressDescription(__in PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER IdentificationDescription, __out PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER AddressDescription)
PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER m_AddressDescription
FxChildListCreateDeviceCallback m_EvtCreateDevice
#define KeAcquireSpinLock(sl, irql)
_In_ WDFCHILDLIST _In_ PWDF_CHILD_LIST_ITERATOR Iterator
#define ObDereferenceObject
VOID IndicateWakeStatus(__in NTSTATUS WakeWakeStatus)
WDFCHILDLIST GetHandle(VOID)
PFN_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COMPARE m_EvtIdentificationDescriptionCompare
_In_ PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER IdentificationDescription
__inline FxPkgPdo * GetPdoPkg(VOID)
BOOLEAN IsDeviceRemoved(VOID)
ULONG m_AddressDescriptionSize
VOID Initialize(__in PWDF_CHILD_LIST_CONFIG Config)
#define STATUS_UNSUCCESSFUL
#define ExAllocatePoolWithTag(hernya, size, tag)
__inline FxDriver * GetDriver(VOID)
_Must_inspect_result_ NTSTATUS Add(__in PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER IdentificationDescription, __in_opt PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER AddressDescription, __in_opt PULONG ScanTag=NULL)
__inline WDF_DEVICE_PNP_STATE GetDevicePnpState()
VOID MarkNoDeleteDDI(__in FxObjectLockState State=ObjectLock)
VOID DrainFreeListHead(__inout PLIST_ENTRY FreeListHead)
FxDeviceDescriptionEntry(__inout FxChildList *DeviceList, __in ULONG AddressDescriptionSize, __in ULONG IdentificationDescriptionSize)
VOID ReenumerateEntry(__inout FxDeviceDescriptionEntry *Entry)
_Must_inspect_result_ _In_ WDFDEVICE Device
PFN_WDF_CHILD_LIST_SCAN_FOR_CHILDREN m_Method
_Must_inspect_result_ FxDeviceDescriptionEntry * Clone(__inout PLIST_ENTRY FreeListHead)
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_CHILD_LIST_CONFIG Config
MdDeviceObject __inline GetSafePhysicalDevice(VOID)
#define TRACE_LEVEL_ERROR
#define TRACE_LEVEL_WARNING
_Must_inspect_result_ _In_ WDFDEVICE _In_ PWDF_CHILD_LIST_CONFIG _In_opt_ PWDF_OBJECT_ATTRIBUTES _Out_ WDFCHILDLIST * ChildList
static FxDeviceDescriptionEntry * _FromModificationLink(__in PLIST_ENTRY Link)
VOID NotifyDeviceRemove(__inout PLONG ChildCount)
VOID NTAPI IoInvalidateDeviceRelations(IN PDEVICE_OBJECT DeviceObject, IN DEVICE_RELATION_TYPE Type)
FxDeviceDescriptionEntry * m_Description
__inline PFX_DRIVER_GLOBALS GetDriverGlobals(VOID)
#define InterlockedIncrement
VOID MarkDescriptionNotPresentWorker(__inout FxDeviceDescriptionEntry *DescriptionEntry, __in BOOLEAN ModificationCanBeQueued)
LIST_ENTRY m_DescriptionLink
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
BOOLEAN m_ProcessingSurpriseRemove
static FxDeviceDescriptionEntry * _FromDescriptionLink(__in PLIST_ENTRY Link)
_Must_inspect_result_ NTSTATUS VerifyDescriptionEntry(__in PLIST_ENTRY Entry)
#define InitializeListHead(ListHead)
BOOLEAN IsDeviceReportedMissing(VOID)
DoTraceLevelMessage(pFxDriverGlobals, TRACE_LEVEL_VERBOSE, TRACINGPNP, "Enter, WDFDEVICE %p", Device)
size_t m_TotalDescriptionSize
#define STATUS_INVALID_DEVICE_OBJECT_PARAMETER
_Must_inspect_result_ NTSTATUS UpdateAsMissing(__in PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER Description)
#define KeReleaseSpinLock(sl, irql)
static _Must_inspect_result_ NTSTATUS _CreateAndInit(__out FxChildList **ChildList, __in PFX_DRIVER_GLOBALS FxDriverGlobals, __in PWDF_OBJECT_ATTRIBUTES ListAttributes, __in size_t TotalDescriptionSize, __in CfxDevice *Device, __in PWDF_CHILD_LIST_CONFIG ListConfig, __in BOOLEAN Static=FALSE)
PFN_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_DUPLICATE m_EvtIdentificationDescriptionDuplicate
virtual VOID RemoveChildList(__inout FxChildList *List)
VOID CopyId(__out PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER Dest, __in PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER Source)
virtual VOID AddChildList(__inout FxChildList *List)
VOID DeleteFromFailedCreate(VOID)
static _Must_inspect_result_ NTSTATUS _ComputeTotalDescriptionSize(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in PWDF_CHILD_LIST_CONFIG Config, __in size_t *TotalDescriptionSize)
#define ObReferenceObject
BOOLEAN CreateDevice(__inout FxDeviceDescriptionEntry *Entry, __inout PBOOLEAN InvalidateRelations)
struct _WDF_CHILD_ADDRESS_DESCRIPTION_HEADER * PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER
#define RtlZeroMemory(Destination, Length)
ULONG m_IdentificationDescriptionSize
#define RtlCopyMemory(Destination, Source, Length)
VOID DeviceSurpriseRemoved(VOID)
static _Must_inspect_result_ NTSTATUS _ValidateConfig(__in PFX_DRIVER_GLOBALS FxDriverGlobals, __in PWDF_CHILD_LIST_CONFIG Config, __in size_t *TotalDescriptionSize)
VOID UpdateAddressDescriptionFromEntry(__inout FxDeviceDescriptionEntry *Entry, __in PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER AddressDescription)
PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER m_IdentificationDescription
BOOLEAN CompareId(__in PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER Lhs, __in PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER Rhs)
WDFDEVICE GetNextStaticDevice(__in WDFDEVICE PreviousDevice, __in ULONG Flags)
static SERVICE_STATUS status
VOID BeginIteration(__inout PWDF_CHILD_LIST_ITERATOR Iterator)
BOOLEAN ReenumerateEntryLocked(__inout FxDeviceDescriptionEntry *Entry, __in BOOLEAN FromQDR)
base of all file and directory entries
description Header IdentificationDescriptionSize
FxVerifierDbgBreakPoint(pFxDriverGlobals)
VOID InitIterator(__inout PWDF_CHILD_LIST_ITERATOR Iterator)