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 类驱动程序时,当前IO_STACK_LOCATIONFileObject 成员必须指向有效的文件对象。 对于禁用或启用自动播放的用户模式应用程序意外终止的情况,SCSI 类驱动程序需要文件对象。 在这种情况下,SCSI 类驱动程序使用文件对象来重新进行媒体更改检测。 由于文件对象是正确清理所必需的,因此,如果 IO_STACK_LOCATION 的 FileObject 成员未指向有效的文件对象,则 SCSI 类驱动程序将导致 IRP 失败并显示错误消息STATUS_INVALID_PARAMETER。 如果用户模式应用程序打开设备,则 I/O 管理器会初始化此成员,但内核模式驱动程序编写器不应假定在用户模式应用程序生成 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。

要求

要求
Header ntddstor.h (包括 Ntddstor.h)

另请参阅

IO_STACK_LOCATION