应用程序与驱动交互访问(缓冲模式)

数据交换原理

  A、用户层传入数据

  B、驱动层接收数据

  C、驱动层回传数据级用户层

 

 A、用户层传入数据EXE WriteFile,ReadFile

BOOL DeviceIoControl

(
HANDLE
hDevice,              // 设备句柄 调用CreateFile获取

  DWORD dwIoControlCode,       // 操作执行的 控制码,用来区分不同的操作 是一个CTL_CODE宏

  LPVOID lpInBuffer,              // 输入参数 指针
 

  DWORD nInBufferSize,           // 输入参数大小(单位 字节)

  LPVOID lpOutBuffer,            // 输出参数 指针
 

  DWORD nOutBufferSize,         // 输出参数大小指针(单位 字节)

  LPDWORD lpBytesReturned,      // 实际输出参数大小指针(单位 字节)

  LPOVERLAPPED lpOverlapped 

 //调用 CreateFile 时 FILE_FLAG_OVERLAPPED 标志打开时才有效,否则会被忽略,所以这里用NULL

);

B、CTL_CODE宏(用户层需要包含 winioctl.h头文件

http://msdn.microsoft.com/en-us/library/ms902086.aspx 这个地址CTL_CODE宏的详解介绍

CTL_CODE(DeviceType,Function,Method,Access);

//DeviceType  SYS中用IOCreateDevice 创建的设备类型

//Function     驱动程序中定义的IOCTL 取值范围 0x800-0xFFF 其它值为系统保留

//Method      访问方式 4 缓冲,直接,其它

//Access       访问权限,这个一般用:FILE_ANY_ACCESS 这个常量 表示有所有权限

示例:

#define add_code CTL_CODE(\

                     FILE_DEVICE_UNKNOWN, \ //DeviceType          

                     0x800, \                    // Function 0x800-0xfff 2048-4095

                     METHOD_BUFFERED, \      //Method

                     FILE_ANY_ACCESS)          //Acess

hDevice=CreatFile

DeviceIoControl使用示例:exe

DWORD add(HANDLE hDevice,int a,int b)

{

    int bufret;

    int port[2];

       port[0]=a;

       port[1]=b;

       DeviceIoControl(hDevice, add_code , &port, 8, &bufret, 4, &dwWrite, NULL);

       return bufret;

}

 

B、驱动层接收数据

 当用户层调用了DeviceIoControl时就会产生一个IRP_MJ_DEVICE_CONTROL 事件传送到相应的驱动设备

//所以在驱动部分 必须先注册一个 IRP_MJ_DEVICE_CONTROL IRP处理函数

pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = myDriver_DeviceIOControl;

//在这个回调函数里 可以通过 pIrp来获取 用户层EXE 传进来的参数

NTSTATUS myDriver_DeviceIOControl(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)

{

NTSTATUS status = STATUS_SUCCESS;

 //pIrp得到输入缓冲区指针

 //pIrp得到输出缓冲区大小

 //得到IOCTL

 //取得传入参数

 //处理相送数据

 //回传数据 SSDT hook

 // C、驱动层回传数据给用户层

 //完成IRP处理

 //结束IRP请求

return status;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小蚂蚁_CrkRes

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值