次の方法で共有


EVT_SERCX2_PIO_RECEIVE_READ_BUFFER コールバック関数 (sercx.h)

EvtSerCx2PioReceiveReadBuffer イベント コールバック関数は、シリアル フレームワーク拡張機能 (SerCx2) のバージョン 2 によって呼び出され、プログラムされた I/O (PIO) を使用してシリアル コントローラーの受信 FIFO から読み取りバッファーにデータを転送します。

構文

EVT_SERCX2_PIO_RECEIVE_READ_BUFFER EvtSercx2PioReceiveReadBuffer;

ULONG EvtSercx2PioReceiveReadBuffer(
  [in]  SERCX2PIORECEIVE PioReceive,
  [out] PUCHAR Buffer,
  [in]  ULONG Length
)
{...}

パラメーター

[in] PioReceive

PIO 受信オブジェクトへの SERCX2PIORECEIVE ハンドル。 シリアル コントローラー ドライバーは、以前にこのオブジェクトを作成するために、SerCx2PioReceiveCreate メソッドを呼び出しました。

[out] Buffer

読み取りバッファーへのポインター。 このパラメーターは、システム メモリ内のロックダウン バッファーの仮想アドレスです。

[in] Length

受信したデータを格納するために使用できる読み取りバッファー内のバイト数。

戻り値

EvtSerCx2PioReceiveReadBuffer 関数は、シリアル コントローラー ハードウェアの受信 FIFO から読み取りバッファーに正常に転送されたデータのバイト数を返します。

備考

シリアル コントローラー ドライバーでは、この関数を実装する必要があります。 ドライバーは、PIO 受信オブジェクトを作成する SerCx2PioReceiveCreate 呼び出しに関数を登録します。

SerCx2 は、PIO 受信トランザクション中に EvtSerCx2PioReceiveReadBuffer 関数を複数回呼び出す場合があります。 EvtSerCx2PioReceiveReadBuffer 呼び出し 1 つで十分です。この呼び出しで、受信 FIFO からのデータを読み取りバッファーに格納できます。 それ以外の場合、SerCx2 は、読み取りバッファーがいっぱいになるまで、受信 FIFO でより多くのデータが使用できるようになると、この関数を呼び出し続けます。

EvtSerCx2PioReceiveReadBuffer 関数は、PIO を使用して、受信 FIFO から読み取りバッファーにできるだけ多くのバイトを転送します。 この関数は、この関数に渡されるバッファーがいっぱいでなく、ライン ステータス レジスタ (LSR) が FIFO からより多くのデータを使用できる場合に限り、FIFO からデータを転送し続けます。 LSR が FIFO が空であることを示す場合、関数はバッファーを埋めずに戻ります。 それ以外の場合、関数はバッファーを埋め、返します。 どちらの場合も、この関数によって返される値は、受信 FIFO から読み取りバッファーに正常に転送されたデータのバイト数です。

通常、EvtSerCx2PioReceiveReadBuffer 関数は割り込みを有効にしません。 代わりに、関数が読み取りバッファーを埋める前に受信 FIFO がデータ不足になった場合、SerCx2 はイベント コールバック関数 EvtSerCx2PioReceiveEnableReadyNotification 呼び出して準備完了通知を有効にします。この関数は、受信 FIFO で使用可能なデータが増えたときに発生する割り込みを有効にします。

EvtSerCx2PioReceiveReadBuffer 関数を連続して呼び出すたびに、SerCx2 は、バッファー を調整して、入力する次のバッファー領域を指すように調整し、Length バッファーに残っている空き領域のバイト数に設定します。

SerCx2 が EvtSerCx2PioReceiveEnableReadyNotification 関数を呼び出すと、準備完了通知が有効になることはありません。 ただし、SerCx2 は、SerCx2PioReceiveReady メソッドを呼び出したのと同じスレッドからこの関数を呼び出す可能性があります。

ドライバーが EvtSerCx2PioReceiveInitializeTransaction 関数を実装する場合、SerCx2 は、EvtSerCx2PioReceiveReadBuffer 関数への最初の呼び出しの前に、PIO 送信トランザクションの開始時にこの関数を呼び出します。 ドライバーは、EvtSerCx2PioReceiveCleanupTransaction 関数を実装する場合、SerCx2 は、EvtSerCx2PioReceiveReadBuffer 関数への最後の呼び出しの後、PIO 受信トランザクションの終了時にこの関数を呼び出します。

PiO 受信トランザクション中に EvtSerCx2PioReceiveReadBuffer 関数を呼び出すことに加えて、SerCx2 はこの関数を呼び出して、シリアル コントローラーが D0 デバイスの電源状態を終了する直前に受信 FIFO の状態を保存します。 詳細については、「 SerCx2SaveReceiveFifoOnD0Exitを参照してください。

PIO 受信トランザクションの詳細については、「SerCx2 PIO-Receive Transactions」を参照してください。

EvtSerCx2PioReceiveReadBuffer コールバック関数 を定義するには、まず、定義するコールバック関数の型を識別する関数宣言を指定する必要があります。 Windows には、ドライバーのコールバック関数の種類のセットが用意されています。 コールバック関数の種類を使用して関数を宣言すると、ドライバーのコード分析、静的ドライバー検証ツール (SDV)、およびその他の検証ツールを すると、エラーが検出され、Windows オペレーティング システムのドライバーを記述するための要件になります。

たとえば、という名前の MyPioReceiveReadBuffer コールバック関数を定義するには、次のコード例に示すように、EVT_SERCX2_PIO_RECEIVE_READ_BUFFER 関数型を使用します。

EVT_SERCX2_PIO_RECEIVE_READ_BUFFER  MyPioReceiveReadBuffer;

次に、次のようにコールバック関数を実装します。

_Use_decl_annotations_
ULONG
  MyPioReceiveReadBuffer(
    SERCX2PIORECEIVE  PioReceive,
    PUCHAR  Buffer,
    ULONG  Length

    )
  {...}

EVT_SERCX2_PIO_RECEIVE_READ_BUFFER 関数の型は、Sercx.h ヘッダー ファイルで定義されています。 コード分析ツールの実行時にエラーをより正確に識別するには、Use_decl_annotations 注釈を関数定義に追加してください。 Use_decl_annotations 注釈により、ヘッダー ファイル内の EVT_SERCX2_PIO_RECEIVE_READ_BUFFER 関数型に適用される注釈が確実に使用されます。 関数宣言の要件の詳細については、「KMDF ドライバーの関数ロール型を使用して関数を宣言する」を参照してください。 Use_decl_annotationsの詳細については、「関数の動作に注釈を付ける」を参照してください。

必要条件

要件 価値
サポートされる最小クライアント Windows 8.1以降で使用できます。
ターゲット プラットフォーム の デスクトップ
ヘッダー sercx.h
IRQL IRQL <= DISPATCH_LEVEL で呼び出されます。

関連項目

EvtSerCx2PioReceiveCleanupTransaction

EvtSerCx2PioReceiveEnableReadyNotification

EvtSerCx2PioReceiveInitializeTransaction の

SERCX2PIORECEIVE

SerCx2PioReceiveCreate