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 请求数据包(IRP),它可用于自动释放该句柄获取的独占访问锁。 这种简单方法可防止大多数意外释放的独占访问。 用于避免此功能的任何方法都可能会降低独占访问锁定方法的安全性和有效性。

主要代码

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 堆栈位置 (IO_STACK_LOCATION) 中的 Parameters.DeviceIoControl.OutputBufferLength 成员指示输出缓冲区的大小(以字节为单位)。

状态块

信息 字段设置为返回的字节数。 如果请求成功,则 状态 字段设置为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 类驱动程序将返回此状态代码:

  • 调用方在 IRQL 级别发出请求,而不是PASSIVE_LEVEL。
  • 调用方使用 RequestType = ExclusiveAccessUnlockDevice 发送了请求,以解锁非独占模式的设备。

STATUS_INVALID_DEVICE_STATE(Windows 错误代码:ERROR_BAD_COMMAND)

调用方尝试在此设备上装载文件系统驱动程序时锁定设备,但未指定类驱动程序应暂停对装载的文件系统驱动程序的检查。 若要暂停已装载文件系统驱动程序的检查,调用方必须将 标志CDROM_EXCLUSIVE_ACCESS 的成员设置为 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-terminated 字符串:字母数字(A - Z、a - z、0 - 9)、空格、句点、逗号、冒号(:)、分号(;)、连字符(-)和下划线(_)。 字符串的长度必须小于CDROM_EXCLUSIVE_CALLER_LENGTH字节,包括字符串末尾的 NULL

要求

要求 价值
标头 ntddcdrm.h (包括 Ntddcdrm.h)

另请参阅

CDROM_EXCLUSIVE_ACCESS

CDROM_EXCLUSIVE_LOCK

CDROM_EXCLUSIVE_LOCK_STATE

EXCLUSIVE_ACCESS_REQUEST_TYPE

IO_STACK_LOCATION