在用户模式代码中:
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管理器会自动取消它吗?
如果是这样,怎么办?
最佳答案
首先,异步I/O和同步I/O均通过IRP实现。用户模式API ReadFile调用内部NT API(系统调用)NtReadFile,最终发送IRP。如果驱动程序返回STATUS_PENDING,则NT API将返回相同的状态。如果用户模式应用程序对ReadFile进行同步调用,则ReadFile将在文件句柄上等待I/O完成。驱动程序还可以同步完成IRP(无论调用用户模式API的方式如何)。我认为您就是这种情况。
IRP与发送它们的线程相关联。因此,当线程终止时(例如,由于终止进程),I/O管理器将尝试取消与该线程关联的所有IRP。在所有IRP完成之前,线程无法终止。
关闭句柄时,I/O管理器将发送驱动程序IRP_MJ_CLEANUP和IRP_MJ_CLOSE。在这种情况下,是驱动程序取消了挂起的IRP(或仅将它们作为已取消的IRP完成)。
取消IRP的能力取决于驾驶员的配合。驱动程序必须通过调用IoSetCancelRoutine明确取消IRP。
如果驱动程序只是阻塞而未使IRP取消,则IRP不会被取消。