IOCTL_STORAGE_MCN_CONTROL IOCTL (ntddstor.h)

暂时启用或禁用在可移动媒体设备上GUID_IO_MEDIA_ARRIVAL和GUID_IO_MEDIA_REMOVAL传送自定义 PnP 事件。 这反过来又启用或禁用设备的媒体更改检测(自动播放),前提是调用方已打开具有FILE_READ_ATTRIBUTES访问权限的设备,并且设备已在注册表中启用自动播放。 调用方不得打开设备进行读取或写入访问,否则 IOCTL作将失败。 此 IOCTL 对注册表中的“自动播放”设置没有影响。

此类可移动媒体设备的驱动程序必须执行以下作:

  1. 在设备对象扩展中保留每个物理设备禁用请求的计数。
  2. 使用此 IOCTL 调用时,如果设置了禁用媒体更改检测的标志,则递增计数;如果标志明确,则递减计数。
  3. 仅当禁用请求计数为零时,才更改媒体状态时,为设备设置媒体更改事件。
当包含此 IOCTL 的 IRP_MJ_DEVICE_CONTROL IRP 传递给 SCSI 类驱动程序时,FileObject 当前 IO_STACK_LOCATION 的成员必须指向有效的文件对象。 对于禁用或启用自动播放的用户模式应用程序意外终止的情况,SCSI 类驱动程序需要文件对象。 在这种情况下,SCSI 类驱动程序使用文件对象重新检测媒体更改。 由于文件对象是正确清理所必需的,因此,如果 FileObject IO_STACK_LOCATION 成员未指向有效文件对象,则 SCSI 类驱动程序将导致 IRP 失败,并显示STATUS_INVALID_PARAMETER错误消息。 如果用户模式应用程序打开设备,则 I/O 管理器将初始化此成员,但内核模式驱动程序编写器不应假定在 IRP 由用户模式应用程序生成 IRP 时,FileObject 将被正确初始化。 例如,如果用户模式应用程序在发送 IOCTL 之前错误地打开设备进行读取或写入访问,则设备控制 IRP 将通过文件系统路由,从而阻止 SCSI 类驱动程序和设备驱动程序直接访问设备的文件对象。

主要代码

IRP_MJ_DEVICE_CONTROL

输入缓冲区

Irp->AssociatedIrp.SystemBuffer 的缓冲区包含布尔值,TRUE 指示驱动程序应禁用媒体更改检测。

输入缓冲区长度

布尔值的长度。

输出缓冲区

没有。

输出缓冲区长度

没有。

状态块

信息 字段设置为零。 状态 字段设置为STATUS_SUCCESS,或者可能设置为STATUS_BUFFER_TOO_SMALL、STATUS_INVALID_PARAMETER或STATUS_INVALID_DEVICE_STATE。

要求

要求 价值
标头 ntddstor.h (包括 Ntddstor.h)

另请参阅

IO_STACK_LOCATION