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) {
472 Info->IdentificationDescription);
479 Info->IdentificationDescription);
497 pEntry->m_AddressDescription);
571 "Begin scan on WDFCHILDLIST %p, scan count %d",
574 if (ScanTag !=
NULL) {
620 if (ScanTag !=
NULL) {
635 "End scan on WDFCHILDLIST %p, scan count %d",
657 "entry %p modified in last scan, " 658 "mod state %!FxChildListModificationState!," 659 "desc state %!FxChildListDescriptionState!",
661 pEntry->m_DescriptionState);
664 switch (
pEntry->m_ModificationState) {
675 "clone of PDO WDFDEVICE %p, !devobj %p dropped because " 676 "it is missing",
pEntry->m_Pdo->GetHandle(),
677 pEntry->m_Pdo->GetDeviceObject());
716 if (
pEntry->m_PendingDeleteOnScanEnd) {
734 "marking PDO WDFDEVICE %p, !devobj %p as not present",
735 pEntry->m_Pdo->GetHandle(),
736 pEntry->m_Pdo->GetDeviceObject());
742 "marking PDO (entry %p) which needs instantiation as " 846 "Begin iteration on WDFCHILDLIST %p, scan count %d",
858 "end iteration on WDFCHILDLIST");
897 "WDFCHILDLIST %p cannot retrieve next device if the list is not " 932 Info->EvtChildListIdentificationDescriptionCompare !=
NULL) {
934 found =
Info->EvtChildListIdentificationDescriptionCompare(
936 Info->IdentificationDescription,
937 pEntry->m_IdentificationDescription);
964 if (
Info->IdentificationDescription !=
NULL) {
966 pEntry->m_IdentificationDescription);
968 if (
Info->AddressDescription !=
NULL) {
970 pEntry->m_AddressDescription);
973 Info->Status = dstatus;
1014 Info->EvtChildListIdentificationDescriptionCompare !=
NULL) {
1016 found =
Info->EvtChildListIdentificationDescriptionCompare(
1018 Info->IdentificationDescription,
1019 pEntry->m_IdentificationDescription);
1029 if (
Info->IdentificationDescription !=
NULL) {
1031 pEntry->m_IdentificationDescription);
1033 if (
Info->AddressDescription !=
NULL) {
1035 pEntry->m_AddressDescription);
1048 if (found ==
FALSE) {
1060 __in WDFDEVICE PreviousDevice,
1075 if (PreviousDevice ==
NULL) {
1112 if (
pEntry->m_PendingDeleteOnScanEnd) {
1128 else if (pStatic->
Pdo->
GetHandle() == PreviousDevice) {
1150 if (
pEntry->m_PendingDeleteOnScanEnd) {
1166 else if (pStatic->
Pdo->
GetHandle() == PreviousDevice) {
1214 if (
pEntry->IsPresent()) {
1292 if (found ==
FALSE) {
1315 if (
pEntry->IsPresent()) {
1360 if (FromQDR ==
FALSE) {
1371 "Inserting clone modification for PDO WDFDEVICE %p, !devobj %p",
1372 Entry->m_Pdo->GetHandle(),
Entry->m_Pdo->GetDeviceObject());
1390 "Requested reenumeration for PDO WDFDEVICE %p, !devobj %p" 1391 " no possible (pending mod %d, currently present %d)",
1392 Entry->m_Pdo->GetHandle(),
Entry->m_Pdo->GetDeviceObject(),
1432 if (ScanTag !=
NULL) {
1448 pNext =
pCur->Flink;
1466 if (
pEntry->IsPresent()) {
1500 if (ScanTag !=
NULL) {
1516 allocNewEntry =
FALSE;
1526 switch (
pEntry->m_ModificationState) {
1548 allocNewEntry =
TRUE;
1586 allocNewEntry =
TRUE;
1590 if (allocNewEntry) {
1610 &
pEntry->m_ModificationLink);
1686 "attempting to clone PDO WDFDEVICE %p, !devobj %p, From QDR %d",
1687 Entry->m_Pdo->GetHandle(),
Entry->m_Pdo->GetDeviceObject(), FromQDR);
1689 invalidateRelations =
FALSE;
1691 pClone =
Entry->Clone(FreeListHead);
1693 if (pClone !=
NULL) {
1701 Entry->m_Pdo->GetHandle(),
1702 Entry->m_AddressDescription,
1713 "clone successful (new entry is %p), marking PDO " 1714 "WDFDEVICE %p, !devobj %p as missing", pClone,
1715 Entry->m_Pdo->GetHandle(),
Entry->m_Pdo->GetDeviceObject());
1732 if (FromQDR ==
FALSE) {
1734 invalidateRelations =
TRUE;
1751 return invalidateRelations;
1770 "Not processing modifications on WDFCHILDLIST %p (list state %d, " 1777 "Begin processing modifications on WDFCHILDLIST %p",
GetObjectHandle());
1787 pNext =
pCur->Flink;
1791 switch (
pEntry->m_ModificationState) {
1816 invalidateRelations =
FALSE;
1829 "entry %p, mod state is %!FxChildListModificationState!",
1832 switch (
pEntry->m_ModificationState) {
1843 "processing remove on entry %p, description state is " 1844 "%!FxChildListDescriptionState!",
1847 switch (
pEntry->m_DescriptionState) {
1860 "entry %p never reported to pnp, mark for deletion",
pEntry);
1869 "committing PDO WDFDEVICE %p, !devobj %p as not present",
1870 pEntry->m_Pdo->GetHandle(),
pEntry->m_Pdo->GetDeviceObject());
1873 invalidateRelations =
TRUE;
1893 "marking entry %p as needing instantiation",
pEntry);
1897 invalidateRelations =
TRUE;
1910 if (invalidateRelations) {
1931 "end processing modifications on WDFCHILDLIST %p",
GetObjectHandle());
1964 ASSERT(DescriptionEntry->IsPresent());
1968 if (ModificationCanBeQueued) {
1969 if (
IsListEmpty(&DescriptionEntry->m_ModificationLink)) {
1976 ASSERT(DescriptionEntry->m_ModificationState ==
1978 ASSERT(DescriptionEntry->m_FoundInLastScan ==
FALSE);
1995 DescriptionEntry->m_FoundInLastScan =
FALSE;
1998 &DescriptionEntry->m_ModificationLink);
2026 switch (ModificationEntry->m_ModificationState) {
2048 InsertTailList(FreeListHead, &ModificationEntry->m_DescriptionLink);
2151 pEntry->m_AddressDescription);
2265 init.CreatedDevice =
2282 init.CreatedDevice->Destroy();
2285 *InvalidateRelations =
TRUE;
2303 "EvtChildListCreateDevice returned a successful status " 2304 "%!STATUS! but did not create a device object",
status);
2354 "WDFDEVICE %p !devobj %p created, but EvtChildListCreateDevice " 2355 "returned status %!STATUS!",
init.CreatedDevice->GetHandle(),
2356 init.CreatedDevice->GetDeviceObject(),
status);
2369 (
void)
init.CreatedDevice->DeleteDeviceFromFailedCreate(
2423 BOOLEAN needToReportMissingChildren, invalidateRelations, cleanupRelations;
2424 ULONG additionalCount, totalCount,
i;
2432 pNewRelations =
NULL;
2433 invalidateRelations =
FALSE;
2434 cleanupRelations =
TRUE;
2447 additionalCount = 0;
2448 needToReportMissingChildren =
FALSE;
2456 switch (
pEntry->m_DescriptionState) {
2472 "PDO WDFDEVICE %p !devobj %p in a not present state, need to " 2473 "report as missing",
2474 pEntry->m_Pdo->GetHandle(),
pEntry->m_Pdo->GetDeviceObject());
2476 needToReportMissingChildren =
TRUE;
2493 pPriorRelations = *DeviceRelations;
2506 if (additionalCount == 0 &&
2507 (needToReportMissingChildren ==
FALSE || pPriorRelations !=
NULL)) {
2519 if (needToReportMissingChildren) {
2533 "PDO WDFDEVICE %p !devobj %p reported as missing to pnp",
2534 pEntry->m_Pdo->GetHandle(),
pEntry->m_Pdo->GetDeviceObject());
2544 "Nothing to report on WDFCHILDLIST %p, returning early",
GetHandle());
2547 cleanupRelations =
FALSE;
2555 totalCount = additionalCount;
2556 if (pPriorRelations !=
NULL) {
2557 totalCount += pPriorRelations->
Count;
2565 if (pNewRelations ==
NULL) {
2570 "Could not allocate relations for %d devices",
2578 cleanupRelations =
FALSE;
2583 invalidateRelations =
TRUE;
2586 if (needToReportMissingChildren) {
2589 "WDFCHILDLIST %p could not allocate relations required for " 2590 "reporting children as missing after max retries",
2596 "WDFCHILDLIST %p retried %d times to report relations, but " 2600 if (pPriorRelations ==
NULL) {
2629 switch (
pEntry->m_DescriptionState) {
2640 "PDO WDFDEVICE %p !devobj %p being marked as missing " 2641 "because of failure to allocate device relations and " 2642 "an already existing relations %p",
2643 pEntry->m_Pdo->GetHandle(),
2644 pEntry->m_Pdo->GetDeviceObject(), pPriorRelations);
2652 "PDO WDFDEVICE %p !devobj %p being cloned " 2653 "because of the failure to allocate device " 2655 pEntry->m_Pdo->GetHandle(),
2656 pEntry->m_Pdo->GetDeviceObject());
2665 "PDO WDFDEVICE %p !devobj %p is a statically " 2666 "enumerated PDO therefore can not be cloned and is " 2667 "being marked missing because of failure to " 2668 "allocate device relations. It will be surprise " 2669 "removed by pnp manager. Bus driver may continue " 2670 "to function normally but will lose this child PDO",
2671 pEntry->m_Pdo->GetHandle(),
2672 pEntry->m_Pdo->GetDeviceObject());
2685 "PDO WDFDEVICE %p !devobj %p reported as missing to pnp " 2686 "(by using existing relations)",
2687 pEntry->m_Pdo->GetHandle(),
2688 pEntry->m_Pdo->GetDeviceObject());
2702 if (pPriorRelations !=
NULL && pPriorRelations->
Count > 0) {
2705 "WDFCHILDLIST %p prior relations %p contained %d objects",
2727 switch (
pEntry->m_DescriptionState) {
2733 "Creating PDO device object from reported device");
2740 "PDO created successfully, WDFDEVICE %p !devobj %p",
2741 pEntry->m_Pdo->GetHandle(),
pEntry->m_Pdo->GetDeviceObject());
2748 "Reporting PDO WDFDEVICE %p !devobj %p",
2749 pEntry->m_Pdo->GetHandle(),
2750 pEntry->m_Pdo->GetDeviceObject());
2755 pNewRelations->
Count++;
2764 "PDO WDFDEVICE %p !devobj %p reported as missing to pnp",
2765 pEntry->m_Pdo->GetHandle(),
pEntry->m_Pdo->GetDeviceObject());
2797 if (invalidateRelations) {
2810 if (cleanupRelations) {
2811 if (pPriorRelations !=
NULL) {
2814 "Freeing prior relations %p", pPriorRelations);
2817 pPriorRelations =
NULL;
2821 for(
i = 0;
i < pNewRelations->
Count;
i++) {
2826 pNewRelations =
NULL;
2829 *DeviceRelations = pNewRelations;
2867 (
pEntry->m_Pdo->GetPdoPkg())->m_DeviceReportedMissing.Invoke(
2868 pEntry->m_Pdo->GetHandle());
2898 if (
pEntry->m_PendingDeleteOnScanEnd) {
2940 if (
pEntry->m_PendingDeleteOnScanEnd) {
2991 pNext =
pCur->Flink;
3011 if (
pEntry->IsPresent()) {
3064 "WDFCHILDLIST %p: removing children",
GetHandle());
3099 if (
pEntry->m_ProcessingSurpriseRemove ==
FALSE) {
3112 "Removing entry %p, WDFDEVICE %p, PDO %p",
3114 pEntry->m_Pdo->GetPhysicalDevice());
3129 pEntry->m_Pdo->SetParentWaitingOnRemoval();
3153 __in size_t* TotalDescriptionSize
3161 "Invalid Config, NULL is not allowed, %!STATUS!",
status);
3168 "Config->Size incorrect, expected %d, got %d, %!STATUS!",
3172 if (
Config->IdentificationDescriptionSize == 0) {
3175 "Config->IdentificationDescriptionSize must be non zero, " 3179 if (
Config->EvtChildListCreateDevice ==
NULL) {
3182 "Config->EvtChildListCreateDevice, NULL is not allowed, " 3189 TotalDescriptionSize);
3197 __in size_t* TotalDescriptionSize
3200 size_t addressAligned, idAligned;
3203 *TotalDescriptionSize = 0;
3223 "Config->IdentificationDescriptionSize %d too large" 3224 "%!STATUS!",
Config->IdentificationDescriptionSize,
3231 if (addressAligned < Config->AddressDescriptionSize) {
3234 "Config->AddressDescriptionSize %d too large, %!STATUS!",
3242 TotalDescriptionSize
3247 "Could not add ID description size to block size, %!STATUS!",
3252 status = RtlSizeTAdd(*TotalDescriptionSize,
3254 TotalDescriptionSize);
3258 "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
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)
VOID NTAPI KeAcquireSpinLock(PKSPIN_LOCK SpinLock, PKIRQL OldIrql)
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
_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)
#define _Must_inspect_result_
_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)