記憶域クラス ドライバーの GetDescriptor ルーチン
データ転送操作の場合、記憶域クラス ドライバーには、デバイスが接続されているバスを駆動する各 HBA に関する構成情報が必要です。 この情報を取得するには、クラス ドライバーは、内部の GetDescriptor ルーチンを呼び出すか、StartDevice ルーチンで同じ機能を実装します。 (StartDevice の詳細については、ストレージ クラス ドライバーでの PnP Start の処理を参照してください。)
GetDescriptor ルーチンは、クラス ドライバーがデバイス拡張子に格納するデバイス記述子とアダプター記述子を取得するために、ポート ドライバーのクエリ プロパティ要求 (IOCTL_STORAGE_QUERY_PROPERTY を使用した IRP_MJ_DEVICE_CONTROL) をビルドして設定します。 クラス ドライバーは、返された記述子データに従って、デバイス拡張子でドライバー ライターによって決定されたフラグを設定することもできます。
クラス ドライバーは、返された STORAGE_DEVICE_DESCRIPTOR データを調べて、SCSI デバイスの種類、デバイスのメディア (存在する場合) がリムーバブルか (RemovableMedia)、デバイスが複数の未処理のコマンドか (CommandQueueing)、およびさまざまな ID 文字列をサポートしているかどうかなど、デバイスの機能 (SCSI 照会データまたは SCSI に相当しないデータ) を判断します。 クラス ドライバーは、返された STORAGE_ADAPTER_DESCRIPTOR データを調べて、次のようなアダプター機能を決定します。
特定の HBA が 1 回の操作で転送できる最大バイト数 (MaximumTransferLength)。
HBA が非連続物理ページによってバックアップされたバッファー データを転送できる場合 (つまり、散布/収集をサポートしている場合)、転送操作ごとに、バッファーごとに管理できる非連続物理ページの数 (MaximumPhysicalPages)。
クラス ドライバーがデバイス オブジェクト (AlignmentMask) の AlignmentRequirement フィールドを適切に設定できるように、転送に対する HBA のアラインメント要件。
IOCTL_SCSI_PASS_THROUGH 要求を送信するアプリケーションも、このフィールドを使用する場合があります。
デバイス オブジェクトでの AlignmentRequirement の設定の詳細については、デバイス オブジェクトの初期化を参照してください。
HBA が SCSI タグ付きキューまたは論理ユニットごとの内部キュー (CommandQueueing) をサポートしているかどうか。
HBA が同期転送 (AcceleratedTransfer) をサポートしているかどうか。
HBA が内部的にデータをキャッシュするかどうか (CachesData)。
クラス ドライバーは、この情報を FDO のデバイス拡張機能に格納する必要があります。そのため、ディスパッチ ルーチンは、記憶域ポート ドライバーに送信されるすべての要求が、基になる HBA のサイズ、物理的な中断の数、配置要件に準拠していることを確認できます。 クラス ドライバーディスパッチ ルーチンの詳細については、記憶域クラス ドライバーのディスパッチ ルーチンを参照してください。 デバイス拡張機能の設定の詳細については、記憶域クラス ドライバーのデバイス拡張機能の設定を参照してください。