FltInitializePushLock 函数 (fltkernel.h)
FltInitializePushLock 例程初始化推送锁变量。
语法
VOID FLTAPI FltInitializePushLock(
[out] PEX_PUSH_LOCK PushLock
);
参数
[out] PushLock
指向调用方提供的存储的指针,该存储必须至少是 sizeof(EX_PUSH_LOCK)的值,才能初始化推送锁变量。 存储必须在 32 位平台上对齐 4 字节,并且 64 位平台上对齐 8 字节。
返回值
没有
言论
推送锁是一种同步基元,用于管理多个线程对共享资源的访问。 推送锁类似于 ERESOURCE 结构,(也称为“资源”)的方式如下:
推送锁可用于一组线程的同步。
可以获取推送锁进行共享或独占访问。
尽管调用方为推送锁变量提供存储,但EX_PUSH_LOCK结构不透明:即,其成员保留供系统使用。
推送锁可能不是文件系统微型筛选器的正确选择,因为它们的某些特征可能与文件系统固有的重新加入性质不兼容。
与 ERESOURCE 结构相比,推送锁具有以下 缺点:
授予独占访问权限的算法并不适用于所有线程。 如果存在高级别的独占锁争用,则不能保证线程将被授予独占访问权限的顺序。
在运行时无法确定推送锁的当前所有者。 ERESOURCE 结构的用户可以调用例程,例如 ExIsResourceAcquiredExclusiveLite,以确定当前线程是否具有对资源的独占访问权限。
不支持扩展用于在调试时确定推送锁的当前所有者,以便诊断死锁。 ERESOURCE 结构的用户可以使用 kd 或 windbg 中的
!locks
扩展来确定当前所有者。没有驱动程序验证程序支持,可帮助通过推送锁提前诊断死锁。
无法以递归方式获取独占推送锁。
推送锁在 ERESOURCE 结构 具有以下
当推送锁主要用于共享访问时,它们比 ERESOURCE 结构更高效。
可以从分页池或非分页池分配推送锁的存储。 只能从非分页池分配 ERESOURCE 结构。
EX_PUSH_LOCK结构比 ERESOURCE 结构小得多。
除非上述任何优势都令人信服,否则 ERESOURCE 通常是读取/写入同步问题的更可靠且更可维护的解决方案。
若要获取用于独占访问的推送锁,请调用FltAcquirePushLockExclusive。
若要获取共享访问的推送锁,请调用 FltAcquirePushLockExclusive。
若要释放推送锁,请调用 FltReleasePushLock。
若要删除推送锁,请调用 FltDeletePushLock。
要求
要求 | 价值 |
---|---|
最低支持的客户端 | Windows XP SP2 Microsoft |
支持的最低服务器 | Windows Server 2003 SP1 |
目标平台 | 普遍 |
标头 | fltkernel.h (包括 Fltkernel.h) |
库 | FltMgr.lib |
DLL | Fltmgr.sys |
IRQL | <= APC_LEVEL |