Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 即使驱动程序没有';你不能完成irp吗?_Windows_Operating System_Io_Driver_Device Driver - Fatal编程技术网

Windows 即使驱动程序没有';你不能完成irp吗?

Windows 即使驱动程序没有';你不能完成irp吗?,windows,operating-system,io,driver,device-driver,Windows,Operating System,Io,Driver,Device Driver,在用户模式代码中: CreateFile(A device); ReadFile(The device handle); // synchronously 在相应的驾驶员IRP_MJ_读取调度例行程序中: // To hold the irp. It will never complete the irp. // This driver doesn't even have a cancel routine. Sleep(INFINITE); 当我在do ReadFile()之后强制终止用户

在用户模式代码中:

CreateFile(A device);
ReadFile(The device handle); // synchronously
在相应的驾驶员IRP_MJ_读取调度例行程序中:

// To hold the irp. It will never complete the irp.
// This driver doesn't even have a cancel routine.
Sleep(INFINITE); 
当我在do ReadFile()之后强制终止用户模式应用程序时,可以取消I/O吗?
如果是异步I/O,则无法终止应用程序。
但如果I/O是同步的,I/O管理器会自动取消它吗


如果是,怎么做?

在Vista及更高版本上,您可以使用将线程的所有挂起IO标记为已取消。可用于取消特定文件的IO。(免责声明:我还没有实际测试过这个功能)

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

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


MSDN:首先,异步和同步I/O都是用IRP实现的。用户模式API ReadFile调用内部NT API(系统调用)NtReadFile,最终发送IRP。如果驱动程序返回状态_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的能力取决于驾驶员的合作。驱动程序必须通过调用显式地使IRP可取消


如果驾驶员只是阻塞而没有取消IRP,IRP将不会被取消。

前两句话是正确和清楚的。但第三和第四有点混淆。对于没有取消例程的驱动程序,如果我放入同步I/O,然后执行终止进程(或关闭句柄),可以取消I/O吗?(因为它是同步I/O)。这就是我想知道的-我是个英国新手。顺便说一下,在你的第一个sentense案例中,如果司机没有取消程序怎么办?可以取消吗?怎样?I/O管理器无法调用取消例程。I/O可能仍在处理。如果驱动程序未将IRP标记为可取消,则IO管理器无法取消它。这将防止线程终止,进程在IRP完成之前不会终止。