IOCTL_CDROM_EXCLUSIVE_ACCESS IOCTL (ntddcdrm.h)

Запрос IOCTL_CDROM_EXCLUSIVE_ACCESS указывает драйверу класса CD-ROM:

  • Сообщите о состоянии доступа устройства компакт-диска.
  • Блокировка устройства компакт-дисков для монопольного доступа.
  • Разблокируйте устройство компакт-диска для монопольного доступа.
Чтобы этот IOCTL был успешным, должен существовать допустимый дескриптор FileObject. Дескриптор FileObject защищает систему от непредвиденного завершения работы приложения или случайного получения блокировки монопольного доступа без последующего снятия блокировки монопольного доступа. Требуется допустимый дескриптор FileObject, так как при закрытии приложения драйвер класса CD-ROM получит пакеты запросов CLEANUP и CLOSE I/O Request Packets (IRP), которые он может использовать для автоматического снятия блокировки монопольного доступа, полученной этим дескриптором. Этот простой метод защищает от большинства случайных выпусков монопольного доступа. Любые методы, используемые для предотвращения этой функциональности, могут снизить безопасность и эффективность метода блокировки монопольного доступа.

Основной код

IRP_MJ_DEVICE_CONTROL

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

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

  • CDROM_EXCLUSIVE_ACCESS (для отчета о состоянии доступа устройства компакт-диска)

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

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

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

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

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

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

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

Элемент 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 возвращает этот код состояния при возникновении одной из следующих двух ошибок:

  • Вызывающий объект сделал запрос на уровне IRQL, отличном от PASSIVE_LEVEL.
  • Вызывающий объект отправил запрос с запросомExclusiveAccessUnlockDevice = на разблокировку устройства, которое не находится в монопольном режиме.

STATUS_INVALID_DEVICE_STATE (код ошибки Windows: ERROR_BAD_COMMAND)

Вызывающий объект пытался заблокировать устройство, когда драйвер файловой системы был подключен на этом устройстве, не указывая, что драйвер класса должен приостановить проверка для подключенного драйвера файловой системы. Чтобы приостановить проверка для подключенного драйвера файловой системы, вызывающий объект должен установить для элемента FlagsCDROM_EXCLUSIVE_ACCESS значение 1.

STATUS_INVALID_HANDLE (код ошибки Windows: ERROR_INVALID_HANDLE)

Драйвер класса CD-ROM возвращает этот код состояния при возникновении одной из следующих двух ошибок:

  • Объект файла, необходимый для отслеживания запроса, был недоступен. Драйвер класса CD-ROM не получил запрос на создание файлового объекта от этого вызывающего объекта.
  • Вызывающий объект отправил запрос с запросомExclusiveAccessUnlockDevice = на разблокировку устройства, даже если вызывающий объект не имеет монопольного доступа к устройству.

STATUS_INVALID_PARAMETER (код ошибки Windows: ERROR_INVALID_PARAMETER)

Драйвер класса CD-ROM возвращает этот код состояния при возникновении одной из следующих двух ошибок:

  • Указанный параметр RequestType не является допустимым членом EXCLUSIVE_ACCESS_REQUEST_TYPE.
  • Строка имени вызывающего объекта в элементе CallerNameCDROM_EXCLUSIVE_LOCK нарушает соглашение об именовании. CallerName должен быть строкой, завершающейся значением NULL, которая содержит следующие символы: буквы и цифры (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