IOCTL_CDROM_EXCLUSIVE_ACCESS IOCTL (ntddcdrm.h)

IOCTL_CDROM_EXCLUSIVE_ACCESS请求指示 CD-ROM 类驱动程序:

  • 报告 CD-ROM 设备的访问状态。
  • 锁定 CD-ROM 设备以便进行独占访问。
  • 解锁 CD-ROM 设备以独占访问。
必须存在有效的 FileObject 句柄,此 IOCTL 才能成功。 FileObject 句柄可保护系统免受应用程序意外终止或意外获取独占访问锁的防护,而无需随后释放独占访问锁。 有效的 FileObject 句柄是必需的,因为当应用程序关闭时,CD-ROM 类驱动程序将接收 CLEANUP 和 CLOSE I/O 请求数据包 (I/O) ,可用于自动释放该句柄获取的独占访问锁。 这种简单的方法可以防止大多数独占访问权限的意外释放。 用于避免此功能的任何方法都可能会降低独占访问锁定方法的安全性和有效性。

主要代码

IRP_MJ_DEVICE_CONTROL

输入缓冲区

根据调用方请求的操作,调用方必须提供以下结构之一作为 Irp-AssociatedIrp.SystemBuffer> 的输入:

输入缓冲区长度

IO_STACK_LOCATION 结构中的 Parameters.DeviceIoControl.InputBufferLength 成员指示用户分配的输入缓冲区的大小(以字节为单位)。

输出缓冲区

如果调用方请求 CD-ROM 设备的独占访问状态 (RequestType = ExclusiveAccessQueryState) ,则 CD-ROM 类驱动程序将在 Irp-AssociatedIrp.SystemBuffer>的缓冲区中返回一个CDROM_EXCLUSIVE_LOCK_STATE类型结构,其 LockState 成员指示设备的访问状态。

输出缓冲区长度

I/O 堆栈位置中的 Parameters.DeviceIoControl.OutputBufferLength 成员 (IO_STACK_LOCATION) 指示输出缓冲区的大小(以字节为单位)。

状态块

信息” 字段设置为返回的字节数。 如果请求成功,“ 状态” 字段设置为STATUS_SUCCESS。

如果请求失败,“ 状态” 字段可能会设置为以下错误消息之一:

STATUS_ACCESS_DENIED (Windows 错误代码:ERROR_ACCESS_DENIED)

设备已锁定以独占访问。

STATUS_BUFFER_TOO_SMALL (Windows 错误代码:ERROR_INSUFFICIENT_BUFFER)

对于 ExclusiveAccessQueryState 请求,输出缓冲区太小。

STATUS_INFO_LENGTH_MISMATCH (Windows 错误代码:ERROR_BAD_LENGTH)

输入缓冲区太小。

STATUS_INVALID_DEVICE_REQUEST (Windows 错误代码:ERROR_INVALID_FUNCTION)

发生以下两个错误之一时,CD-ROM 类驱动程序将返回此状态代码:

  • 调用方在除 PASSIVE_LEVEL 之外的 IRQL 级别发出请求。
  • 调用方发送了 RequestType = ExclusiveAccessUnlockDevice 的请求,以解锁不处于独占模式的设备。

STATUS_INVALID_DEVICE_STATE (Windows 错误代码:ERROR_BAD_COMMAND)

当文件系统驱动程序装载到此设备上时,调用方尝试锁定设备,但未指定类驱动程序应挂起已装载的文件系统驱动程序的检查。 若要挂起已装载文件系统驱动程序的检查,调用方必须将 CDROM_EXCLUSIVE_ACCESSFlags 成员设置为 1。

STATUS_INVALID_HANDLE (Windows 错误代码:ERROR_INVALID_HANDLE)

发生以下两个错误之一时,CD-ROM 类驱动程序将返回此状态代码:

  • 跟踪请求所需的文件对象不可用。 CD-ROM 类驱动程序未收到从此调用方创建文件对象的请求。
  • 调用方发送了 RequestType = ExclusiveAccessUnlockDevice 的请求来解锁设备,即使调用方对设备没有独占访问权限。

STATUS_INVALID_PARAMETER (Windows 错误代码:ERROR_INVALID_PARAMETER)

发生以下两个错误之一时,CD-ROM 类驱动程序将返回此状态代码:

  • 指定的 RequestType 不是 EXCLUSIVE_ACCESS_REQUEST_TYPE 的有效成员。
  • CDROM_EXCLUSIVE_LOCKCallerName 成员中的调用方名称字符串违反了命名约定。 CallerName 必须是包含以下字符的 以 NULL 结尾的字符串:字母数字 (A - Z、a - z、0 - 9) 、空格、句点、逗号、冒号 (:) 、分号 (;) 、连字符 (-) 和下划线 (_) 。 字符串的长度必须小于 CDROM_EXCLUSIVE_CALLER_LENGTH 个字节,包括字符串末尾的 NULL

要求

要求
Header ntddcdrm.h (包括 Ntddcdrm.h)

另请参阅

CDROM_EXCLUSIVE_ACCESS

CDROM_EXCLUSIVE_LOCK

CDROM_EXCLUSIVE_LOCK_STATE

EXCLUSIVE_ACCESS_REQUEST_TYPE

IO_STACK_LOCATION