共用方式為


WdfDeviceEnqueueRequest 函式 (wdfdevice.h)

[僅適用於 KMDF]

WdfDeviceEnqueueRequest 方法會將指定的 I/O 要求傳遞給架構,讓架構後續可以將要求新增至驅動程式為指定裝置建立的其中一個 I/O 佇列。

語法

NTSTATUS WdfDeviceEnqueueRequest(
  [in] WDFDEVICE  Device,
  [in] WDFREQUEST Request
);

參數

[in] Device

架構裝置物件的句柄。

[in] Request

架構要求物件的句柄。

傳回值

如果作業成功,方法會傳回STATUS_SUCCESS。 其他傳回值包括:

傳回碼 描述
STATUS_INSUFFICIENT_RESOURCES
可用的記憶體數量很低。
STATUS_INVALID_DEVICE_REQUEST
驅動程式尚未為裝置建立任何 I/O 佇列,而且驅動程式不是篩選驅動程式。
STATUS_WDF_BUSY
裝置的 I/O 佇列不接受要求。
 

方法可能會 傳回其他NTSTATUS 值。

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

言論

您的驅動程式只能從 EvtIoInCallerContext 回呼函式呼叫 WdfDeviceEnqueueRequest

WdfDeviceEnqueueRequest 方法會將要求新增至驅動程式的要求類型特定 I/O 佇列,如果驅動程式已建立一個。 否則,如果驅動程式已建立要求,則方法會將要求新增至裝置的預設佇列。

如果驅動程式尚未為裝置建立任何 I/O 佇列,WdfDeviceEnqueueRequest 會執行下列動作:

  • 如果驅動程式是篩選驅動程式,WdfDeviceEnqueueRequest 將要求傳送至驅動程式的 I/O 目標。
  • 如果驅動程式不是篩選驅動程式,WdfDeviceEnqueueRequest 會傳回STATUS_INVALID_DEVICE_REQUEST。
雖然 WdfDeviceEnqueueRequest 正在執行,但驅動程式可以接收並完成或取消要求。

因此,如果驅動程式需要在呼叫 WdfDeviceEnqueueRequest之後使用要求或其內容,則在呼叫 WdfDeviceEnqueueRequest 之前,它應該先對要求取得參考,再呼叫 WdfDeviceEnqueueRequest

若要這樣做,驅動程式可以在呼叫 WdfDeviceEnqueueRequeueRequest之後,先呼叫 WdfObjectReference,然後 WdfObjectDereference 。 驅動程式必須先取值要求,才能結束 EvtIoInCallerContext

如需 WdfDeviceEnqueueRequest 方法的詳細資訊,請參閱 管理 I/O 佇列

針對 KMDF 1.0 和 1.5 版,WdfDeviceEnqueueRequest 必須在 PASSIVE_LEVEL 呼叫。 針對 1.7 版和更新版本,WdfDeviceEnqueueRequest 可以在 IRQL <= DISPATCH_LEVEL呼叫。

例子

下列程式代碼範例是 EvtIoInCallerContext 回呼函式,其會尋找包含自定義 I/O 控件程式代碼的要求,IOCTL_NONPNP_METHOD_NEITHER。 如果找不到 I/O 控制件程式代碼,回呼函式只會將要求傳回至架構。 如果回調函式找到 I/O 控件程式代碼,它會前置處理要求,然後將它傳回架構。 如果發生錯誤,回呼函式會完成要求。

VOID
MyEvtDeviceIoInCallerContext(
    IN WDFDEVICE  Device,
    IN WDFREQUEST Request
    )
{
    NTSTATUS  status = STATUS_SUCCESS;
    WDF_REQUEST_PARAMETERS  params;

    WDF_REQUEST_PARAMETERS_INIT(&params);
    WdfRequestGetParameters(
                            Request,
                            &params
                            );
    if(!(params.Type == WdfRequestTypeDeviceControl &&
         params.Parameters.DeviceIoControl.IoControlCode == IOCTL_NONPNP_METHOD_NEITHER)) {
        status = WdfDeviceEnqueueRequest(
                                         Device,
                                         Request
                                         );
        if(!NT_SUCCESS(status)) {
            goto End;
        }
        return;
    }
    //
    // Found a match for the control code. Preprocess the request, and then
    // return the request to the framework.
    //

    //...(Preprocess the request here.)

    status = WdfDeviceEnqueueRequest(
                                     Device,
                                     Request
                                     );
    if(!NT_SUCCESS(status)) {
        goto End;
    }
    return;
End:
    WdfRequestComplete(
                       Request,
                       status
                       );
    return;
}

要求

要求 價值
目標平臺 普遍
最低 KMDF 版本 1.0
標頭 wdfdevice.h (包括 Wdf.h)
連結庫 Wdf01000.sys (請參閱架構連結庫版本控制。)
IRQL <= DISPATCH_LEVEL (請參閱一節)
DDI 合規性規則 DeferredRequestCompleted(kmdf)DriverCreate(kmdf)KmdfIrql(kmdf)KmdfIrql2(kmdf),KmdfIrqlExplicit(kmdf),RequestCompleted(kmdf)RequestCompletedLocal(kmdf)

另請參閱

WDF_REQUEST_PARAMETERS_INIT

WdfRequestComplete

WdfRequestGetParameters