FltInitializePushLock 函数 (fltkernel.h)

FltInitializePushLock 例程初始化推送锁变量。

语法

VOID FLTAPI FltInitializePushLock(
  [out] PEX_PUSH_LOCK PushLock
);

参数

[out] PushLock

指向调用方提供的存储的指针,该存储必须至少为 size of (EX_PUSH_LOCK) 的值,才能初始化推送锁变量。 存储必须在 32 位平台上对齐 4 字节,在 64 位平台上必须是 8 字节对齐的。

返回值

备注

对于文件系统微筛选器,推送锁很少是一个不错的选择。 如下所述,其某些特征可能与文件系统固有的重新进入特性不兼容。

推送锁类似于 ERESOURCE 结构 , (也称为“资源”) 通过以下方式:

  • 推送锁可由一组线程用于同步。
  • 可以获取推送锁进行共享或独占访问。
  • 尽管调用方为推送锁变量提供存储,但EX_PUSH_LOCK结构是不透明的:也就是说,其成员保留供系统使用。
与 ERESOURCE 结构相比,推送锁具有以下缺点:
  • 授予独占访问权限的算法对所有线程都不公平。 如果存在高级别的排他锁争用,则无法保证授予线程独占访问权限的顺序。
  • 没有用于在运行时确定推送锁的当前所有者的支持例程。 (ERESOURCE 结构的用户可以调用 ExIsResourceAcquiredExclusiveLite 等例程,以确定当前线程是否具有对 resource.)
  • 出于同样的原因,不支持扩展来确定调试时推送锁的当前所有者,从而诊断死锁。 (ERESOURCE 结构的用户可以使用 !locks kd 或 windbg 中的扩展来查找此信息。)
  • 没有驱动程序验证程序支持来帮助通过推送锁早期诊断死锁。
  • 无法以递归方式获取排他推送锁。
与 ERESOURCE 结构比较,推送锁具有以下优势:
  • 当推送锁主要为共享访问获取时,它们比 ERESOURCE 结构更有效。
  • 推送锁的存储可以从分页池或非分页池中分配。 只能从非分页池分配 ERESOURCE 结构。
  • EX_PUSH_LOCK结构比 ERESOURCE 结构小得多。
除非这些优点中的任何一个具有吸引力,否则 ERESOURCE 通常是解决读/写同步问题的更可靠且可维护的解决方案。

若要获取用于独占访问的推送锁,请调用 FltAcquirePushLockExclusive

若要获取用于共享访问的推送锁,请调用 FltAcquirePushLockShared

若要释放推送锁,请调用 FltReleasePushLock

若要删除推送锁,请调用 FltDeletePushLock

要求

要求
最低受支持的客户端 此例程在 Microsoft Windows XP SP2、Microsoft Windows Server 2003 SP1 及更高版本上可用。
目标平台 通用
标头 fltkernel.h (包括 Fltkernel.h)
Library FltMgr.lib
DLL Fltmgr.sys
IRQL <= APC_LEVEL

另请参阅

ExIsResourceAcquiredExclusiveLite

FltAcquirePushLockExclusive

FltAcquirePushLockShared

FltDeletePushLock

FltReleasePushLock