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-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) |