WdfDeviceEnqueueRequest 函式 (wdfdevice.h)
[僅適用於 KMDF]
WdfDeviceEnqueueRequest 方法會將指定的 I/O 要求傳遞給架構,讓架構後續可以將要求新增至驅動程式為指定裝置建立的其中一個 I/O 佇列。
語法
NTSTATUS WdfDeviceEnqueueRequest(
[in] WDFDEVICE Device,
[in] WDFREQUEST Request
);
參數
[in] Device
架構裝置物件的句柄。
[in] Request
架構要求物件的句柄。
傳回值
如果作業成功,方法會傳回STATUS_SUCCESS。 其他傳回值包括:
傳回碼 | 描述 |
---|---|
|
可用的記憶體數量很低。 |
|
驅動程式尚未為裝置建立任何 I/O 佇列,而且驅動程式不是篩選驅動程式。 |
|
裝置的 I/O 佇列不接受要求。 |
方法可能會 傳回其他NTSTATUS 值。
如果驅動程式提供無效的物件句柄,就會發生錯誤檢查。
言論
您的驅動程式只能從 EvtIoInCallerContext 回呼函式呼叫 WdfDeviceEnqueueRequest。
WdfDeviceEnqueueRequest 方法會將要求新增至驅動程式的要求類型特定 I/O 佇列,如果驅動程式已建立一個。 否則,如果驅動程式已建立要求,則方法會將要求新增至裝置的預設佇列。
如果驅動程式尚未為裝置建立任何 I/O 佇列,WdfDeviceEnqueueRequest 會執行下列動作:
- 如果驅動程式是篩選驅動程式,WdfDeviceEnqueueRequest 將要求傳送至驅動程式的 I/O 目標。
- 如果驅動程式不是篩選驅動程式,WdfDeviceEnqueueRequest 會傳回STATUS_INVALID_DEVICE_REQUEST。
因此,如果驅動程式需要在呼叫 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(¶ms);
WdfRequestGetParameters(
Request,
¶ms
);
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) |