WdfRequestForwardToParentDeviceIoQueue 函式 (wdfrequest.h)

[僅適用於 KMDF]

WdfRequestForwardToParentDeviceIoQueue 方法會將來自子裝置 I/O 佇列的 I/O 要求重新佇列至子裝置父裝置的指定 I/O 佇列。

語法

NTSTATUS WdfRequestForwardToParentDeviceIoQueue(
  [in] WDFREQUEST                   Request,
  [in] WDFQUEUE                     ParentDeviceQueue,
  [in] PWDF_REQUEST_FORWARD_OPTIONS ForwardOptions
);

參數

[in] Request

架構要求物件的句柄。

[in] ParentDeviceQueue

架構佇列物件的句柄。

[in] ForwardOptions

呼叫端配置的 WDF_REQUEST_FORWARD_OPTIONS 結構的指標。

傳回值

WdfRequestForwardToParentDeviceIoQueue 會在作業成功時傳回STATUS_SUCCESS。 否則,此方法可能會傳回下列其中一個值:

傳回碼 Description
STATUS_INFO_LENGTH_MISMATCH
提供WDF_REQUEST_FORWARD_OPTIONS結構的大小無效。
STATUS_INVALID_PARAMETER
所提供WDF_REQUEST_FORWARD_OPTIONS結構的成員包含無效的值。
STATUS_INVALID_DEVICE_REQUEST
如果發生下列其中一項,就會傳回此值:
  • 驅動程式未從 I/O 佇列取得 I/O 要求。
  • 來源和目的地 I/O 佇列相同。
  • 指定的 I/O 佇列不屬於父裝置。
  • 驅動程式已啟用 向前進度, 並保留指定的 I/O 要求以供低記憶體使用。
  • 驅動程式未呼叫 WdfPdoInitAllowForwardingRequestToParent
STATUS_WDF_BUSY
指定的 I/O 佇列不接受新的要求。
 

這個方法也可能傳回其他 NTSTATUS值

如果驅動程式提供無效的物件句柄,就會發生錯誤檢查。

備註

在驅動程式可以呼叫 WdfRequestForwardToParentDeviceIoQueue 之前,它必須呼叫 WdfPdoInitAllowForwardingRequestToParent

驅動程式必須使用相同的 方法來存取數據緩衝區 , (緩衝處理、直接或兩者都不能同時) 父裝置和子裝置。

如果您的驅動程式會呼叫 WdfRequestForwardToParentDeviceIoQueue 來重新佇列 I/O 要求,驅動程式不得使用要求物件做為其他架構物件的父代,例如定時器物件或工作項目物件。

如果您的驅動程式已呼叫 WdfDeviceInitSetRequestAttributes 來指定裝置要求對象的內容空間,則架構不會新增此內容空間來要求驅動程式在子裝置佇列中接收的物件。 驅動程式可以呼叫 WdfObjectAllocateContext ,在驅動程式呼叫 WdfRequestForwardToParentDeviceIoQueue 之前,將內容空間新增至要求物件。 另一方面,如果驅動程式呼叫 WdfDeviceInitSetRequestAttributes 裝置要求物件,而且父裝置的要求物件使用等於或小於子裝置內容空間的內容空間,則驅動程式可以使用要求對象的內容空間,而不需呼叫 WdfObjectAllocateContext

驅動程式目前必須針對所有重新佇列的 I/O 要求使用 send and forget 選項 。 因此,請注意,在架構刪除重新佇列的要求物件時,它可能已經移除原本接收要求對象的子裝置。 因此,驅動程式不得使用重新佇列要求物件的 EvtCleanupCallbackEvtDestroyCallback 函式來存取子裝置資源,因為可能會在 EvtCleanupCallbackEvtDestroyCallback 函式執行之前移除資源。

如需 WdfRequestForwardToParentDeviceIoQueue 的詳細資訊,請參閱 重新佇列 I/O 要求

範例

下列程式代碼範例會先判斷收到 I/O 要求的裝置的父裝置,然後將 I/O 要求重新佇列至父裝置的預設 I/O 佇列。

WDFDEVICE device, parentDevice;
WDF_REQUEST_FORWARD_OPTIONS forwardOptions;
NTSTATUS status;

device = WdfIoQueueGetDevice(WdfRequestGetIoQueue(Request));
parentDevice = WdfPdoGetParent(device);

WDF_REQUEST_FORWARD_OPTIONS_INIT(&forwardOptions);
status = WdfRequestForwardToParentDeviceIoQueue(
             Request,
             WdfDeviceGetDefaultQueue(parentDevice),
             &forwardOptions
             );
if (!NT_SUCCESS(status)) {
    WdfRequestComplete(
                       Request,
                       status
                       );
  }

規格需求

需求
目標平台 Universal
最小 KMDF 版本 1.9
標頭 wdfrequest.h (包含 Wdf.h)
程式庫 Wdf01000.sys (請參閱 Framework Library Versioning.)
IRQL <=DISPATCH_LEVEL
DDI 合規性規則 DriverCreate (kmdf)

另請參閱

WdfPdoInitAllowForwardingRequestToParent