框架对象生命周期
框架对象的“生命周期”跨越从创建对象到删除对象的时间。 对象的引用计数控制何时将其删除。
创建框架对象
大多数框架对象都是通过驱动程序调用对象的创建方法创建的。 例如,每个框架驱动程序必须调用 WdfDriverCreate 来创建框架驱动程序对象。
其他框架对象由框架创建。 例如,当用户应用程序打开设备进行读取或写入操作时,框架会创建一个框架文件对象,并将其传递给驱动程序的 EvtDeviceFileCreate 回调函数。
框架或驱动程序可以创建一些框架对象。 例如,当 I/O 管理器将 I/O 请求传递到驱动程序时,框架会创建一个框架请求对象并将其传递给驱动程序,通常通过调用驱动程序的请求处理程序之一。 驱动程序还可以创建框架请求对象并将其传递给其他驱动程序。
使用引用计数
框架为每个对象维护引用计数。 创建对象时,框架将其引用计数设置为 1。 如果引用计数变为零,框架将删除 对象。
驱动程序可以通过调用 WdfObjectReference 来递增引用计数或 调用 WdfObjectDereference 来递减引用计数来修改对象的引用计数。 (仅当驱动程序之前已调用 WdfObjectReference.)
在大多数情况下,驱动程序不必递增或递减对象的引用计数。 框架在将对象的句柄传递给驱动程序之前递增计数,并在驱动程序不再需要该对象时递减计数。
驱动程序调用 WdfObjectReference 以确保在驱动程序使用完对象之前,不会由框架或驱动程序线程) (删除对象。 有关驱动程序应调用 WdfObjectReference 和 WdfObjectDereference 的示例情况,请参阅 同步取消已发送的请求。
删除框架对象
对象被删除是因为驱动程序调用 WdfObjectDelete 或框架调用内部删除例程,但仅当对象的引用计数为零时才被删除。 驱动程序或框架尝试删除对象后,对象的句柄将保持有效,直到引用计数变为零。 驱动程序 无法 通过调用 WdfObjectDereference 将对象的引用计数减少到零来删除对象-驱动程序还必须调用 WdfObjectDelete。
如果框架对象是父对象的子对象,并且正在删除父对象,则框架会尝试先删除子对象,然后再删除父对象。 对象删除从离父级最远的对象开始,并针对根目录执行对象层次结构。
驱动程序可以注册驱动程序或框架删除对象时框架调用的以下两个回调函数:
EvtCleanupCallback 回调函数,框架调用该函数,以便驱动程序可以调用 WdfObjectDereference(如果它以前为要删除的对象调用 WdfObjectReference)。
EvtDestroyCallback 回调函数,框架在对象的引用计数减至零后调用该回调函数。
其中一个回调函数必须解除分配驱动程序在创建对象时分配的任何特定于对象的资源。
框架始终处理某些框架对象的删除,驱动程序不得尝试删除这些对象。 有关驱动程序无法删除的框架对象的列表,请参阅 WdfObjectDelete。