ERESOURCE 相关函数的使用

来源:互联网 发布:上海游奇网络老板 编辑:程序博客网 时间:2024/06/14 16:45

原文连接

https://docs.microsoft.com/en-us/windows-hardware/drivers/kernel/introduction-to-eresource-routines

  • 内核资源对象,Ring0 的读写者机制。下面来简单学习一下它的使用。

  • 获取和释放一个 ERESOURCE 结构

  • 驱动可以使用ERESOURCE 结构来实现 独享/共享的同步。独享/共享的同步按照下面的方式工作:

    1. 任何数量的线程可以共享读取一个内核资源。
    2. 只有一个线程可以独享访问资源。当且仅当没有线程共享访问ERESOURCE 的时候,ERESOURCE 才可以被独占访问。
  • 一个线程如果当前无法获得ERESOURCE ,可以选择等待,直到ERESOURCE 被得到。系统维护了两个线程链表,一个独占访问,一个共享访问。

  • 独占/共享同步的一个典型的应用就是实现读写锁。一个读写锁允许多个线程共享读,但是只允许一个线程独占写。这可以直接通过(独占/共享)获得一个ERESOURCE 来实现。
    驱动通过ExInitializeResourceLite 申请并初始化一个ERESOURCE结构。系统在一个链表中维护了所有的在使用的ERESOURCE 结构。当驱动不再需要一个特定的ERESOURCE,必须调用ExDeleteResourceLite 从系统链表中释放它。驱动可以调用ExReinitializeResourceLite 重用一个ERESOURCE。
  • 驱动可以在一个ERESOURCE 上执行下面的基本操作
  • 调用ExAcquireResourceSharedLite 共享获得ERESOURCE。当且仅当没有正在独占访问,且没有独占访问的等待者。
  • 调用ExAcquireResourceExclusiveLite 获得对于ERESOURCE的独占访问,当且仅当没有其它线程已经获得其独占访问。
  • 转换一个独占访问为一个共享访问:ExConvertExclusiveToSharedLite。
  • ExReleaseResourceLite 释放一个ERESOURCE。
  • ExAcquireResourceSharedLite 和 ExAcquireResourceExclusiveLite 的 Wait 参数决定了当前线程是否等待直到获得了ERESOURCE。FALSE,当前得不到ERESOURCE的话,返回FALSE。TRUE,得不到的话,把当前线程放到恰当的ERESOURCE 等待链表中。
  • 检查ERESOURCE 结构的状态
    使用ExIsResourceAcquiredLite 或 ExIsResourceAcquiredSharedLite 判断ERESOURCE 是否已经被共享或者独占访问了。如果是的话,再调用ExIsResourceAcquiredExclusiveLite 判断是否是独占访问。
  • 使用ExGetSharedWaiterCount 判断当前等待共享访问的线程个数,使用ExGetExclusiveWaiterCount 判断当前等待独占访问的线程的个数。
原创粉丝点击