WDM ioctl 缓冲区读写

1 METHOD_BUFFERED
Buffered IO中IO管理器会分配一块堆内存然后把用户态缓冲区数据copy进来再传给驱动程序,而输出时IO管理器会把堆内存中的数据copy回用户态缓冲区。
ULONG inputSize = I.IoctlInputBufferSize();
PVOID inputBuffer = I.IoctlBuffer();

ULONG outputSize = I.IoctlOutputBufferSize();
PVOID outputBuffer = I.IoctlBuffer();
 
一定要牢记:驱动读写的是同一块内存,在写操作前务必已经读取了所需数据。


2 METHOD_IN_DIRECT/METHOD_OUT_DIRECT
Direct IO方式中IO管理器分将用户态缓冲区映射到核心态(地址不一样,但其实是一块内存),并锁定内存不要分页机制将内存交换到外存中.然后IO管理器将缓冲 区在核心态的的地址传给驱动程序。
ULONG inputSize = I.IoctlInputBufferSize();
PUCHAR inputBuffer = (PUCHAR) I.IoctlBuffer();

KMemory Mem(I.Mdl());
ULONG outputSize = I.WriteSize();
PUCHAR outputBuffer = (PUCHAR) Mem.MapToSystemSpace();


3 METHOD_NEITHER
在Neither IO,IO管理器直接把用户态的缓冲区地址和大小传给驱动,不做任何处理。
ULONG inputSize = I.IoctlInputBufferSize();
PVOID inputBuffer = I.IoctlType3InputBuffer();

ULONG outputSize = I.IoctlOutputBufferSize();
PVOID outputBuffer = I.UserBuffer();
 
 
Method
Input Buffer Parameter
Output Buffer Parameter
METHOD_BUFFERED
KIrp::IoctlBuffer
KIrp::IoctlBuffer
METHOD_IN_DIRECT
KIrp::IoctlBuffer
KIrp::Mdl
METHOD_OUT_DIRECT
KIrp::IoctlBuffer
KIrp::Mdl
METHOD_NEITHER
KIrp::IoctlType3InputBuffer
KIrp::UserBuffer

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值