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” 佇列不是空的,則驅動程式必須清除一個訊息緩衝區、將訊息緩衝區複製到 IOCTL 的輸出緩衝區,然後立即完成具有 STATUS_SUCCESS 的 IOCTL。
- 如果收到符合類型的訊息,且目前未寫入任何 IOCTL,驅動程式必須將訊息緩衝區新增至「已接收」佇列。
- 如果收到符合類型的訊息,而且有可用的畫筆 IOCTL, (“Received” 佇列是空的) ,則驅動程式必須將訊息緩衝區複製到 IOCTL 的輸出緩衝區,並使用STATUS_SUCCESS完成手寫的 IRP。 完成手寫筆 IRP 之後,「已接收」佇列必須繼續空白。
- 如果驅動程式使用 STATUS_SUCCESS 完成此 IOCTL,則輸出緩衝區的第一個 DWORD [4 位元組] 必須包含下一個用戶端緩衝區大小的提示,而 IOCTL 的資訊欄位必須包含此訊息的大小加上 sizeof (DWORD) (4 個字節) 。
- 如果 IOCTL 包含輸入緩衝區,驅動程式必須以STATUS_INVALID_PARAMETER完成 IOCTL。
- 如果收到的訊息具有長度為零的承載,驅動程序應該忽略該訊息。 這是效能優化,因為 Windows WILL 會捨棄長度為零的承載訊息。
- 如果收到的訊息太大而無法複製到此 IOCTL 的緩衝區,驅動程式必須將所需的緩衝區大小複製到輸出緩衝區的前 4 個字節,將 IOCTL 的 “Information” 字段設定為 sizeof (DWORD) (“4”) ,並使用 STATUS_BUFFER_OVERFLOW完成 IOCTL。 訊息緩衝區必須保留在「已接收」佇列中。
- 如果在訂用帳戶句柄中收到此 IOCTL,則第二個 (或更新版本) 必須完成STATUS_INVALID_DEVICE_STATE。
- 驅動程式必須支援手寫筆 IOCTL 的 CancelIo。
規格需求
需求 | 值 |
---|---|
最低支援的用戶端 | Windows 8 |
標頭 | nfpdev.h |