gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 09:49:33 24 4
gpt4 key购买 nike

在用户态代码:

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 都是通过 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 的能力取决于驱动程序的合作。驱动程序必须通过调用 IoSetCancelRoutine 显式地使 IRP 可取消.

如果驱动程序只是阻止而没有使 IRP 可取消,则 IRP 不会被取消。

关于windows - 即使驱动程序没有完成 irp,是否可以自动取消同步 I/O?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4999755/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com