RxFinalizeNetFcb 函数 (rxprocs.h)
RxFinalizeNetFCB 完成给定的 FCB 结构。 调用方必须在与 FCB 关联的NET_ROOT上具有排他锁。
语法
BOOLEAN RxFinalizeNetFcb(
[out] OUT PFCB ThisFcb,
[in] IN BOOLEAN RecursiveFinalize,
[in] IN BOOLEAN ForceFinalize,
[in] IN LONG ReferenceCount
);
参数
[out] ThisFcb
指向要完成的 FCB 结构的指针。
[in] RecursiveFinalize
指示是否应以递归方式完成完成的值。
[in] ForceFinalize
该值指示是否应强制完成,而不考虑引用计数。
如果此参数为 FALSE,则 FCB 的 NodeReferenceCount 成员必须为 1 才能最终确定 FCB。
[in] ReferenceCount
FCB 上的引用计数,该计数仍允许强制完成。
返回值
RxFinalizeNetFCB 在成功时返回 TRUE ;如果未完成,则返回 FALSE :
注解
RxFinalizeNetFCB 例程通常不会由网络微型重定向程序驱动程序直接调用。 当收到 I/O 请求数据包以IRP_MJ_CLOSE时,RDBSS 会在内部调用此例程。 此 IRP 通常由 RDBSS 接收,以响应请求文件关闭操作的用户模式应用程序。 另一个内核驱动程序也可以发出此类 IRP。
RDBSS 中的关闭处理策略基于一个公理,即应尽可能最小化服务器上的工作负荷。 有许多应用程序在批处理文件处理 (重复关闭和打开同一文件,例如) 。 在这些情况下,打开同一文件,读取缓冲区中的一行,关闭文件,并反复重复同一组操作。
这是通过延迟处理关闭请求在 RDBSS 中处理的。 完成请求和对关闭请求启动处理之间有大约 10 秒的延迟。 这会打开一个窗口,在此期间,后续打开操作可以折叠到现有SRV_OPEN。 可以调整时间间隔以满足这些要求。
在调用 RxFinalizeNetFCB 之前,必须在独占模式下获取 FCB 结构的锁。
如果 RecursiveFinalize 参数为 FALSE,则如果 FCB 的未完成引用 (FCB 结构的 OpenCount 或 CleanCount 成员为非零) ,则 RxFinalizeNetFCB 将失败。
如果 ForceFinalize 参数为 TRUE, 则 RxFinalizeNetFCB 会导致系统对已检查的生成执行 ASSERT。
递归终结后,与 FCB 关联的引用计数最多可以为 1,以便进一步完成。 此最终引用计数属于NET_ROOT的前缀名称表。 实际最终完成分为两个部分:
- 如果引用计数等于 1 或 ForceFinalize 参数为 TRUE, 则 RxFinalizeNetFCB 将完成 FCB。
- 如果引用计数为零,则表示 FCB 最终确定,并释放用于 FCB 的内存。
要求
要求 | 值 |
---|---|
目标平台 | 桌面 |
标头 | rxprocs.h (包括 Rxprocs.h) |
IRQL | <= APC_LEVEL |