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


IOCTL_STORAGE_PERSISTENT_RESERVE_IN IOCTL (ntddstor.h)

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

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

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

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

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

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

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

Ценность Значение
STATUS_BUFFER_OVERFLOW (ERROR_MORE_DATA) Буфер выходных данных слишком мал, чтобы сохранить постоянный резерв данных. Поле дополнительного буфера вывода будет содержать размер возвращаемых данных.
STATUS_DEVICE_BUSY (ERROR_BUSY) Сбой команды из-за конфликта резервирования (дополнительные сведения см. в спецификации SCSI Primary Commands - 2 (SPC-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_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 (include Ntddstor.h)