IRP里的用户缓冲区有:METHOD_BUFFERED、METHOD_DIRECT、METHOD_NEITHER三类。
对于METHOD_BUFFERED和METHOD_DIRECT两种缓冲类型的IO请求,使用下面的方法获取对应的内存指针。
获取输入缓冲区对应的内存对象:
_Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)
NTSTATUS
FORCEINLINE
WdfRequestRetrieveInputMemory(
_In_
WDFREQUEST Request,
_Out_
WDFMEMORY* Memory
)
{
return ((PFN_WDFREQUESTRETRIEVEINPUTMEMORY) WdfFunctions[WdfRequestRetrieveInputMemoryTableIndex])(WdfDriverGlobals, Request, Memory);
}
获取输出缓冲区对应的对象:
_Must_inspect_result_
_IRQL_requires_max_(DISPATCH_LEVEL)
NTSTATUS
FORCEINLINE
WdfRequestRetrieveOutputMemory(
_In_
WDFREQUEST Request,
_Out_
WDFMEMORY* Memory