我是靠谱客的博主 老实抽屉,最近开发中收集的这篇文章主要介绍Windows驱动开发第11课(R3与R0通信交换数据第二节),觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

在上一节课我们证实了在用户层调用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写测试控制码=%Xn", WriteTest);
OutputDebugStringA(BufferTest);

驱动层添加如下代码:

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

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

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

最后

以上就是老实抽屉为你收集整理的Windows驱动开发第11课(R3与R0通信交换数据第二节)的全部内容,希望文章能够帮你解决Windows驱动开发第11课(R3与R0通信交换数据第二节)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(38)

评论列表共有 0 条评论

立即
投稿
返回
顶部