共用方式為


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 要求使用 [傳送和忘記] 選項 。 因此,請注意,在架構刪除重新佇列的要求物件時,它可能已經移除原本收到要求物件的子裝置。 因此,驅動程式不得使用重新佇列要求物件的 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