I/O栈的结构体定义大概有440几行,定义了很多很多参数,让人应接不暇。我演示我们实际使用中需要使用的几个参数。
ⅠDeviceIoControl方式
传入I/O栈的参数结构体,详见IO_STACK_LOCATION结构体
struct {
ULONG OutputBufferLength;
ULONG POINTER_ALIGNMENT InputBufferLength;
ULONG POINTER_ALIGNMENT IoControlCode; //这个就是DeviceIoControl函数传入的功能码存储的地方。
PVOID Type3InputBuffer;
} DeviceIoControl;
①首先是从应用程序那么发出功能码,
DeviceIoControl(Handle, // 设备句柄
Code, // 32bit的自定义的功能码
InputData, InputLength, // 输入数据缓冲区地址、长度
OutputData, OutputLength, // 输出数据缓冲区地址、长度
&Feedback, // 反馈数据
&Overlapped);
②驱动程序中接收功能码:
获取当前IO栈:stack = IoGetCurrentIrpStackLocation(irp);
得到功能码: Fun_code = stack->Parameters.DeviceIoControl.IoControlCode;
③使用switch函数来分发处理不同的功能码
Ⅱ ReadFile方式
Ⅲ WriteFile方式
传入I/O栈的参数结构体: