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

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

構文

EVT_SERCX2_PIO_TRANSMIT_WRITE_BUFFER EvtSercx2PioTransmitWriteBuffer;

ULONG EvtSercx2PioTransmitWriteBuffer(
  [in] SERCX2PIOTRANSMIT PioTransmit,
  [in] PUCHAR Buffer,
  [in] ULONG Length
)
{...}

パラメーター

[in] PioTransmit

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

[in] Buffer

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

[in] Length

送信可能な書き込みバッファー内のバイト数。

戻り値

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

備考

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

SerCx2 は、PIO 送信トランザクション中に EvtSerCx2PioTransmitWriteBuffer 関数を複数回呼び出す場合があります。 この呼び出しで書き込みバッファーの完全な内容を送信 FIFO に転送できる場合は、EvtSerCx2PioTransmitWriteBuffer 呼び出しを 1 つの で十分です。 それ以外の場合、SerCx2 は書き込みバッファーが空になるまで、送信 FIFO でより多くの領域が使用可能になると、この関数を呼び出し続けます。

書き込みバッファーの最初のバイトから始めて、EvtSerCx2PioTransmitWriteBuffer 関数は PIO を使用して、バッファーから送信 FIFO にできるだけ多くのバイトを転送します。 この関数は、バッファーが空でない限り、バッファーからデータを転送し続け、行ステータス レジスタ (LSR) は FIFO がより多くのデータを受け入れることを示します。 LSR が FIFO がこれ以上データを受け入れないことを示している場合、関数はバッファーを空にせずに戻ります。 それ以外の場合、関数はバッファー内のすべてのバイトを転送して返します。 どちらの場合も、この関数によって返される値は、書き込みバッファーから送信 FIFO に正常に転送されたデータのバイト数です。

通常、EvtSerCx2PioTransmitWriteBuffer 関数は割り込みを有効にしません。 代わりに、関数が書き込みバッファーの内容全体を送信 FIFO に転送できない場合、SerCx2 はイベント コールバック関数 EvtSerCx2PioTransmitEnableReadyNotification 呼び出して準備完了通知を有効にし、この関数は送信 FIFO が空になったときに発生する割り込みを有効にします。

EvtSerCx2PioTransmitWriteBuffer 関数を連続して呼び出すたびに、SerCx2 はバッファー内の残りのデータを指すように Buffer を調整し、Length をバッファーに残っているデータ バイト数に設定します。

SerCx2 が EvtSerCx2PioTransmitEnableReadyNotification 関数を呼び出すとき、準備完了通知は有効にされません。 ただし、SerCx2 は、SerCx2PioTransmitReady メソッドを呼び出したドライバーと同じスレッドからこの関数を呼び出す可能性があります。

ドライバーが evtSerCx2PioTransmitInitializeTransaction 関数 実装する場合、SerCx2 は、EvtSerCx2PioTransmitWriteBuffer 関数への最初の呼び出しの前に、PIO 送信トランザクションの開始時にこの関数を呼び出します。 ドライバーが EvtSerCx2PioTransmitCleanupTransaction 関数を実装する場合、SerCx2 は、最後の EvtSerCx2PioTransmitWriteBuffer 呼び出しの後、PIO 送信トランザクションの終了時にこの関数を呼び出します。 EvtSerCx2PioTransmitDrainFifoEvtSerCx2PioTransmitCancelDrainFifo、および EvtSerCx2PioTransmitPurgeFifo 関数の呼び出しが実装されている場合は

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

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

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

EVT_SERCX2_PIO_TRANSMIT_WRITE_BUFFER  MyPioTransmitWriteBuffer;

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

_Use_decl_annotations_
ULONG
  MyPioTransmitWriteBuffer(
    SERCX2PIOTRANSMIT  PioTransmit,
    PUCHAR Buffer,
    ULONG Length
    )
  {...}

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

必要条件

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

関連項目

EvtSerCx2PioTransmitCancelDrainFifo を する

EvtSerCx2PioTransmitDrainFifo の

EvtSerCx2PioTransmitEnableReadyNotification の

EvtSerCx2PioTransmitInitializeTransaction の

EvtSerCx2PioTransmitPurgeFifo の

SERCX2PIOTRANSMIT

SerCx2PioTransmitCreate を する