IOCTL_NFP_GET_NEXT_SUBSCRIBED_MESSAGE IOCTL (nfpdev.h)
クライアントは、受信時にサブスクライブされたメッセージを受信するために、 IOCTL_NFP_GET_NEXT_SUBSCRIBED_MESSAGE 要求をサブスクリプション ハンドルに繰り返し送信します。 通常、この IOCTL は、サブスクライブされた種類に一致するメッセージが実際に到着するまで、サブスクリプション ハンドルにペンされます。
メジャー コード
[入力バッファー]
なし
出力バッファー
メッセージ データが到着したときにメッセージ データを返す場合は、有効なバッファーが必要です。 このバッファーの最初の DWORD は、返されるバッファーの次のサイズに対するクライアントへのヒント用に予約されています。 通常、このバッファーは最初は 255 バイトですが、ドライバーは、ヒントのみを提供し、STATUS_BUFFER_OVERFLOWを使用して IOCTL を完了することで、より大きなバッファーをクライアントに送信することを要求できます。
ステータス ブロック
要求が成功した場合、Irp-IoStatus.Status> はSTATUS_SUCCESSに設定されます。
それ以外の場合は、NTSTATUS コードとして適切なエラー条件の状態。
詳細については、「 NTSTATUS 値」を参照してください。
注釈
- クライアントは、ペンドされた IOCTL が完了するたびに別の IOCTL を送信する必要があります。 ドライバーは、適切なロックを使用して、この IOCTL の正常な完了の数がサブスクリプションの種類の成功したメッセージ受信の数と同じであることを保証する必要があります。
-
この IOCTL を使用する場合に必要なアクションを次に示します。
- "Subs\" デバイス名前空間で以前に開かれなかったハンドルでこの IOCTL を受信した場合、ドライバーはSTATUS_INVALID_DEVICE_STATEで完了する必要があります。
- ドライバーは、サブスクリプション ファイル ハンドル内のサブスクリプションの種類と一致する受信メッセージの "受信済み" キューを維持する必要があります。
-
この IOCTL がドライバーで受信された場合:
- "Received" キューが空の場合、ドライバーは後で完了するために IOCTL をペンで処理する必要があります。
- "Received" キューが空でない場合、ドライバーは 1 つのメッセージ バッファーをデキューし、メッセージ バッファーを IOCTL の出力バッファーにコピーし、STATUS_SUCCESSを使用して IOCTL をすぐに完了する必要があります。
- 型に一致するメッセージが受信され、IOCTL が現在処理されていない場合、ドライバーはメッセージ バッファーを "Received" キューに追加する必要があります。
- 型に一致するメッセージが受信され、使用可能な IOCTL が存在する場合 ("受信済み" キューが空です)、ドライバーはメッセージ バッファーを IOCTL の出力バッファーにコピーし、STATUS_SUCCESSでペン付きの IRP を完了する必要があります。 "Received" キューは、ペン付き IRP が完了した後も空の状態を続ける必要があります。
- ドライバーがSTATUS_SUCCESSを使用してこの IOCTL を完了した場合、出力バッファーの最初の DWORD [4 バイト] には、次のクライアント バッファーのサイズのヒントが含まれている必要があります。IOCTL の Information フィールドには、このメッセージのサイズと sizeof(DWORD) (4 バイト) を含める必要があります。
- IOCTL に入力バッファーが含まれている場合、ドライバーは、STATUS_INVALID_PARAMETERを使用して IOCTL を完了する必要があります。
- 受信したメッセージに長さ 0 のペイロードがある場合、ドライバーはメッセージを無視する必要があります。 これは、Windows が長さ 0 のペイロードを持つメッセージを削除するため、パフォーマンスの最適化です。
- 受信したメッセージが大きすぎてこの IOCTL のバッファーにコピーできない場合、ドライバーは必要なバッファー サイズを出力バッファーの最初の 4 バイトにコピーし、IOCTL の "情報" フィールドを sizeof(DWORD) ("4") に設定し、STATUS_BUFFER_OVERFLOWを使用して IOCTL を完了する必要があります。 メッセージ バッファーは、"Received" キューに残しておく必要があります。
- サブスクリプション ハンドルに別の IOCTL が現在ペンされている間にこの IOCTL を受信した場合、2 つ目 (またはそれ以降) は、STATUS_INVALID_DEVICE_STATEで完了する必要があります。
- ドライバーは、ペンドされた IOCTL の CancelIo をサポートする必要があります。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows 8 |
Header | nfpdev.h |