Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Драйвер класса универсального хранилища (classpnp.sys) предоставляет интерфейс управления ввода-вывода (IOCTL) для выдачи команд постоянного резервирования. Поведение устройства хранения при получении команды постоянного резервирования описано в спецификации SCSI Primary Commands - 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. ПараметрList используется для хранения структуры PRO_PARAMETER_LIST. Эта структура является обязательной и должна быть связана с остальной частью PERSISTENT_RESERVE_COMMAND структуры.
Длина входного буфера
Длина структуры PERSISTENT_RESERVE_COMMAND.
Выходной буфер
Никакой.
Длина выходного буфера
Никакой.
Блок состояния
Поле сведений равно нулю.
Поле состояние имеет одно из следующих значений.
| Ценность | Значение |
|---|---|
| STATUS_DEVICE_BUSY (ERROR_BUSY) | Сбой команды из-за конфликта резервирования (дополнительные сведения см. в спецификации SCSI Primary Commands - 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_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 (include Ntddstor.h) |