xref: /reactos/sdk/include/wdf/kmdf/1.17/wdfchildlist.h (revision 682f85ad)
1 /*++
2 
3 Copyright (c) Microsoft Corporation.  All rights reserved.
4 
5 _WdfVersionBuild_
6 
7 Module Name:
8 
9     WdfChildList.hpp
10 
11 Abstract:
12 
13     This module defines the set of APIs to manipulate a WDFCHILDLIST handle.  A
14     WDFCHILDLIST handle maintains a list of descriptions representing
15     dynamically enumerated child devices.
16 
17 Environment:
18 
19     kernel mode only
20 
21 Revision History:
22 
23 --*/
24 
25 //
26 // NOTE: This header is generated by stubwork.  Please make any
27 //       modifications to the corresponding template files
28 //       (.x or .y) and use stubwork to regenerate the header
29 //
30 
31 #ifndef _WDFCHILDLIST_H_
32 #define _WDFCHILDLIST_H_
33 
34 #ifndef WDF_EXTERN_C
35   #ifdef __cplusplus
36     #define WDF_EXTERN_C       extern "C"
37     #define WDF_EXTERN_C_START extern "C" {
38     #define WDF_EXTERN_C_END   }
39   #else
40     #define WDF_EXTERN_C
41     #define WDF_EXTERN_C_START
42     #define WDF_EXTERN_C_END
43   #endif
44 #endif
45 
46 WDF_EXTERN_C_START
47 
48 
49 
50 #if (NTDDI_VERSION >= NTDDI_WIN2K)
51 
52 typedef enum _WDF_CHILD_LIST_RETRIEVE_DEVICE_STATUS {
53     WdfChildListRetrieveDeviceUndefined = 0,
54     WdfChildListRetrieveDeviceSuccess,
55     WdfChildListRetrieveDeviceNotYetCreated,
56     WdfChildListRetrieveDeviceNoSuchDevice,
57 } WDF_CHILD_LIST_RETRIEVE_DEVICE_STATUS, *PWDF_CHILD_LIST_RETRIEVE_DEVICE_STATUS;
58 
59 typedef enum _WDF_RETRIEVE_CHILD_FLAGS {
60     WdfRetrieveUnspecified = 0x0000,
61     WdfRetrievePresentChildren = 0x0001,
62     WdfRetrieveMissingChildren = 0x0002,
63     WdfRetrievePendingChildren = 0x0004,
64     WdfRetrieveAddedChildren = (WdfRetrievePresentChildren | WdfRetrievePendingChildren),
65     WdfRetrieveAllChildren = (WdfRetrievePresentChildren | WdfRetrievePendingChildren | WdfRetrieveMissingChildren),
66 } WDF_RETRIEVE_CHILD_FLAGS;
67 
68 
69 
70 typedef struct _WDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER {
71     //
72     // Size in bytes of the entire description, including this header.
73     //
74     // Same value as WDF_CHILD_LIST_CONFIG::IdentificationDescriptionSize
75     // Used as a sanity check.
76     //
77     ULONG IdentificationDescriptionSize;
78 }   WDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER,
79   *PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER;
80 
81 FORCEINLINE
82 VOID
83 WDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER_INIT(
84     _Out_ PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER Header,
85     _In_ ULONG IdentificationDescriptionSize
86     )
87 {
88     RtlZeroMemory(Header, IdentificationDescriptionSize);
89     Header->IdentificationDescriptionSize = IdentificationDescriptionSize;
90 }
91 
92 typedef struct _WDF_CHILD_ADDRESS_DESCRIPTION_HEADER {
93     //
94     // Size in bytes of the entire description, including this header.
95     //
96     // Same value as WDF_CHILD_LIST_CONFIG::AddressDescriptionSize
97     // Used as a sanity check.
98     //
99     ULONG AddressDescriptionSize;
100 }   WDF_CHILD_ADDRESS_DESCRIPTION_HEADER,
101   *PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER;
102 
103 FORCEINLINE
104 VOID
105 WDF_CHILD_ADDRESS_DESCRIPTION_HEADER_INIT(
106     _Out_ PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER Header,
107     _In_ ULONG AddressDescriptionSize
108     )
109 {
110     RtlZeroMemory(Header, AddressDescriptionSize);
111     Header->AddressDescriptionSize = AddressDescriptionSize;
112 }
113 
114 typedef
115 _Function_class_(EVT_WDF_CHILD_LIST_CREATE_DEVICE)
116 _IRQL_requires_same_
117 _IRQL_requires_max_(PASSIVE_LEVEL)
118 NTSTATUS
119 STDCALL
120 EVT_WDF_CHILD_LIST_CREATE_DEVICE(
121     _In_
122     WDFCHILDLIST ChildList,
123     _In_
124     PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER IdentificationDescription,
125     _In_
126     PWDFDEVICE_INIT ChildInit
127     );
128 
129 typedef EVT_WDF_CHILD_LIST_CREATE_DEVICE *PFN_WDF_CHILD_LIST_CREATE_DEVICE;
130 
131 typedef
132 _Function_class_(EVT_WDF_CHILD_LIST_SCAN_FOR_CHILDREN)
133 _IRQL_requires_same_
134 _IRQL_requires_max_(PASSIVE_LEVEL)
135 VOID
136 STDCALL
137 EVT_WDF_CHILD_LIST_SCAN_FOR_CHILDREN(
138     _In_
139     WDFCHILDLIST ChildList
140     );
141 
142 typedef EVT_WDF_CHILD_LIST_SCAN_FOR_CHILDREN *PFN_WDF_CHILD_LIST_SCAN_FOR_CHILDREN;
143 
144 typedef
145 _Function_class_(EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COPY)
146 _IRQL_requires_same_
147 _IRQL_requires_max_(DISPATCH_LEVEL)
148 VOID
149 STDCALL
150 EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COPY(
151     _In_
152     WDFCHILDLIST ChildList,
153     _In_
154     PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER SourceIdentificationDescription,
155     _Out_
156     PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER DestinationIdentificationDescription
157     );
158 
159 typedef EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COPY *PFN_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COPY;
160 
161 typedef
162 _Function_class_(EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_DUPLICATE)
163 _IRQL_requires_same_
164 _IRQL_requires_max_(DISPATCH_LEVEL)
165 NTSTATUS
166 STDCALL
167 EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_DUPLICATE(
168     _In_
169     WDFCHILDLIST ChildList,
170     _In_
171     PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER SourceIdentificationDescription,
172     _Out_
173     PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER DestinationIdentificationDescription
174     );
175 
176 typedef EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_DUPLICATE *PFN_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_DUPLICATE;
177 
178 typedef
179 _Function_class_(EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COMPARE)
180 _IRQL_requires_same_
181 _IRQL_requires_max_(DISPATCH_LEVEL)
182 BOOLEAN
183 STDCALL
184 EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COMPARE(
185     _In_
186     WDFCHILDLIST ChildList,
187     _In_
188     PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER FirstIdentificationDescription,
189     _In_
190     PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER SecondIdentificationDescription
191     );
192 
193 typedef EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COMPARE *PFN_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COMPARE;
194 
195 typedef
196 _Function_class_(EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_CLEANUP)
197 _IRQL_requires_same_
198 _IRQL_requires_max_(DISPATCH_LEVEL)
199 VOID
200 STDCALL
201 EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_CLEANUP(
202     _In_
203     WDFCHILDLIST ChildList,
204     _Inout_
205     PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER IdentificationDescription
206     );
207 
208 typedef EVT_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_CLEANUP *PFN_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_CLEANUP;
209 
210 typedef
211 _Function_class_(EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_COPY)
212 _IRQL_requires_same_
213 _IRQL_requires_max_(DISPATCH_LEVEL)
214 VOID
215 STDCALL
216 EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_COPY(
217     _In_
218     WDFCHILDLIST ChildList,
219     _In_
220     PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER SourceAddressDescription,
221     _Out_
222     PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER DestinationAddressDescription
223     );
224 
225 typedef EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_COPY *PFN_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_COPY;
226 
227 typedef
228 _Function_class_(EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_DUPLICATE)
229 _IRQL_requires_same_
230 _IRQL_requires_max_(DISPATCH_LEVEL)
231 NTSTATUS
232 STDCALL
233 EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_DUPLICATE(
234     _In_
235     WDFCHILDLIST ChildList,
236     _In_
237     PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER SourceAddressDescription,
238     _Out_
239     PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER DestinationAddressDescription
240     );
241 
242 typedef EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_DUPLICATE *PFN_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_DUPLICATE;
243 
244 typedef
245 _Function_class_(EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_CLEANUP)
246 _IRQL_requires_same_
247 _IRQL_requires_max_(DISPATCH_LEVEL)
248 VOID
249 STDCALL
250 EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_CLEANUP(
251     _In_
252     WDFCHILDLIST ChildList,
253     _Inout_
254     PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER AddressDescription
255     );
256 
257 typedef EVT_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_CLEANUP *PFN_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_CLEANUP;
258 
259 typedef
260 _Function_class_(EVT_WDF_CHILD_LIST_DEVICE_REENUMERATED)
261 _IRQL_requires_same_
262 _IRQL_requires_max_(DISPATCH_LEVEL)
263 BOOLEAN
264 STDCALL
265 EVT_WDF_CHILD_LIST_DEVICE_REENUMERATED(
266     _In_
267     WDFCHILDLIST ChildList,
268     _In_
269     WDFDEVICE OldDevice,
270     _In_
271     PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER OldAddressDescription,
272     _Out_
273     PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER NewAddressDescription
274     );
275 
276 typedef EVT_WDF_CHILD_LIST_DEVICE_REENUMERATED *PFN_WDF_CHILD_LIST_DEVICE_REENUMERATED;
277 
278 typedef struct _WDF_CHILD_RETRIEVE_INFO {
279     //
280     // Size of the structure in bytes
281     //
282     ULONG Size;
283 
284     //
285     // Must be a valid pointer when passed in, copied into upon success
286     //
287     PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER IdentificationDescription;
288 
289     //
290     // Optional pointer when passed in, copied into upon success
291     //
292     PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER AddressDescription;
293 
294     //
295     // Status of the returned device
296     //
297     WDF_CHILD_LIST_RETRIEVE_DEVICE_STATUS Status;
298 
299     //
300     // If provided, will be used for searching through the list of devices
301     // instead of the default list ID compare function
302     //
303     PFN_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COMPARE EvtChildListIdentificationDescriptionCompare;
304 
305 } WDF_CHILD_RETRIEVE_INFO, *PWDF_CHILD_RETRIEVE_INFO;
306 
307 FORCEINLINE
308 VOID
309 WDF_CHILD_RETRIEVE_INFO_INIT(
310     _Out_ PWDF_CHILD_RETRIEVE_INFO Info,
311     _In_ PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER IdentificationDescription
312     )
313 {
314     RtlZeroMemory(Info, sizeof(WDF_CHILD_RETRIEVE_INFO));
315 
316     Info->Size = sizeof(WDF_CHILD_RETRIEVE_INFO);
317     Info->IdentificationDescription = IdentificationDescription;
318 }
319 
320 typedef struct _WDF_CHILD_LIST_CONFIG {
321     //
322     // Size of this structure in bytes
323     //
324     ULONG Size;
325 
326     //
327     // The size in bytes of an identificaiton description to be used with the
328     // created WDFCHILDLIST handle
329     //
330     ULONG IdentificationDescriptionSize;
331 
332     //
333     // Optional size in bytes of an address description to be used with the
334     // created WDFCHILDLIST handle.
335     //
336     ULONG AddressDescriptionSize;
337 
338     //
339     // Required callback to be invoked when a description on the device list
340     // needs to be converted into a real WDFDEVICE handle.
341     //
342     PFN_WDF_CHILD_LIST_CREATE_DEVICE EvtChildListCreateDevice;
343 
344     //
345     // Optional callback to be invoked when the device list needs to be
346     // rescanned.  This function will be called after the device has entered D0
347     // and been fully initialized but before I/O has started.
348     //
349     PFN_WDF_CHILD_LIST_SCAN_FOR_CHILDREN EvtChildListScanForChildren;
350 
351     //
352     // Optional callback to be invoked when an identification description needs
353     // to be copied from one location to another.
354     //
355     // If left NULL, RtlCopyMemory will be used to copy the description.
356     //
357     PFN_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COPY EvtChildListIdentificationDescriptionCopy;
358 
359     //
360     // Optional callback to be invoked when an identification description needs
361     // to be duplicated.  As opposed to EvtChildListIdentificationDescriptionCopy,
362     // EvtChildListIdentificationDescriptionDuplicate can fail.
363     //
364     PFN_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_DUPLICATE EvtChildListIdentificationDescriptionDuplicate;
365 
366     //
367     // Optional callback to be invoked when an identification description needs
368     // to be cleaned up.  This function should *NOT* free the description passed
369     // to it, just free any associated resources.
370     //
371     PFN_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_CLEANUP EvtChildListIdentificationDescriptionCleanup;
372 
373     //
374     // Optional callback to be invoked when an identification description needs
375     // to be compared with another identificaiton description.
376     //
377     // If left NULL, RtlCompareMemory will be used to compare the two
378     // descriptions.
379     //
380     PFN_WDF_CHILD_LIST_IDENTIFICATION_DESCRIPTION_COMPARE EvtChildListIdentificationDescriptionCompare;
381 
382     //
383     // Optional callback to be invoked when an address description needs
384     // to be copied from one location to another.
385     //
386     // If left NULL, RtlCopyMemory will be used to copy the description.
387     //
388     PFN_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_COPY EvtChildListAddressDescriptionCopy;
389 
390     //
391     // Optional callback to be invoked when an address description needs to be
392     // duplicated.  As opposed to EvtChildListAddressDescriptionCopy,
393     // EvtChildListAddressDescriptionDuplicate can fail.
394     //
395     PFN_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_DUPLICATE EvtChildListAddressDescriptionDuplicate;
396 
397     //
398     // Optional callback to be invoked when an address description needs to be
399     // cleaned up.  This function should *NOT* free the description passed to
400     // it, just free any associated resources.
401     //
402     PFN_WDF_CHILD_LIST_ADDRESS_DESCRIPTION_CLEANUP EvtChildListAddressDescriptionCleanup;
403 
404     //
405     // If provided, will be called when the child's stack requests that the
406     // child be reenumerated.  Returning TRUE allows for the reenumeration to
407     // proceed.  FALSE will no reenumerate the stack.
408     //
409     PFN_WDF_CHILD_LIST_DEVICE_REENUMERATED EvtChildListDeviceReenumerated;
410 
411 } WDF_CHILD_LIST_CONFIG, *PWDF_CHILD_LIST_CONFIG;
412 
413 FORCEINLINE
414 VOID
415 WDF_CHILD_LIST_CONFIG_INIT(
416     _Out_ PWDF_CHILD_LIST_CONFIG Config,
417     _In_  ULONG IdentificationDescriptionSize,
418     _In_  PFN_WDF_CHILD_LIST_CREATE_DEVICE EvtChildListCreateDevice
419     )
420 {
421     RtlZeroMemory(Config, sizeof(WDF_CHILD_LIST_CONFIG));
422 
423     Config->Size = sizeof(WDF_CHILD_LIST_CONFIG);
424     Config->IdentificationDescriptionSize = IdentificationDescriptionSize;
425     Config->EvtChildListCreateDevice = EvtChildListCreateDevice;
426 }
427 
428 typedef struct _WDF_CHILD_LIST_ITERATOR {
429     //
430     // Size of this structure in bytes
431     //
432     ULONG Size;
433 
434     //
435     // What type of devices to return, see WDF_RETRIEVE_CHILD_FLAGS for
436     // flag values
437     //
438     //
439     ULONG Flags;
440 
441     //
442     // For internal use, treat this field as opaque
443     //
444     PVOID Reserved[4];
445 
446 } WDF_CHILD_LIST_ITERATOR, *PWDF_CHILD_LIST_ITERATOR;
447 
448 FORCEINLINE
449 VOID
450 WDF_CHILD_LIST_ITERATOR_INIT(
451     _Out_ PWDF_CHILD_LIST_ITERATOR Iterator,
452     _In_ ULONG Flags
453     )
454 {
455     RtlZeroMemory(Iterator, sizeof(WDF_CHILD_LIST_ITERATOR));
456 
457     Iterator->Size = sizeof(WDF_CHILD_LIST_ITERATOR);
458     Iterator->Flags = Flags;
459 }
460 
461 
462 //
463 // WDF Function: WdfChildListCreate
464 //
465 typedef
466 _Must_inspect_result_
467 _IRQL_requires_max_(PASSIVE_LEVEL)
468 WDFAPI
469 NTSTATUS
470 (STDCALL *PFN_WDFCHILDLISTCREATE)(
471     _In_
472     PWDF_DRIVER_GLOBALS DriverGlobals,
473     _In_
474     WDFDEVICE Device,
475     _In_
476     PWDF_CHILD_LIST_CONFIG Config,
477     _In_opt_
478     PWDF_OBJECT_ATTRIBUTES ChildListAttributes,
479     _Out_
480     WDFCHILDLIST* ChildList
481     );
482 
483 _Must_inspect_result_
484 _IRQL_requires_max_(PASSIVE_LEVEL)
485 FORCEINLINE
486 NTSTATUS
487 WdfChildListCreate(
488     _In_
489     WDFDEVICE Device,
490     _In_
491     PWDF_CHILD_LIST_CONFIG Config,
492     _In_opt_
493     PWDF_OBJECT_ATTRIBUTES ChildListAttributes,
494     _Out_
495     WDFCHILDLIST* ChildList
496     )
497 {
498     return ((PFN_WDFCHILDLISTCREATE) WdfFunctions[WdfChildListCreateTableIndex])(WdfDriverGlobals, Device, Config, ChildListAttributes, ChildList);
499 }
500 
501 //
502 // WDF Function: WdfChildListGetDevice
503 //
504 typedef
505 _IRQL_requires_max_(DISPATCH_LEVEL)
506 WDFAPI
507 WDFDEVICE
508 (STDCALL *PFN_WDFCHILDLISTGETDEVICE)(
509     _In_
510     PWDF_DRIVER_GLOBALS DriverGlobals,
511     _In_
512     WDFCHILDLIST ChildList
513     );
514 
515 _IRQL_requires_max_(DISPATCH_LEVEL)
516 FORCEINLINE
517 WDFDEVICE
518 WdfChildListGetDevice(
519     _In_
520     WDFCHILDLIST ChildList
521     )
522 {
523     return ((PFN_WDFCHILDLISTGETDEVICE) WdfFunctions[WdfChildListGetDeviceTableIndex])(WdfDriverGlobals, ChildList);
524 }
525 
526 //
527 // WDF Function: WdfChildListRetrievePdo
528 //
529 typedef
530 _Must_inspect_result_
531 _IRQL_requires_max_(DISPATCH_LEVEL)
532 WDFAPI
533 WDFDEVICE
534 (STDCALL *PFN_WDFCHILDLISTRETRIEVEPDO)(
535     _In_
536     PWDF_DRIVER_GLOBALS DriverGlobals,
537     _In_
538     WDFCHILDLIST ChildList,
539     _Inout_
540     PWDF_CHILD_RETRIEVE_INFO RetrieveInfo
541     );
542 
543 _Must_inspect_result_
544 _IRQL_requires_max_(DISPATCH_LEVEL)
545 FORCEINLINE
546 WDFDEVICE
547 WdfChildListRetrievePdo(
548     _In_
549     WDFCHILDLIST ChildList,
550     _Inout_
551     PWDF_CHILD_RETRIEVE_INFO RetrieveInfo
552     )
553 {
554     return ((PFN_WDFCHILDLISTRETRIEVEPDO) WdfFunctions[WdfChildListRetrievePdoTableIndex])(WdfDriverGlobals, ChildList, RetrieveInfo);
555 }
556 
557 //
558 // WDF Function: WdfChildListRetrieveAddressDescription
559 //
560 typedef
561 _Must_inspect_result_
562 _IRQL_requires_max_(DISPATCH_LEVEL)
563 WDFAPI
564 NTSTATUS
565 (STDCALL *PFN_WDFCHILDLISTRETRIEVEADDRESSDESCRIPTION)(
566     _In_
567     PWDF_DRIVER_GLOBALS DriverGlobals,
568     _In_
569     WDFCHILDLIST ChildList,
570     _In_
571     PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER IdentificationDescription,
572     _Inout_
573     PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER AddressDescription
574     );
575 
576 _Must_inspect_result_
577 _IRQL_requires_max_(DISPATCH_LEVEL)
578 FORCEINLINE
579 NTSTATUS
580 WdfChildListRetrieveAddressDescription(
581     _In_
582     WDFCHILDLIST ChildList,
583     _In_
584     PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER IdentificationDescription,
585     _Inout_
586     PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER AddressDescription
587     )
588 {
589     return ((PFN_WDFCHILDLISTRETRIEVEADDRESSDESCRIPTION) WdfFunctions[WdfChildListRetrieveAddressDescriptionTableIndex])(WdfDriverGlobals, ChildList, IdentificationDescription, AddressDescription);
590 }
591 
592 //
593 // WDF Function: WdfChildListBeginScan
594 //
595 typedef
596 _IRQL_requires_max_(DISPATCH_LEVEL)
597 WDFAPI
598 VOID
599 (STDCALL *PFN_WDFCHILDLISTBEGINSCAN)(
600     _In_
601     PWDF_DRIVER_GLOBALS DriverGlobals,
602     _In_
603     WDFCHILDLIST ChildList
604     );
605 
606 _IRQL_requires_max_(DISPATCH_LEVEL)
607 FORCEINLINE
608 VOID
609 WdfChildListBeginScan(
610     _In_
611     WDFCHILDLIST ChildList
612     )
613 {
614     ((PFN_WDFCHILDLISTBEGINSCAN) WdfFunctions[WdfChildListBeginScanTableIndex])(WdfDriverGlobals, ChildList);
615 }
616 
617 //
618 // WDF Function: WdfChildListEndScan
619 //
620 typedef
621 _IRQL_requires_max_(DISPATCH_LEVEL)
622 WDFAPI
623 VOID
624 (STDCALL *PFN_WDFCHILDLISTENDSCAN)(
625     _In_
626     PWDF_DRIVER_GLOBALS DriverGlobals,
627     _In_
628     WDFCHILDLIST ChildList
629     );
630 
631 _IRQL_requires_max_(DISPATCH_LEVEL)
632 FORCEINLINE
633 VOID
634 WdfChildListEndScan(
635     _In_
636     WDFCHILDLIST ChildList
637     )
638 {
639     ((PFN_WDFCHILDLISTENDSCAN) WdfFunctions[WdfChildListEndScanTableIndex])(WdfDriverGlobals, ChildList);
640 }
641 
642 //
643 // WDF Function: WdfChildListBeginIteration
644 //
645 typedef
646 _IRQL_requires_max_(DISPATCH_LEVEL)
647 WDFAPI
648 VOID
649 (STDCALL *PFN_WDFCHILDLISTBEGINITERATION)(
650     _In_
651     PWDF_DRIVER_GLOBALS DriverGlobals,
652     _In_
653     WDFCHILDLIST ChildList,
654     _In_
655     PWDF_CHILD_LIST_ITERATOR Iterator
656     );
657 
658 _IRQL_requires_max_(DISPATCH_LEVEL)
659 FORCEINLINE
660 VOID
661 WdfChildListBeginIteration(
662     _In_
663     WDFCHILDLIST ChildList,
664     _In_
665     PWDF_CHILD_LIST_ITERATOR Iterator
666     )
667 {
668     ((PFN_WDFCHILDLISTBEGINITERATION) WdfFunctions[WdfChildListBeginIterationTableIndex])(WdfDriverGlobals, ChildList, Iterator);
669 }
670 
671 //
672 // WDF Function: WdfChildListRetrieveNextDevice
673 //
674 typedef
675 _Must_inspect_result_
676 _IRQL_requires_max_(DISPATCH_LEVEL)
677 WDFAPI
678 NTSTATUS
679 (STDCALL *PFN_WDFCHILDLISTRETRIEVENEXTDEVICE)(
680     _In_
681     PWDF_DRIVER_GLOBALS DriverGlobals,
682     _In_
683     WDFCHILDLIST ChildList,
684     _In_
685     PWDF_CHILD_LIST_ITERATOR Iterator,
686     _Out_
687     WDFDEVICE* Device,
688     _Inout_opt_
689     PWDF_CHILD_RETRIEVE_INFO Info
690     );
691 
692 _Must_inspect_result_
693 _IRQL_requires_max_(DISPATCH_LEVEL)
694 FORCEINLINE
695 NTSTATUS
696 WdfChildListRetrieveNextDevice(
697     _In_
698     WDFCHILDLIST ChildList,
699     _In_
700     PWDF_CHILD_LIST_ITERATOR Iterator,
701     _Out_
702     WDFDEVICE* Device,
703     _Inout_opt_
704     PWDF_CHILD_RETRIEVE_INFO Info
705     )
706 {
707     return ((PFN_WDFCHILDLISTRETRIEVENEXTDEVICE) WdfFunctions[WdfChildListRetrieveNextDeviceTableIndex])(WdfDriverGlobals, ChildList, Iterator, Device, Info);
708 }
709 
710 //
711 // WDF Function: WdfChildListEndIteration
712 //
713 typedef
714 _IRQL_requires_max_(DISPATCH_LEVEL)
715 WDFAPI
716 VOID
717 (STDCALL *PFN_WDFCHILDLISTENDITERATION)(
718     _In_
719     PWDF_DRIVER_GLOBALS DriverGlobals,
720     _In_
721     WDFCHILDLIST ChildList,
722     _In_
723     PWDF_CHILD_LIST_ITERATOR Iterator
724     );
725 
726 _IRQL_requires_max_(DISPATCH_LEVEL)
727 FORCEINLINE
728 VOID
729 WdfChildListEndIteration(
730     _In_
731     WDFCHILDLIST ChildList,
732     _In_
733     PWDF_CHILD_LIST_ITERATOR Iterator
734     )
735 {
736     ((PFN_WDFCHILDLISTENDITERATION) WdfFunctions[WdfChildListEndIterationTableIndex])(WdfDriverGlobals, ChildList, Iterator);
737 }
738 
739 //
740 // WDF Function: WdfChildListAddOrUpdateChildDescriptionAsPresent
741 //
742 typedef
743 _Must_inspect_result_
744 _IRQL_requires_max_(DISPATCH_LEVEL)
745 WDFAPI
746 NTSTATUS
747 (STDCALL *PFN_WDFCHILDLISTADDORUPDATECHILDDESCRIPTIONASPRESENT)(
748     _In_
749     PWDF_DRIVER_GLOBALS DriverGlobals,
750     _In_
751     WDFCHILDLIST ChildList,
752     _In_
753     PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER IdentificationDescription,
754     _In_opt_
755     PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER AddressDescription
756     );
757 
758 _Must_inspect_result_
759 _IRQL_requires_max_(DISPATCH_LEVEL)
760 FORCEINLINE
761 NTSTATUS
762 WdfChildListAddOrUpdateChildDescriptionAsPresent(
763     _In_
764     WDFCHILDLIST ChildList,
765     _In_
766     PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER IdentificationDescription,
767     _In_opt_
768     PWDF_CHILD_ADDRESS_DESCRIPTION_HEADER AddressDescription
769     )
770 {
771     return ((PFN_WDFCHILDLISTADDORUPDATECHILDDESCRIPTIONASPRESENT) WdfFunctions[WdfChildListAddOrUpdateChildDescriptionAsPresentTableIndex])(WdfDriverGlobals, ChildList, IdentificationDescription, AddressDescription);
772 }
773 
774 //
775 // WDF Function: WdfChildListUpdateChildDescriptionAsMissing
776 //
777 typedef
778 _Must_inspect_result_
779 _IRQL_requires_max_(DISPATCH_LEVEL)
780 WDFAPI
781 NTSTATUS
782 (STDCALL *PFN_WDFCHILDLISTUPDATECHILDDESCRIPTIONASMISSING)(
783     _In_
784     PWDF_DRIVER_GLOBALS DriverGlobals,
785     _In_
786     WDFCHILDLIST ChildList,
787     _In_
788     PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER IdentificationDescription
789     );
790 
791 _Must_inspect_result_
792 _IRQL_requires_max_(DISPATCH_LEVEL)
793 FORCEINLINE
794 NTSTATUS
795 WdfChildListUpdateChildDescriptionAsMissing(
796     _In_
797     WDFCHILDLIST ChildList,
798     _In_
799     PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER IdentificationDescription
800     )
801 {
802     return ((PFN_WDFCHILDLISTUPDATECHILDDESCRIPTIONASMISSING) WdfFunctions[WdfChildListUpdateChildDescriptionAsMissingTableIndex])(WdfDriverGlobals, ChildList, IdentificationDescription);
803 }
804 
805 //
806 // WDF Function: WdfChildListUpdateAllChildDescriptionsAsPresent
807 //
808 typedef
809 _IRQL_requires_max_(DISPATCH_LEVEL)
810 WDFAPI
811 VOID
812 (STDCALL *PFN_WDFCHILDLISTUPDATEALLCHILDDESCRIPTIONSASPRESENT)(
813     _In_
814     PWDF_DRIVER_GLOBALS DriverGlobals,
815     _In_
816     WDFCHILDLIST ChildList
817     );
818 
819 _IRQL_requires_max_(DISPATCH_LEVEL)
820 FORCEINLINE
821 VOID
822 WdfChildListUpdateAllChildDescriptionsAsPresent(
823     _In_
824     WDFCHILDLIST ChildList
825     )
826 {
827     ((PFN_WDFCHILDLISTUPDATEALLCHILDDESCRIPTIONSASPRESENT) WdfFunctions[WdfChildListUpdateAllChildDescriptionsAsPresentTableIndex])(WdfDriverGlobals, ChildList);
828 }
829 
830 //
831 // WDF Function: WdfChildListRequestChildEject
832 //
833 typedef
834 _IRQL_requires_max_(DISPATCH_LEVEL)
835 WDFAPI
836 BOOLEAN
837 (STDCALL *PFN_WDFCHILDLISTREQUESTCHILDEJECT)(
838     _In_
839     PWDF_DRIVER_GLOBALS DriverGlobals,
840     _In_
841     WDFCHILDLIST ChildList,
842     _In_
843     PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER IdentificationDescription
844     );
845 
846 _IRQL_requires_max_(DISPATCH_LEVEL)
847 FORCEINLINE
848 BOOLEAN
849 WdfChildListRequestChildEject(
850     _In_
851     WDFCHILDLIST ChildList,
852     _In_
853     PWDF_CHILD_IDENTIFICATION_DESCRIPTION_HEADER IdentificationDescription
854     )
855 {
856     return ((PFN_WDFCHILDLISTREQUESTCHILDEJECT) WdfFunctions[WdfChildListRequestChildEjectTableIndex])(WdfDriverGlobals, ChildList, IdentificationDescription);
857 }
858 
859 
860 
861 #endif // (NTDDI_VERSION >= NTDDI_WIN2K)
862 
863 
864 
865 WDF_EXTERN_C_END
866 
867 #endif // _WDFCHILDLIST_H_
868 
869