xiabl
驱动牛犊
驱动牛犊
  • 注册日期2005-10-24
  • 最后登录2010-05-20
  • 粉丝0
  • 关注0
  • 积分221分
  • 威望77点
  • 贡献值0点
  • 好评度71点
  • 原创分0分
  • 专家分0分
阅读:1256回复:2

创建和毁坏的文件对象

楼主#
更多 发布于:2007-02-02 17:37
  概要
每次 CreateFile() 或 OpenFile() 被调用以打开设备、 卷、 目录或数据文件, I / O 管理器创建文件对象。 如果调用成功手柄可文件对象返回给调用方。 使用手柄后续 I/O 调用被视为同一文件对象上操作。 有几个与创建和毁坏的文件对象之间调度例程, 内核模式驱动程序可提供, 本文讨论使用文件对象从驱动程序角度和相关调度例程。
回到顶端

更多信息
指向文件对象指针被传递给当前 I / O 堆栈位置的 IRP, IrpSp "-> FileObject 上中驱动程序。 由于 I / O 请求与同一句柄相具有相同文件对象, 驱动程序可使用文件对象指针来标识属于一个打开实例的设备或文件 I / O 操作。

不备注: A 驱动程序应使用 "-> Tail.Overlay.OriginalFileObject Irp 中存储值。 该字段是归 I / O 管理器。 它可能不包含有效文件对象指针供驱动程序。

与 WindowsNT, 中其他对象每文件对象头具有打开句柄计数和引用计数。 打开句柄计数代表的处理有已打开到文件对象数。 引用计数代表到系统中正在使用对象的指针数。 例如, 是首先创建文件对象和句柄返回给调用方是 CreateFile, 时文件对象的打开句柄计数设置为 1。 每当柄是重复或继承, 打开句柄数增加。 每 CloseHandle() 调用递减计数 而另一方面, 柄用于发送 I / O 请求, 每次 I / O 管理器调用该对象管理器递增文件对象的引用计数。 每操作完成时引用计数是减少。 通过调用 Ob (De) referenceObject 驱动程序可能也引用或 derefence fileobjects。

IRP_MJ_CREATE
当创建一个文件对象与设备关联调用用于 IRP_MJ_CREATE 调度例程。 这通常是因 CreateFile(), ZwCreateFile(), 通过高级 dri 通过调用 IoAttachDevice() er 附加本身或间接调用。 提供有关 IRP_MJ_CREATE 调度例程需要驱动程序。 请参阅 WindowsNT DDK 文档详细。
回到顶端

IRP_MJ_CLEANUP
当关闭最后柄以文件对象 (在整个系统) 调用用于 IRP_MJ_CLEANUP 调度例程。 换句话说, 打开句柄计数对文件对象转到 0。 对于 IRP_MJ_CLEANUP 持有等待 IRP 内部驱动程序必须实现一个例程。 当调用例程, 驱动程序应取消所有未决 IRP 属于由 IRP_MJ_CLEAN 调用文件对象。 换句话说, 它应该取消所有具有相同文件对象指针作为当前 I / O 堆栈位置的 IRP 用于 IRP_MJ_CLEANUP 调用中提供一个 IRP。 当然, IRP 属于其他文件对象应不取消。 还, 如果是完成 IRP 完成立即, 驱动程序没有要取消它。

注意: 对于 IRP_MJ_CLEANUP: 例程和用于单个 IRP 取消例程提供不同用途。 驱动程序和长期 IRP 应实现两者。 当系统尝试取消特定 IRP 取消例程调用。 可能出现这种情况不 IRP_MJ_CLEANUP 调用。 用户模式线程, 例如从其他线程和问题与句柄相 I/O 请求获取文件句柄。 如果线程终止与某些请求未决, 系统尝试取消未决 IRP 属于终止线程。 在这种情况下, 称为对于这些 IRP 取消例程 ; 但没有 IRP_MJ_CLEANUP 请求发出。 相反, IRP_MJ_CLEANUP 可以颁发与调用没有取消例程。 如上所述, 这发生在上次柄以文件对象已关闭。 此例, 即使还有等待与文件对象, 关联 IRP 系统不尝试取消它们。 驱动程序处理 IRP 适当 IRP_MJ_CLEANUP 例程中。
回到顶端

IRP_MJ_CLOSE
当正在从系统删除驱动程序上打开文件对象调用 IRP_MJ_CLOSE 调度例程 ; 即, 已关闭所有对象文件句柄, 引用计数为文件对象是到 0。 某些类型的驱动程序不需要处理 IRP_MJ_CLOSE, 主要驱动程序的设备必须供系统以继续运行。 一般, 这是, 驱动程序应 " 撤消 " 任何已完成例程中对于 IRP_MJ_CREATE 地方。

如前所述, 引用计数是不同于打开句柄计数。 当打开句柄数转到 0 可引用计数为非零值。 例如, 如果完成, 正在有仍 I / O 请求用户模式程序关闭其最后手柄可文件对象相关驱动程序 IRP_MJ_CLEANUP 例程称为因为打开柄达到 0, 但 IRP_MJ_CLOSE 例程不调用因为有对正在使用该文件对象仍指针引用。 未关闭例程调用直到所有未决 I/O 请求被完成。 显然, 如果驱动程序执行按计划在 IRP_MJ_CLEANUP 例, 如前所述, 同时右称为 IRP_MJ_CLOSE 例程。
小桥流水人家
xiabl
驱动牛犊
驱动牛犊
  • 注册日期2005-10-24
  • 最后登录2010-05-20
  • 粉丝0
  • 关注0
  • 积分221分
  • 威望77点
  • 贡献值0点
  • 好评度71点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2007-02-02 17:40
那么IRP_MJ_CREATE 是否与 IRP_MJ_CLOSE一一对应

IRP_MJ_CREATE ,  IRP_MJ_CLOSE, IRP_MJ_CLEANUP 究竟是什么关系
小桥流水人家
cyliu
论坛版主
论坛版主
  • 注册日期2003-06-13
  • 最后登录2014-04-11
  • 粉丝5
  • 关注0
  • 积分1238分
  • 威望2531点
  • 贡献值0点
  • 好评度577点
  • 原创分14分
  • 专家分10分
板凳#
发布于:2007-02-02 20:38
哪里找的这么晦涩的文字描述阿。他们之间的关系,在Nt文件系统中第9章有详细的描述,可以参考一下阿
走走看看开源好 Solaris vs Linux
游客

返回顶部