即使驱动程序未完成irp,同步I / O是否可以自动取消?

问题描述 投票:2回答:2

在用户模式下的代码:

CreateFile(A device);
ReadFile(The device handle); // synchronously

在对应的驱动程序的IRP_MJ_READ调度例程中:

// To hold the irp. It will never complete the irp.
// This driver doesn't even have a cancel routine.
Sleep(INFINITE); 

当我在执行ReadFile()之后强行终止用户模式应用程序时,可以取消I / O吗?如果它是异步I / O,则无法终止该应用程序。但是,如果I / O是同步的,I / O管理器会自动取消它吗?

如果是,如何?

windows operating-system io driver device-driver
2个回答
3
投票

首先,异步和同步I / O均通过IRP来实现。用户模式API ReadFile调用一个内部NT API(系统调用)NtReadFile,最终发送一个IRP。如果驱动程序返回STATUS_PENDING,则NT API将返回相同的状态。如果用户模式应用程序对ReadFile进行同步调用,则ReadFile将在文件句柄上等待I / O完成。驱动程序还可以同步完成IRP(无论调用用户模式API的方式如何)。我认为您就是对此感兴趣。

IRP与发送它们的线程相关联。因此,当thread终止时(例如,由于终止进程),I / O管理器将尝试取消与该线程关联的所有IRP。在所有IRP完成之前,线程无法终止。

[关闭句柄时,I / O管理器发送驱动程序IRP_MJ_CLEANUP和IRP_MJ_CLOSE。在这种情况下,是driver取消挂起的IRP(或仅将已完成的IRP取消)。

取消IRP的能力取决于驾驶员的配合。驱动程序必须通过调用IoSetCancelRoutine明确取消IRP。

如果驱动程序只是阻塞而未取消IRP,则IRP将不会被取消。


3
投票

在Vista或更高版本上,您可以使用CancelSynchronousIo将该线程的所有未决IO标记为已取消。 NtCancelIoFile可用于取消特定文件的IO。 (免责声明:我尚未实际测试此功能)

这些调用的效果会有所不同,具体取决于关于驱动程序的实现。

从用户模式应用程序可以看出,效果应该是立即取消,即使驱动程序可能会等待很长时间才能完全清除IO请求。

MSDN:I/O Completion/Cancellation Guidelines 🕗有关取消的信息很多:

I / O完成/取消准则

以下是附带的所有驱动程序的准则,或打算与Windows Vista和Windows Server 2008一起使用坚持。

为以前的Windows版本编写的驱动程序可能不会自动由于Windows Vista的重要更改,因此满足这些准则和Windows Server 2008,即支持取消IRP_MJ_CREATE IRP。

使用Windows Driver Foundation或“取消安全的IRP队列”库强烈建议您使用,因为它们会自动实现这些功能准则。

定义

合理期间表示大多数操作及其取消操作的时间少于10秒。这段时间是从用户的关闭应用程序或取消I / O时的延迟容忍度用户感知到的操作花费的时间太长。它应该是对于大多数操作而言,时间要短得多。也可能有正当理由对于某些类型的设备和/或操作,它会更长一些。

IRP由I / O管理器代表用户模式应用程序发布。

长期IRP是需要花费超过合理时间才能完成的IRP。

Pend表示驱动程序应返回STATUS_PENDING并将IRP标记为待处理。

指南

  • 所有可能花费不确定时间的IRP(包括创建)必须能够被取消。这些是等待的等待用户启动的事件,例如命名管道或等待键盘输入。
  • Close-IRP禁止阻塞的时间不得超过合理的时间。
  • 所有长期IRP都应保留。驱动程序不应在其调度内阻止用户模式线程(例如,获取互斥体)常规超过合理的时间。
  • [只要驱动程序插入一个IRP,包括创建,它都必须:
  • 支持取消IRP;或
  • 在合理的时间内完成操作。这可能需要实施超时。唯一的例外是硬件故障。
  • 如果驱动程序创建了传递给其他驱动程序的新IRP,则它必须继续取消,或者能够取消关联这些IRP来自I / O管理器发出的原始IRP。
  • 一旦取消,所有IRP均应在合理的时间内完成。即将完成IRP的驱动程序,除了当前螺纹必须是防悬挂的。唯一的例外是由硬件故障引起的延迟。如果硬件可能经常发生故障,那么驱动程序应该有足够的恢复机制来完成IRP合理期限。
  • 驾驶员绝不应该取消取消的IRP。
  • 除非IRP将很快完成,否则驱动程序不应有任何可能会被取消的路径(只需运行代码即可向前)。
© www.soinside.com 2019 - 2024. All rights reserved.