TAPE_PROCESS_COMMAND_ROUTINE コールバック関数 (minitape.h)

TAPE_PROCESS_COMMAND_ROUTINE は、IOCTL 要求のデバイス固有の側面を処理します。

構文

TAPE_PROCESS_COMMAND_ROUTINE TapeProcessCommandRoutine;

TAPE_STATUS TapeProcessCommandRoutine(
  [in, out]      PVOID MinitapeExtension,
  [in, out]      PVOID CommandExtension,
  [in, out]      PVOID CommandParameters,
  [in, out]      PSCSI_REQUEST_BLOCK Srb,
  [in]           ULONG CallNumber,
  [in, optional] TAPE_STATUS StatusOfLastCommand,
  [in, out]      PULONG RetryFlags
)
{...}

パラメーター

[in, out] MinitapeExtension

ドライバー固有のミニテープ拡張機能へのポインター。 ミニクラス ドライバーが初期化時にミニテープ拡張機能を要求しなかった場合、これは NULL です。

[in, out] CommandExtension

コマンド拡張機能へのポインター。 ミニクラス ドライバーが初期化時にコマンド拡張機能を要求しなかった場合、これは NULL です。

[in, out] CommandParameters

TAPE_CREATE_PARTITION構造体を含む呼び出し元によって割り当てられたバッファーへのポインター。

[in, out] Srb

テープ クラス ドライバーによって割り当てられ、部分的に入力された SRB へのポインター。 TAPE_PROCESS_COMMAND_ROUTINE は、SRB の CDB に入力する必要があります。

  • Cdb - コマンドの SCSI CDB へのポインター。 入力する前に、 TapeClassZeroMemory を使用して CDB をクリアします。
  • CdbLength - CDB 内のバイト数を指定します。
TAPE_PROCESS_COMMAND_ROUTINE は、SRB で次のメンバーを入力することもできます。
  • DataBuffer - 転送するデータ バッファーへのポインター。 TapeClassAllocateSrbBuffer を使用して、DataTransferLength 以上の長さの DataBuffer を割り当てます。
  • DataTransferLength - SRB で転送されるバイト数を指定します。 このメンバーは TapeClassAllocateSrbBuffer によって設定されます。
  • TimeOutValue - このコマンドのタイムアウト値を指定し、テープ クラス ドライバーのデバイス拡張機能の既定のタイムアウト値をオーバーライドします。
  • SrbFlags - このコマンドのフラグを指定します。 SRB がテープ ドライブにデータを送信する場合、テープ ミニクラス ドライバーはSRB_FLAGS_DATA_OUTを設定する必要があります。 SRB がテープ・ドライブからデータを要求している場合、またはコマンドによってデータが転送されていない場合、このメンバーはゼロにすることができます。

[in] CallNumber

特定のテープ コマンドを処理 するためにTAPE_PROCESS_COMMAND_ROUTINE が呼び出された回数を指定します。 CallNumber は、このルーチンが初めて呼び出されるときに 0 で、ミニクラス ドライバーがコマンドが完了したことを示す TAPE_STATUS 値を返すまで、後続の呼び出しごとにインクリメントされます。

[in, optional] StatusOfLastCommand

最後のコマンドの状態を指定します。 特定の要求を処理する TAPE_PROCESS_COMMAND_ROUTINE の最初の呼び出しでは、 StatusOfLastCommand がTAPE_STATUS_SUCCESS。 以降の呼び出しでは、エラーが発生し、テープ ミニクラス ドライバーが前回の呼び出しで RetryFlags にRETURN_ERRORS場合、StatusOfLastCommand はTAPE_STATUS_SUCCESSまたはエラー状態になります。

[in, out] RetryFlags

テープ デバイスがエラーを報告したときにテープ クラス ドライバーが実行する必要があるアクションを指定する変数へのポインター。

下位ワードは、SCSI コマンド障害が発生した場合に実行する再試行回数を指定します。 既定値は 0 (再試行なし) です。

高次ワードには、エラーが発生した場合にテープ クラス ドライバーが制御を返す方法を指定するフラグが含まれています。

  • RETURN_ERRORSとIGNORE_ERRORSがクリア (既定値) の場合、テープ クラス ドライバーは元の要求元にエラー状態を返します。
  • ミニクラス ドライバーがRETURN_ERRORS設定されている場合、テープ クラス ドライバーは StatusOfLastCommand がエラー状態に設定されたTAPE_PROCESS_COMMAND_ROUTINEを呼び出します。
  • ミニクラス ドライバーがIGNORE_ERRORSを設定する場合、テープ クラス ドライバーは失敗の状態を成功に変換し、StatusOfLastCommand が成功に設定されたTAPE_PROCESS_COMMAND_ROUTINEを呼び出します。

戻り値

リターン コード 説明
TAPE_STATUS_SEND_SRB_AND_CALLBACK
SRB が入力され、ターゲット デバイスに送信する準備ができていることをテープ クラス ドライバーに示します。 既定では、テープ クラス ドライバーは、SRB が成功した 場合にのみTAPE_PROCESS_COMMAND_ROUTINEを再度呼び出します。 ミニクラス ドライバーは、TAPE_PROCESS_COMMAND_ROUTINEから戻る前に RetryFlags を設定することで、既定の動作を変更できます。
TAPE_STATUS_CALLBACK
テープ クラス ドライバーに CallNumber をインクリメントし、SRB をテープ デバイスに送信せずに TAPE_PROCESS_COMMAND_ROUTINE を再度呼び出すように指示します。
TAPE_STATUS_CHECK_TEST_UNIT_READY
TEST UNIT READY コマンドの SRB を入力し、SRB をデバイスに送信するようにテープ クラス ドライバーに指示します。
TAPE_STATUS_XXX
その他の戻りコードは、コマンドが完了したことをテープ クラス ドライバーに示し、成功、失敗、または警告を示します。 このルーチンで指定できる完了戻り値は次のとおりですが、これらに限定されません。
TAPE_STATUS_SUCCESS
TAPE_STATUS_INSUFFICIENT_RESOURCES
TAPE_STATUS_INVALID_DEVICE_REQUEST
TAPE_STATUS_INVALID_PARAMETER
TAPE_STATUS_IO_DEVICE_ERROR
TAPE_STATUS_MEDIA_WRITE_PROTECTED
TAPE_STATUS_NOT_IMPLEMENTED

注釈

このコールバック プレースホルダーには、次の関数を割り当てることができます。

CreatePartition

CreatePartition は、 IOCTL_TAPE_CREATE_PARTITION 要求のデバイス固有の側面を処理します。 このルーチンは必須です。 CreatePartition は、テープ クラス ドライバーによって渡された SRB 内の CDB を埋めることで、テープ上にパーティションを作成します。 通常、パーティションを作成するには、操作を完了するために一連の SRB が必要です。 CreatePartition が特定の SRB を入力して を返した後、テープ クラス ドライバーは SRB をターゲット デバイスに送信し、SRB の結果と RetryFlags の値に応じて、TapeMiniCreatePartition をもう一度呼び出します。

CreatePartition は、テープ クラス ドライバーに戻る前に、SRB に次のメンバーを入力する必要があります。

テープ ミニクラス ドライバーがミニテープ拡張機能にパーティション情報を格納している場合、 CreatePartition は、TAPE_STATUS_SUCCESSを使用してテープ クラス ドライバーに戻る前に拡張機能を更新します。

消去

Erase は、 IOCTL_TAPE_ERASE 要求のデバイス固有の側面を処理します。 このルーチンは必須です。 Erase は、テープ クラス ドライバーによって渡された SRB の CDB を入力してテープを消去します。 通常、テープを消去するには、操作を完了するために 1 つの SRB が必要です。 Erase が SRB に入力され、返された後、テープ クラス ドライバーは SRB をデバイスに送信し、SRB の結果と RetryFlags の値に応じて、Erase をもう一度呼び出します。 Erase はTAPE_STATUS_SUCCESSを返します。

GetDriveParameters

GetDriveParameters は、IOCTL_TAPE_GET_DRIVE_PARAMS要求のデバイス固有の側面を処理します。 このルーチンは必須です。 GetDriveParameters は、 テープ クラス ドライバーによって渡された SRB の CDB を入力することで、テープ ドライブ パラメーターを取得します。 通常、ドライブ パラメーターを取得するには、操作を完了するために一連の SRB が必要です。 GetDriveParameters が特定の SRB を入力して 返されると、テープ クラス ドライバーは SRB をターゲット デバイスに送信し、SRB の結果と RetryFlags の値に応じて、GetDriveParameters をもう一度呼び出します。

GetMediaParameters

GetMediaParameters は、IOCTL_TAPE_GET_MEDIA_PARAMS要求のデバイス固有の側面を処理します。 このルーチンは必須です。 GetMediaParameters は、 テープ クラス ドライバーによって渡された SRB の CDB を入力することで、テープ メディア パラメーターを取得します。 通常、メディア パラメーターを取得するには、複数の SRB を使用して操作を完了する必要があります。最初にテープ クラス ドライバーがルーチンを呼び出す際に、ミニクラス ドライバーがTAPE_STATUS_CHECK_TEST_UNIT_READYを返すことによって要求するテスト ユニットから開始します。

GetMediaParameters が特定の SRB を入力して を返した後、テープ クラス ドライバーは SRB をデバイスに送信し、SRB の結果と RetryFlags の値に応じて、GetMediaParameters をもう一度呼び出します。

GetMediaTypes

GetMediaTypes は、IOCTL_STORAGE_GET_MEDIA_TYPES_EX要求のデバイス固有の側面を処理します。 このルーチンは必須です。 GetMediaTypes は、 テープ クラス ドライバーによって渡された SRB の CDB を入力することで、テープ デバイスでサポートされているメディアの種類に関する情報を取得します。 通常、メディアの種類を取得するには、複数の SRB を使用して操作を完了する必要があります。最初にテープ クラス ドライバーがルーチンを呼び出す際にTAPE_STATUS_CHECK_TEST_UNIT_READYを返すことによってミニクラス ドライバーが要求するテスト ユニットを準備します。

GetPosition

GetPosition は、 IOCTL_TAPE_GET_POSITION 要求のデバイス固有の側面を処理します。 このルーチンは必須です。 GetPosition は、テープ クラス ドライバーによって渡された SRB 内の CDB を入力して、テープの位置を読み取ります。 通常、テープ位置の読み取りには、操作を完了するために複数の SRB が必要です。多くの場合、最初にテープ クラス ドライバーがルーチンを呼び出す際にTAPE_STATUS_CHECK_TEST_UNIT_READYを返すことによってミニクラス ドライバーが要求するテスト ユニットから始まります。

GetStatus

GetStatus は、 IOCTL_TAPE_GET_STATUS 要求のデバイス固有の側面を処理します。 このルーチンは必須です。 GetStatus は、通常、テープ クラス ドライバーにテスト ユニット準備完了コマンドを発行するように指示することで、テープ デバイスの状態を読み取ります。

デバイスが (ミニクラス ドライバーが TapeMiniTapeError ルーチンで処理するエラーとしてクリーニングの必要性を報告するのではなく) ドライブが意味のあるデータをクリーニングする必要があるかどうかを示す場合、 GetStatus は、センス データを取得するためにテープ クラス ドライバーによって渡された SRB の CDB に入力し、必要に応じてTAPE_STATUS_REQUIRES_CLEANINGを返します。

準備

Prepare は、 IOCTL_TAPE_PREPARE 要求のデバイス固有の側面を処理します。 このルーチンは必須です。 Prepare は、テープ クラス ドライバーによって渡された SRB に CDB を入力してテープを準備します。 デバイスが要求された操作をサポートしている場合、テープを準備するには通常、1 つの SRB が必要です。 Prepare が SRB に入力され、返された後、テープ クラス ドライバーは SRB をデバイスに送信し、SRB の結果と RetryFlags の値に応じて、Prepare をもう一度呼び出します。

SetDriveParameters

SetDriveParameters は、IOCTL_TAPE_SET_DRIVE_PARAMS要求のデバイス固有の側面を処理します。 このルーチンは必須です。 SetDriveParameters は、 テープ クラス ドライバーによって渡された SRB の CDB を入力することによって、テープ デバイスのパラメーターを設定します。 通常、パラメーターの設定には、操作を完了するための一連の SRB が含まれます。 SetDriveParameters が特定の SRB を入力し、返した後、テープ クラス ドライバーは SRB をデバイスに送信し、SRB の結果と RetryFlags の値に応じて、SetDriveParameters をもう一度呼び出します。

SetMediaParameters

SetMediaParameters は、IOCTL_TAPE_SET_MEDIA_PARAMS要求のデバイス固有の側面を処理します。 このルーチンは必須です。 SetMediaParameters は、テープ クラス ドライバーによって渡された SRB 内の CDB を埋めることで、テープのブロック サイズを設定します。 通常、ブロック サイズを設定するには、テープ クラス ドライバーがルーチンを初めて呼び出したときにTAPE_STATUS_CHECK_TEST_UNIT_READYを返すことによってミニクラス ドライバーが要求するテスト ユニットの準備が整った状態で、操作を完了するために複数の SRB が必要です。

SetMediaParameters が特定の SRB を入力して返した後、テープ クラス ドライバーは SRB をデバイスに送信し、SRB の結果と RetryFlags の値に応じて、SetMediaParameters をもう一度呼び出します。

SetPosition

SetPosition は、 IOCTL_TAPE_SET_POSITION 要求のデバイス固有の側面を処理します。 このルーチンは必須です。 SetPosition は 、テープ クラス ドライバーによって渡された SRB の CDB を入力して、テープの位置を設定します。 通常、位置を設定するには 1 つの SRB が必要です。 SetPosition が SRB に入力され、返された後、テープ クラス ドライバーは SRB をデバイスに送信し、SRB の結果と RetryFlags の値に応じて、SetPosition をもう一度呼び出します。 その後、SetPosition はTAPE_STATUS_SUCCESSを返します。

WriteMarks

WriteMarks は、IOCTL_TAPE_WRITE_MARKS要求のデバイス固有の側面を処理します。 このルーチンは必須です。 WriteMarks は、 テープ クラス ドライバーによって渡された SRB に CDB を入力することで、テープにマークを書き込みます。 通常、マークを書き込むには、操作を完了するために 1 つの SRB が必要です。 WriteMarks が SRB に入力され、返されると、テープ クラス ドライバーは SRB をデバイスに送信し、SRB の結果と RetryFlags の値に応じて、WriteMarks を再度呼び出します。 その後、WriteMarks は TAPE_STATUS_SUCCESSを返します。

PreProcessReadWrite

PreProcessReadWrite は、読み取り操作と書き込み操作の前に必要なデバイス固有の操作を実行する、省略可能な特殊な目的のルーチンです。 ほとんどのテープ ミニクラス ドライバーでは、このルーチンは必要ありません。 PreProcessReadWrite ルーチンのアクティビティは、デバイス固有です。 ルーチンは、クラス ドライバーによって渡された情報を使用して、読み取りと書き込みの特別な前処理を実装できます。 ドライブの機能が制限されている場合、ドライバーは、たとえば、一貫性のある状態を維持するためにこのルーチンを必要とすることがあります。

テープ ミニクラス ドライバーは、DriverEntry ルーチンから TapeClassInitialize に渡すTAPE_INIT_DATA_EX構造体で、このルーチンの NULL 以外のエントリ ポイントを設定する場合、テープ クラス ドライバーは、テープ デバイスの読み取りと書き込みの各操作の前にそれを呼び出します。 クラス ドライバーは、このルーチンから情報を返す必要はありません。

WMIOperations

WMIOperations は、テープ クラス ドライバーからのすべての WMI 呼び出しの共通エントリ ポイントです。 WMI をサポートするミニドライバーは、ミニドライバーのTAPE_PROCESS_COMMAND_ROUTINE ルーチンを指すように、TAPE_INIT_DATA_EX構造体で関数ポインター メンバー WMIOperations 設定する必要があります。 ミニドライバーは、 TapeClassInitialize を呼び出す前に、DriverEntry ルーチンでこれを行う必要があります。 ミニドライバーが WMI 操作をサポートしていない場合は、TapeWMIOperations フィールドを NULL に設定する必要があります。

テープ クラス ドライバーは、TAPE_WMI_OPERATIONS構造体のメンバーに値を割り当て、CommandParameters パラメーターでミニドライバーの WMIOperations ルーチンにこの構造体を渡します。 他のミニドライバー ルーチンと同様に、 WMIOperations は、指定された WMI メソッドを実装するために必要な SCSI 要求ブロック (SRB) とコマンド記述子ブロック (CDB) を入力、作成、初期化し、テープ クラス ドライバーに制御を返します。 その後、テープ クラス ドライバーはポート ドライバーを呼び出して要求を実行します。

ミニドライバーは、TAPE_WMI_OPERATIONS構造体の DataBuffer メンバーが指すバッファー内の WMI データを返します。

要件

要件
対象プラットフォーム デスクトップ
Header minitape.h (Minitape.h を含む)

こちらもご覧ください

SCSI_REQUEST_BLOCK

TAPE_STATUS

TapeClassAllocateSrbBuffer

TapeClassZeroMemory