如何设置IRP中的功能码?

来源:互联网 发布:知乎算命准推荐 编辑:程序博客网 时间:2024/05/17 23:17

    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方式

传入I/O栈的参数结构体:image

WriteFile方式

传入I/O栈的参数结构体:

image

原创粉丝点击