IOCTL_STORAGE_PERSISTENT_RESERVE_OUT IOCTL (ntddstor.h)

Драйвер класса универсального хранилища (classpnp.sys) предоставляет интерфейс управления ввода-вывода (IOCTL) для выдачи команд постоянного резервирования. Поведение устройства хранения при получении команды постоянного резервирования описано в спецификации SCSI Primary Commands - 2 (SPC-2). Интерфейс IOCTL требует, чтобы вызывающий объект получил доступ на чтение и запись к физическому устройству для команд постоянного резервирования. Приложения, службы и драйверы в режиме ядра могут использовать этот IOCTL для управления постоянными резервированиями. При вызове драйвера этот IOCTL должен вызываться из потока, работающего в IRQL < DISPATCH_LEVEL. Этот IOCTL определяется с FILE_READ_ACCESS и FILE_WRITE_ACCESS, требуя от дескриптора устройства иметь разрешения на чтение и запись для выдачи команды Persistent Reserve Out.

Основной код

IRP_MJ_DEVICE_CONTROL

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

Буфер в Irp->AssociatedIrp.SystemBuffer содержит структуру PERSISTENT_RESERVE_COMMAND. Необходимо выделить буфер из непагрегированного пула и правильно выровнять его для целевого устройства и адаптера.

PR_OUT. ServiceAction может быть одним из следующих вариантов:

  • RESERVATION_ACTION_REGISTER
  • RESERVATION_ACTION_RESERVE
  • RESERVATION_ACTION_RELEASE
  • RESERVATION_ACTION_CLEAR
  • RESERVATION_ACTION_PREEMPT
  • RESERVATION_ACTION_PREEMPT_ABORT
  • RESERVATION_ACTION_REGISTER_IGNORE_EXISTING

PR_OUT. Область может быть одной из следующих областей:

  • RESERVATION_SCOPE_LU
  • RESERVATION_SCOPE_ELEMENT

PR_OUT. Тип может быть одним из следующих типов:

  • RESERVATION_TYPE_WRITE_EXCLUSIVE
  • RESERVATION_TYPE_EXCLUSIVE
  • RESERVATION_TYPE_WRITE_EXCLUSIVE_REGISTRANTS
  • RESERVATION_TYPE_EXCLUSIVE_REGISTRANTS

PR_OUT. ПараметрList используется для хранения структуры PRO_PARAMETER_LIST. Эта структура является обязательной и должна быть связана с остальной частью PERSISTENT_RESERVE_COMMAND структуры.

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

Длина структуры PERSISTENT_RESERVE_COMMAND.

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

Никакой.

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

Никакой.

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

Поле сведений равно нулю.

Поле состояние имеет одно из следующих значений.

Ценность Значение
STATUS_DEVICE_BUSY (ERROR_BUSY) Сбой команды из-за конфликта резервирования (дополнительные сведения см. в спецификации SCSI Primary Commands - 2 (SPC-2).
STATUS_INFO_LENGTH_MISMATCH Длина входного буфера для IOCTL меньше размера (PERSISTENT_RESERVE_COMMAND) или размер, указанный в структуре данных PERSISTENT_RESERVE_COMMAND, меньше размера (PERSISTENT_RESERVE_COMMAND).
STATUS_INVALID_DEVICE_REQUEST (ERROR_INVALID_FUNCTION) Код элемента управления ввода-вывода (IOCTL_STORAGE_PERSISTENT_RESERVE_OUT) не поддерживается драйверами хранилища.
STATUS_INVALID_PARAMETER (ERROR_INVALID_PARAMETER) Структура входного буфера неправильно размерна или заполнена.
STATUS_INVALID_USER_BUFFER (ERROR_INVALID_USER_BUFFER) Входной буфер неправильно выровнен для устройства или адаптера. Это состояние можно вернуть только при отправке драйвера IOCTL в стек хранилища. Это состояние не возвращается, когда приложение в пользовательском режиме отправляет IOCTL через API DeviceIoControl, так как диспетчер ввода-вывода автоматически выравнивает буферы.
STATUS_IO_DEVICE_ERROR (ERROR_IO_DEVICE) Устройство не поддерживает команду Persistent Reserve Out.
STATUS_SUCCESS Операция прошла успешно.

Требования

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