spbRequestCaptureIoOtherTransferList 函数 (spbcx.h)
SpbRequestCaptureIoOtherTransferList 方法检索自定义 IOCTL 请求的输入缓冲区中的SPB_TRANSFER_LIST结构。
语法
NTSTATUS SpbRequestCaptureIoOtherTransferList(
SPBREQUEST Request
);
参数
Request
自定义 IOCTL 请求的 SPBREQUEST 句柄。 SPB 控制器驱动程序以前通过其注册 的事件回调函数之一接收此句柄。
返回值
如果调用成功,SpbRequestCaptureIoOtherTransferList 将返回STATUS_SUCCESS。 可能的返回值包括以下错误代码。
返回值 | 说明 |
---|---|
|
SPBREQUEST 参数无效或请求中的SPB_TRANSFER_LIST结构格式不正确。 |
|
无法分配此操作所需的系统资源。 |
注解
必须在缓冲区地址有效的进程的上下文中调用此方法。 通常,SPB 控制器驱动程序从 EvtIoInCallerContext 事件回调函数调用此方法,驱动程序将其作为输入参数提供给 SpbControllerSetIoOtherCallback 方法。
SPB 控制器驱动程序可以调用此方法的最大 IRQL 取决于 I/O 请求的发起方是在用户模式还是在内核模式下运行。 如果请求源自用户模式,驱动程序必须在PASSIVE_LEVEL调用此方法。 如果请求源自内核模式,驱动程序必须在 IRQL <= DISPATCH_LEVEL 调用此方法。 驱动程序可以调用 WdfRequestGetRequestorMode 方法来确定发起者的模式。 但是,通常不需要此调用,因为驱动程序可以依赖 SPB 框架扩展 (SpbCx) 在相应的 IRQL 上调用驱动程序的 EvtIoInCallerContext 函数。
示例
下面的代码示例演示 SPB 控制器驱动程序的 EvtIoInCallerContext 事件回调函数如何使用 SpbRequestCaptureIoOtherTransferList 方法从自定义 IOCTL 请求获取 I/O 缓冲区或缓冲区。
VOID
EvtIoInCallerContext(
_In_ WDFDEVICE SpbController,
_In_ WDFREQUEST FxRequest
)
{
NTSTATUS status;
//
// NOTE: The driver should check for custom IOCTLs that this
// driver handles. If an IOCTL is not recognized, mark the
// request as STATUS_NOT_SUPPORTED, and complete the request.
//
status = SpbRequestCaptureIoOtherTransferList((SPBREQUEST)FxRequest);
//
// If the preceding call fails, the driver must complete the
// request instead of queueing the request.
//
if (!NT_SUCCESS(status))
{
goto exit;
}
status = WdfDeviceEnqueueRequest(SpbController, FxRequest);
if (!NT_SUCCESS(status))
{
goto exit;
}
exit:
if (!NT_SUCCESS(status))
{
WdfRequestComplete(FxRequest, status);
}
}
要求
要求 | 值 |
---|---|
最低受支持的客户端 | 从Windows 8开始可用。 |
目标平台 | 通用 |
标头 | spbcx.h |
Library | Spbcxstubs.lib |
IRQL | 请参阅“备注”。 |