Поделиться через


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 Request Packets (IRPs), которые можно использовать для автоматического выпуска блокировки эксклюзивного доступа, полученной этим дескриптором. Этот простой метод защищает от большинства случайных выпусков эксклюзивного доступа. Любые методы, используемые для предотвращения этой функциональности, могут снизить безопасность и эффективность метода блокировки эксклюзивного доступа.

Основной код

IRP_MJ_DEVICE_CONTROL

Входной буфер

В зависимости от операции, запрашивающей вызывающий объект, вызывающий объект должен предоставить одну из следующих структур в качестве входных данных в Irp->AssociatedIrp.SystemBuffer:

  • CDROM_EXCLUSIVE_ACCESS (чтобы сообщить о состоянии доступа устройства CD-ROM)

  • CDROM_EXCLUSIVE_LOCK (блокировка устройства CD-ROM для монопольного доступа)

  • CDROM_EXCLUSIVE_ACCESS (чтобы разблокировать устройство CD-ROM, заблокированное приложением для монопольного доступа)

Длина входного буфера

Элемент Parameters.DeviceIoControl.InputBufferLength в структуре IO_STACK_LOCATION указывает размер в байтах выделенного пользователем входного буфера.

Выходной буфер

Если вызывающий объект запрашивает монопольное состояние доступа устройства CD-ROM (RequestType = ExclusiveAccessQueryState), драйвер класса CD-ROM возвращает структуру типа CDROM_EXCLUSIVE_LOCK_STATEв буфере Irp->AssociatedIrp.SystemBuffer , член LockState указывает состояние доступа устройства.

Длина выходного буфера

Элемент Parameters.DeviceIoControl.OutputBufferLength в расположении стека ввода-вывода (IO_STACK_LOCATION) указывает размер в байтах выходного буфера.

Блок состояния

Поле information задано число возвращаемых байтов. Поле состояния имеет значение 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.
  • Строка имени вызывающего объекта в CallerName члена CDROM_EXCLUSIVE_LOCK нарушает соглашение об именовании. CallerName должно быть null-endd string, которая содержит следующие символы: буквенно-цифровые символы (A, z, z, 0 – 9), пробелы, точки, запятые, двоеточия (:), запятые, двоеточия (;), дефисы (-) и символы подчеркивания (_). Длина строки должна быть меньше CDROM_EXCLUSIVE_CALLER_LENGTH байтов, включая NULL в конце строки.

Требования

Требование Ценность
заголовка ntddcdrm.h (include Ntddcdrm.h)

См. также

CDROM_EXCLUSIVE_ACCESS

CDROM_EXCLUSIVE_LOCK

CDROM_EXCLUSIVE_LOCK_STATE

EXCLUSIVE_ACCESS_REQUEST_TYPE

IO_STACK_LOCATION