IOCTL_STORAGE_PERSISTENT_RESERVE_IN IOCTL (ntddstor.h)

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

Основной код

IRP_MJ_DEVICE_CONTROL

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

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

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

  • RESERVATION_ACTION_READ_KEYS
  • RESERVATION_ACTION_READ_RESERVATIONS

PR_IN. Длина выделения — это размер (в байтах) буфера, выделенного для возвращаемого списка параметров.

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

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

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

Для PR_IN. ServiceAction = RESERVATION_ACTION_READ_KEYS, выходной буфер содержит структуру PRI_REGISTRATION_LIST и должен быть не менее sizeof(PRI_REGISTRATION_LIST).

Для PR_IN. ServiceAction = RESERVATION_ACTION_READ_RESERVATIONS, выходной буфер содержит структуру PRI_RESERVATION_LIST и должен быть не менее sizeof(PRI_RESERVATION_LIST).

Если выделенный буфер слишком мал, чтобы вернуть все данные постоянного резервирования в, будет возвращено успешное выполнение, а в поле AdditionalLength списка параметров будет возвращен необходимый размер.

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

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

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

Для поля Information задан размер выходного буфера. Для ServiceAction = RESERVATION_ACTION_READ_KEYS выходной буфер является PRI_REGISTRATION_LIST структурой. Для ServiceAction = RESERVATION_ACTION_READ_RESERVATIONS выходной буфер является PRI_REGISTRATION_LIST структурой.

Для поля Состояние задано одно из следующих значений:

Значение Значение
STATUS_BUFFER_OVERFLOW (ERROR_MORE_DATA) Выходной буфер слишком мал для хранения данных постоянного резервирования в. Поле AdditionalLength выходного буфера будет содержать размер возвращаемых данных.
STATUS_DEVICE_BUSY (ERROR_BUSY) Команда завершилась сбоем из-за конфликта резервирования (дополнительные сведения см. в спецификации SCSI Primary Commands - 2 (SPC-2)**).
STATUS_INFO_LENGTH_MISMATCH Длина входного буфера для IOCTL меньше, чем sizeof(PERSISTENT_RESERVE_COMMAND), или размер, указанный в структуре данных PERSISTENT_RESERVE_COMMAND меньше, чем sizeof(PERSISTENT_RESERVE_COMMAND).
STATUS_INVALID_DEVICE_REQUEST (ERROR_INVALID_FUNCTION) Код элемента управления вводом-выводом (IOCTL_STORAGE_PERSISTENT_RESERVE_IN) не поддерживается драйверами хранилища.
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 In.
STATUS_SUCCESS Операция выполнена успешно.

Требования

Требование Значение
Заголовок ntddstor.h (включая Ntddstor.h)