IOCTL_STORAGE_PERSISTENT_RESERVE_OUT IOCTL (ntddstor.h)
Универсальный драйвер класса хранения (classpnp.sys) предоставляет интерфейс управления вводом-выводом (IOCTL) для выдачи команд постоянного резервирования. Поведение запоминающего устройства при получении команды Persistent Reserve Out описано в спецификации основных команд SCSI — 2 (SPC-2). Интерфейс IOCTL требует, чтобы вызывающий объект получил доступ на чтение и запись к физическому устройству для команд постоянного резервирования. Приложения, службы и драйверы в режиме ядра в пользовательском режиме могут использовать этот IOCTL для управления постоянными резервированиями. При вызове из драйвера этот IOCTL должен вызываться из потока, работающего в IRQL < DISPATCH_LEVEL. Этот IOCTL определяется с помощью FILE_READ_ACCESS и FILE_WRITE_ACCESS, поэтому для выполнения команды Persistent Reserve Out дескриптор устройства должен иметь разрешения на чтение и запись.
Основной код
Входной буфер
Буфер в 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. ParameterList используется для хранения структуры PRO_PARAMETER_LIST . Эта структура является обязательной и должна быть смежна с остальной частью PERSISTENT_RESERVE_COMMAND структуры.
Длина входного буфера
Длина структуры PERSISTENT_RESERVE_COMMAND .
Выходной буфер
Нет.
Длина выходного буфера
Нет.
Блок состояния
Для поля Сведения задано значение ноль.
Для поля Состояние задано одно из следующих значений.
Значение | Значение |
---|---|
STATUS_DEVICE_BUSY (ERROR_BUSY) | Команда завершилась сбоем из-за конфликта резервирования (дополнительные сведения см. в спецификации основных команд SCSI — 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_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 (включая Ntddstor.h) |