IOCTL_NFP_GET_NEXT_SUBSCRIBED_MESSAGE IOCTL (nfpdev.h)
用戶端會重複將 IOCTL_NFP_GET_NEXT_SUBSCRIBED_MESSAGE 要求傳送至訂用帳戶句柄,以便在訊息送達時接收已訂閱的訊息。 一般而言,此 IOCTL 會在訂閱句柄中畫筆,直到符合訂閱類型的訊息實際送達為止。
主要程序代碼
輸入緩衝區
沒有
輸出緩衝區
傳回訊息數據到達時需要有效的緩衝區。 此緩衝區的第一個 DWORD 會保留給用戶端的提示,以便傳回下一個緩衝區大小。 此緩衝區一開始會是 255 個字節,但驅動程式可以藉由只提供提示並完成 IOCTL 與 STATUS_BUFFER_OVERFLOW,要求用戶端傳送更大的緩衝區。
狀態區塊
Irp->如果要求成功,IoStatus.Status 會設定為STATUS_SUCCESS。
否則,狀態為適當的錯誤條件作為NTSTATUS程式碼。
如需詳細資訊,請參閱 NTSTATUS 值。
言論
- 每次完成畫筆時,客戶端應該傳送另一個 IOCTL。 驅動程式必須使用適當的鎖定,以確保此 IOCTL 成功完成次數等於訂用帳戶類型的成功訊息接收數目。
-
以下是使用此 IOCTL 時的必要動作:
- 如果在先前未在 「Subs\」 裝置命名空間中開啟的句柄上收到此 IOCTL,驅動程式必須以STATUS_INVALID_DEVICE_STATE完成。
- 驅動程式必須維護符合訂用帳戶檔案句柄內訂用帳戶類型之已接收訊息的「已接收」佇列。
-
當驅動程式中收到此 IOCTL 時:
- 如果 「Received」 佇列是空的,則驅動程序必須將 IOCTL 畫上筆,以供稍後完成。
- 如果 「Received」 佇列不是空的,則驅動程式必須清除佇列一個訊息緩衝區、將訊息緩衝區複製到 IOCTL 的輸出緩衝區,然後立即完成 IOCTL 與 STATUS_SUCCESS。
- 如果收到符合類型的訊息,且目前沒有IOCTL筆跡,驅動程式必須將訊息緩衝區新增至「已接收」佇列。
- 如果收到符合類型的訊息,而且有可用的畫筆 IOCTL(「已接收」佇列是空的),驅動程式必須將訊息緩衝區複製到 IOCTL 的輸出緩衝區,並使用 STATUS_SUCCESS完成畫筆 IRP。 完成畫筆 IRP 之後,「已接收」佇列必須繼續空白。
- 如果驅動程式以STATUS_SUCCESS完成此 IOCTL,輸出緩衝區的第一個 DWORD [4 個字節] 必須包含下一個用戶端緩衝區大小的提示,而 IOCTL 的資訊欄位必須包含此訊息的大小加上 sizeof(DWORD) (4 個字節)。
- 如果 IOCTL 包含輸入緩衝區,驅動程式必須使用 STATUS_INVALID_PARAMETER完成 IOCTL。
- 如果收到的訊息具有長度為零的承載,驅動程序應該忽略訊息。 這是效能優化,因為 Windows WILL 會卸除長度為零的承載訊息。
- 如果收到的訊息太大而無法複製到此 IOCTL 的緩衝區,驅動程式必須將所需的緩衝區大小複製到輸出緩衝區的前 4 個字節,將 IOCTL 的 [資訊] 欄位設定為 sizeof(DWORD) (“4”),並使用 STATUS_BUFFER_OVERFLOW完成 IOCTL。 訊息緩衝區必須留在「已接收」佇列中。
- 如果收到此 IOCTL,而另一個目前在訂用帳戶句柄中畫筆,則第二個(或更新版本)必須完成STATUS_INVALID_DEVICE_STATE。
- 驅動程式必須支援手寫IOCTL的 CancelIo。
要求
要求 | 價值 |
---|---|
最低支援的用戶端 | Windows 8 |
標頭 | nfpdev.h |