汎用ストレージ クラス ドライバー (classpnp.sys) は、永続予約コマンドを発行するための I/O コントロール (IOCTL) インターフェイスを公開します。 永続予約 In コマンドを受け取ったときのストレージ・デバイスの動作は、SCSI 基本コマンド - 2 (SPC-2) 仕様で説明されています。 IOCTL インターフェイスでは、呼び出し元が永続予約コマンドの物理デバイスへの読み取りアクセス権を持っている必要があります。 ユーザー モード アプリケーション、サービス、カーネル モード ドライバーは、この IOCTL を使用して永続的な予約を制御できます。 ドライバーから呼び出された場合は、IRQL < DISPATCH_LEVEL で実行されているスレッドからこの IOCTL を呼び出す必要があります。 この IOCTL は、FILE_READ_ACCESSで定義され、永続的な予約の実行コマンドを発行するための読み取りアクセス許可をデバイス ハンドルに必要とします。
メジャー コード
入力バッファー
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 フィールド パラメーター リストに返されます。
出力バッファーの長さ
出力バッファーの長さ (バイト単位)。
状態ブロック
情報 フィールドは、出力バッファーのサイズに設定されます。 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 プライマリ コマンド - 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) | I/O コントロール コード (IOCTL_STORAGE_PERSISTENT_RESERVE_IN) は、ストレージ ドライバーではサポートされていません。 |
STATUS_INVALID_PARAMETER (ERROR_INVALID_PARAMETER) | 入力バッファー構造のサイズが正しくないか、設定されています。 |
STATUS_INVALID_USER_BUFFER (ERROR_INVALID_USER_BUFFER) | 入力バッファーまたは出力バッファーが、デバイスまたはアダプターに対して正しくアラインされていません。 この状態は、ドライバーが IOCTL をストレージ スタックに送信した場合にのみ返されます。 I/O Manager によってバッファーが自動的にアラインされるため、ユーザー モード アプリケーションが DeviceIoControl API を介して IOCTL を送信した場合、この状態は返されません。 |
STATUS_IO_DEVICE_ERROR (ERROR_IO_DEVICE) | デバイスは、永続的な予約コマンドをサポートしていません。 |
STATUS_SUCCESS | 操作が成功しました。 |
必要条件
要件 | 価値 |
---|---|
ヘッダー | ntddstor.h (Ntddstor.h を含む) |