Windows驱动开发第11课(R3与R0通信交换数据第二节)

2023-11-17

在上一节课我们证实了在用户层调用CreateFile函数时,相应的在驱动层会响应一个IRP_MJ_CREATE的事件。

这节课我们来看看用户层和驱动层是怎么交换数据的。
首先来介绍一下控制码,由CTL_CODE宏创建,是一个唯一的32位系统I/O控制代码,这个控制代码包括4部分组成:
DeviceType(设备类型,高16位(16-31位)),
Function(功能 2-13位),
Method(I/O传递的方式),有4种(METHOD_BUFFERED,METHOD_IN_DIRECT,METHOD_OUT_DIRECT,METHOD_NEITHER)
Access(访问限制,14-15位)。

控制码代码如下:

#define WriteTest CTL_CODE(FILE_DEVICE_UNKNOWN,0x300,METHOD_BUFFERED,FILE_ANY_ACCESS) //写测试
#define ReadTest CTL_CODE(FILE_DEVICE_UNKNOWN,0x301,METHOD_BUFFERED,FILE_ANY_ACCESS) //读测试
#define ReadWriteTest CTL_CODE(FILE_DEVICE_UNKNOWN,0x302,METHOD_BUFFERED,FILE_ANY_ACCESS) //读写测试

第一个参数,这里还是使用了未知的设备类型。第二个参数,是功能码,最大不能超过4095,为了能够区分读和写的控制码,我们可以通过修改这个功能码,使之不同就可以了。第三个参数,传递的方式,这里使用了第1种方式缓冲区传递。第四个参数,是访问权限,这里选全部所有的权限。

在对话框添加2个按钮“读数据”,“写数据”如下图(图1):

 双击“写数据”按钮把下面代码添加进去:

	DWORD dwRetSize=0;//返回字节数
	char WriteData[]="DeviceIoControl 写测试\n";
	//结构
	TINPUT_BUF inBuf = { 1,2,3,4,5,0x6ABC666 };
	//数组示例
	DWORD OutBuf[6] = { 0 };//输出缓冲区
	DeviceIoControl(
		DeviceHandle,//CreateFile打开驱动设备 返回的句柄
		WriteData,//控制码 CTL_CODE
		WriteData,//输入缓冲区指针
		sizeof(WriteData),//输入缓冲区大小
		&OutBuf,//返回缓冲区
		sizeof(OutBuf),//返回缓冲区大小
		&dwRetSize, //返回字节数
		NULL);

	//打印返回参数
	CString csStr;
	csStr.Format(L"zdsoft:R3 接收驱动层返回的参数(%x,%x,%x,%x,%x,%x  dwRetSize=%d", OutBuf[0], 

OutBuf[1], OutBuf[2], OutBuf[3], OutBuf[4], OutBuf[5], dwRetSize);
	OutputDebugStringW(csStr);

 我们这里用的是DeviceIoControl进行的写入,所以还要在驱动的入口函数里注册IRP_MJ_DEVICE_CONTROL事件,代码如下:

DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IRP_CALL;

这样数据虽然传入了,驱动层要想正确的接收到数据,还要在驱动层有对应的控制码才行,那么把上面用户层定义控制码的代码复制到驱动层。

然后在驱动层取控制码,代码如下:

UINT32 CtlCode=irpStackL->Parameters.DeviceIoControl.IoControlCode;

我们把驱动层和用户层的控制码打印出来看看是否一致,
用户层添加如下代码:

char BufferTest[256];
sprintf_s(BufferTest, "zdsoft:R3写测试控制码=%X\n", WriteTest);
OutputDebugStringA(BufferTest);

驱动层添加如下代码:

KdPrint(("zdsoft:用户层调用了DeviceIoControl R0控制码=%X",CtlCode));

最后把生成好的文件复制到虚拟机里,测试效果如下图(图2):

 好了,今天的这节课就到这里,希望看到此文章的朋友给个关注,谢谢!有不懂的可以留言,一般24小时内回复。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Windows驱动开发第11课(R3与R0通信交换数据第二节) 的相关文章

随机推荐

  • 13-FreeRTOS任务创建与删除

    任务创建和删除API函数位于文件task c中 需要包含task h头文件 task h里面包函数任务的类型函数 例如 对xTaskCreate的调用 通过指针方式 返回一个TaskHandle t 变量 然后可将该变量用vTaskDele
  • 模板的特化和萃取

    之前对模板化编程进行了总结 详见https blog csdn net timecur article details 89949643 这篇将介绍模板的重要概念 模板特化 模板的特化 模板针对某些具体的类型不能处理或者处理结果有误 就需要
  • vue项目开发流程

    1 创建项目 1 首先创建项目 我用的项目是vue 3 0 可以在新建文件夹中cmd 进入命令符 vue create 项目名 创建项目也可以在 命令符中vue ui 在浏览器中创建项目 2 项目安装好后 安装自己需要的各种插件 3 我们常
  • 【C语言技巧】STM32实现 printf 打印语句

    包含头文件 include
  • 计算机英语 st,1st、2nd、3rd、…10th都是什么的缩写?怎么读?10th之...-1st-英语-司俜辰同学...

    概述 本道作业题是司俜辰同学的课后练习 分享的知识点是1st 指导老师为任老师 涉及到的知识点涵盖 1st 2nd 3rd 10th都是什么的缩写 怎么读 10th之 1st 英语 下面是司俜辰作业题的详细 题目 1st 2nd 3rd 1
  • mysql的高级查询实例_MySQL高级查询---连接查询实例

    MySQL高级查询 连接查询实例 使用sql查询很简单 很基础的SQLECT语句查询 如果想从多个表查询比较复杂的信息 就会使用高级查询实现 常见的高级查询包括多连接查询 外连接查询与组合查询等 今天我先学习最常用的连接查询 我先以一张pe
  • 编译qt5.9-arm-qmake

    一 arm gcc环境配置 tar xvf rock3288 kernel arm linux gcc C opt vim basgrc 在最后面添加 export PATH opt gcc linaro arm linux gnueabi
  • Android EditText文本改变监听和获取到焦点的监听

    开发app快两年了 总结了一些小知识 以前没时间发表 最近有时间了 和大家分享一下 别忘记初始化 EditText edtUserName 添加文本改变的监听 edtUserName addTextChangedListener new T
  • VSCode离线汉化教程

    VSCode汉化包下载路径 https marketplace visualstudio com items itemName MS CEINTL vscode language pack zh hans 选择 Version Histor
  • 代码丢了不要怕,有jar包就能反编译找回

    推荐一个好用的反编译工具 直接上下载地址 http jd benow ca 根据自己的电脑下载版本 我下载的是windows版本 压缩包解压运行 打开jar包找到你的代码 注意 如果jar包也没有的就想想该重写了
  • C++类和对象:补充拷贝构造

    前言 如果一个类中什么成员都没有 简称为空类 空类中什么都没有吗 并不是的 任何一个类在我们不写的情况下 都会自动生成下面6个默认成员函数 目录 一 六大函数 1 构造函数 1 定义 2 特性 3 赋值 4 初始化列表 2 拷贝构造函数 3
  • Linux基础命令大全(下)

    作者 小刘在C站 个人主页 小刘主页 每天分享云计算网络运维课堂笔记 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 夕阳下 是最美的绽放 树高千尺 落叶归根人生不易 人间真情 目录 前言 编辑 一 命令到末行模式
  • 今日头条 文章采集_如何利用文章在今日头条引流精准粉

    今日头条这个平台 基本上从事互联网项目的人应该都知道 平台流量本身是非常庞大的 采用大数据算法推荐机制 自动采集判断用户的喜好 并且推荐的量也是非常可观的 对于那些知名作者而言 一篇文章即可拥有几十万甚至数百万的阅读量 这么大的一个流量池摆
  • Java调用Win API

    官方网站 http jawinproject sourceforge net 把lib文件夹下的jawin jar和jawin stubs jar放到 JAVA HOME jre lib ext 目录下 把bin文件夹下的jawin dll
  • 永磁同步电机矢量控制到无速度传感器控制学习教程(PMSM)(一)

    一个阶段的学习结束了 整理了之前的过程中的学习成果 已经过了工作的年纪 在这里稍微出一下自己做的一套永磁同步电机的教程 从基础的矢量控制 到应用性较强的MTPA 弱磁控制等 最后深入到无速度传感器的控制 搜集了三种无速度的方法 足够大家从基
  • html/css笔记 table表格文本垂直水平居中对齐方法

    简介 平时工作中开发经常会遇到html网页样式设计 这里记录一下笔记方便后期查看 也顺便给其他人提供一个参考 HTML 文本垂直水平居中对齐方法 一 css样式 水平居中 text align 应用于块级元素的文本水平居中 text ali
  • React 中ref的几种用法

    React 中ref的几种用法 1 字符串 通过 this refs a 来引用真实dom的节点 dom 节点上使用
  • 结构光相机国产、非国产统计参数对比分析

    结构光相机国产 非国产统计参数对比分析 1 Kinect v1 Kinect v1深度相机拥有一个RGB彩色摄像头 一个红外线CMOS摄像机和一个红外发射器 相机的红外线CMOS摄像机和红外发射器以左右水平的方式分布 该相机采用的是以结构光
  • Unix环境下Oracle数据库完全优化详解

    Unix环境下Oracle数据库完全优化详解 2007 04 19 12 54 02 作者 changelive 浏览次数 14 文字大小 大 中 小 进入论坛 如今的优化己经向优化等待 waits 转型了 实际中性能优化最根本的出现点也都
  • Windows驱动开发第11课(R3与R0通信交换数据第二节)

    在上一节课我们证实了在用户层调用CreateFile函数时 相应的在驱动层会响应一个IRP MJ CREATE的事件 这节课我们来看看用户层和驱动层是怎么交换数据的 首先来介绍一下控制码 由CTL CODE宏创建 是一个唯一的32位系统I