次の方法で共有


スマート カード ドライバー ライブラリのコールバックルーチン

スマート カード アーキテクチャは、標準コールバック ルーチン型のセットを定義します。 これらのルーチンの詳細については、「スマート カード ドライバーのコールバック」を参照してください。

リーダー ドライバーは、これらのコールバック ルーチンのポインターを SMARTCARD_EXTENSION 型のスマート カード デバイス拡張機能に格納して、ドライバー ライブラリ ルーチン SmartcardDeviceControl (WDM) がこれらのコールバック ルーチンを呼び出せるようにする必要があります。 これらのポインターは、SMARTCARD_EXTENSION 構造体の ReaderFunction メンバーにある配列に格納されます。 個々のコールバック ルーチンは、ReaderFunction 配列のインデックスとして使用する必要がある、一連の定数値によって識別できます。

たとえば、SmartcardDeviceControlIOCTL_SMARTCARD_POWER 要求の処理が完了するたびに DriverCardPower という名前のリーダー ドライバーでコールバック ルーチンを呼び出す場合は、次のように RDF_CARD_POWER 定数を使用してデバイス拡張機能を初期化する必要があります。

SmartcardExtension->ReaderFunction[RDF_CARD_POWER] = 
DriverCardPower;

RDF_CARD_POWER は固定のシステム定義定数で、IOCTL_SMARTCARD_POWER 要求を処理するコールバック ルーチンに常に対応します。

処理対象の IOCTL に対応する ReaderFunction 配列のメンバーが NULL の場合、SmartcardDeviceControl は、リーダー ドライバーに状態 STATUS_NOT_SUPPORTED を返します。 この動作は特定のケースで役に立ちます。 たとえば、ドライバーがカードの排出やカードの取り込みをサポートしていない場合は、ReaderFunction 配列の適切なメンバーを NULL に割り当てるだけで、そのメンバー ルーチンが呼び出されるたびに SmartcardDeviceControl は STATUS_NOT_SUPPORTED を返します。

次の表に、さまざまな種類のコールバック ルーチンを識別する定数を示します。 これらは、ReaderFunction 配列のインデックスとして使用する必要がある定数です。 また、この表では、各ルーチンの種類の簡単な説明も示し、リーダー ドライバーによるルーチンの実装が必須であるか省略可能であるかも示します。

インデックス 対応するコールバック ルーチンの説明 リーダー ドライバーによる実装

RDF_CARD_POWER

挿入されたスマート カードをリセットまたはオフにします

必須

RDF_CARD_EJECT

挿入されたスマート カードを排出します

省略可能

RDF_CARD_TRACKING

カードの挿入と取り出しを追跡するイベント ハンドラーをインストールします

必須

RDF_IOCTL_VENDOR

ベンダー固有の IOCTL 操作を実行します

省略可能

RDF_READER_SWALLOW

機械的な取り込みを行います

省略可能

RDF_SET_PROTOCOL

カード リーダー内のカードの転送プロトコルを選択します

必須

RDF_TRANSMIT

データ転送を実行します

必須

スマート カード ドライバーのコールバック」で説明されているように、リーダー ドライバーは、これらのルーチンを呼び出すときに入力バッファーから呼び出し元のパラメーターを取得する必要があります。 さらに、リーダー ドライバーは、同セクションの説明にあるように、適切なバッファー領域に出力データを格納する必要があります。

カード追跡コールバック ルーチン以外のコールバック ルーチンが STATUS_PENDING を返すと、スマート カード ライブラリは、リーダー ドライバーからのそれ以降の呼び出しを処理しなくなります。 (カード追跡コールバック ルーチンの詳細については、「RDF_CARD_TRACKING」を参照してください)。ライブラリがこの状態の間にリーダー ドライバーがドライバー ライブラリ ルーチンを使用しようとすると、ライブラリ ルーチンは状態 STATUS_DEVICE_BUSY を返します。 リーダー ドライバーは、SmartcardDeviceControl を呼び出すことができないと IOCTL 要求を処理できないため、実質的にリソース マネージャーからの IOCTL 要求を処理しなくなります。