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