1 METHOD_BUFFERED
Buffered IO中IO管理器会分配一块堆内存然后把用户态缓冲区数据copy进来再传给驱动程序,而输出时IO管理器会把堆内存中的数据copy回用户态缓冲区。
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管理器将缓冲 区在核心态的的地址传给驱动程序。
2 METHOD_IN_DIRECT/METHOD_OUT_DIRECT
Direct IO方式中IO管理器分将用户态缓冲区映射到核心态(地址不一样,但其实是一块内存),并锁定内存不要分页机制将内存交换到外存中.然后IO管理器将缓冲 区在核心态的的地址传给驱动程序。
ULONG inputSize = I.IoctlInputBufferSize();
PUCHAR inputBuffer = (PUCHAR) I.IoctlBuffer();
KMemory Mem(I.Mdl());
KMemory Mem(I.Mdl());
ULONG outputSize = I.WriteSize();
PUCHAR outputBuffer = (PUCHAR) Mem.MapToSystemSpace();
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
|