一个IRP_MJ_CLOSE 请求通告驱动程序:一个文件对象被删除了。 IO 管理器在以下两种情况都为真时,为相应的文件对象发送IRP_MJ_CLOSE 请求: 文件对象所有的句柄都被关闭了 没有显著的联系(参考,reference)指向这一对象,例如由遗留的待处的IRP 产生的 与IRP_MJ_CREATE 和IRP_MJ_CLEANUP 请求所不同,一个IRP_MJ_...
请注意,IRP_MJ_READ和IRP_MJ_WRITE可以是基于 IRP 的操作,也可以是快速 I/O 操作。 当它们基于 IRP 时,缓冲方法由如上所述的设备对象标志确定。 当这些操作是快速 I/O 时,它们始终不使用缓冲 I/O 和直接 I/O。 有关可基于 IRP 的 I/O 操作或快速 I/O 操作的详细信息,请参阅 可IRP-...
对于IRP_MJ_READ和IRP_MJ_WRITE,则不会用到这个缓冲区。对于 IRP_MJ_DEVICE_CONTROL 或 IRP_MJ_INTERNAL_DEVICE_CONTROL这两类IRP,该缓冲区被作为DeviceIoControl函数的输入缓冲区。该缓冲区 的长度由IO_STACK_LOCATION结构(后面会讲到该结构)中的 Parameters.DeviceIoControl.InputBufferLength 成员来确定。 IoStatus(...
IRP_MJ_INTERNAL_DEVICE_CONTROL 显示另外 8 个 本主题记录串行 IRP 主要函数代码。 标头:Wdm.h (包括 Wdm.h 或 Ntddk.h) IRP_MJ_CREATE IRP_MJ_CREATE请求会打开串行设备。 发送时间 客户端必须先打开串行设备,然后才能访问该端口或连接到该端口的设备。
(LOCK_OPERATION) (nextStack->MajorFunction == IRP_MJ_WRITE ? IoReadAccess : IoWriteAccess) ); } except(EXCEPTION_EXECUTE_HANDLER) {if(irp->MdlAddress !=NULL) { IoFreeMdl( irp->MdlAddress ); } IoFreeIrp( irp );returnGetExceptionCode(); ...
对于标准的IO请求,例如IRP_MJ_READ和IRP_MJ_WRITE,由驱动在设备刚创建后,马上通过修改DeviceObject->Flags域的值来指定支持那一种传输机制。 缓存IO 为了以缓存IO的方式接收读、写的请求,驱动会在初始化时在DeviceObject->Flags域上设置DO_BUFFERED_IO标志。当驱动收到了一个缓存IO的请求,在特定的Irp->Associated...
对于IRP_MJ_READ和IRP_MJ_WRITE,则不会用到这个缓冲区。对于IRP_MJ_DEVICE_CONTROL 或 IRP_MJ_INTERNAL_DEVICE_CONTROL这两类IRP,该缓冲区被作为DeviceIoControl函数的输入缓冲区。该缓冲区的长度由IO_STACK_LOCATION结构(后面会讲到该结构)中的Parameters.DeviceIoControl.InputBufferLength 成员来确定。
对于IRP_MJ_READ和IRP_MJ_WRITE操作,如果顶级设备指定DO_BUFFERED_IO标志,则I/O管理器就创建这个数据缓冲区。对于IRP_MJ_DEVICE_CONTROL操作,如果I/O控制功能代码指出需要缓冲区(见第九章),则I/O管理器就创建这个数据缓冲区。I/O管理器把用户模式程序发送给驱动程序的数据复制到这个缓冲...
IRP_MJ_READ 缓冲器从设备或驱动程序接收数据。 缓冲区的长度由驱动程序的IO_STACK_LOCATION结构中的Parameters.Read.Length指定。 IRP_MJ_WRITE 缓冲区提供设备或驱动程序的数据。 缓冲区的长度由驱动程序IO_STACK_LOCATION结构中的Parameters.Write.Length指定。
IRP_MJ_READ 读取设备内容,ReadFile会产生此IRP IRP_MJ_SET_INFORMATION 设置文件长度,GetFileSize会产生此IRP IRP_MJ_SHUTDOWN 关闭系统前会产生此IRP IRP_MJ_SYSTEM_CONTROL 系统控制信息,类似于内核调用DeviceControl IRP_MJ_WRITE 向设备写入数据,WriteFile会产生此IRP ...