概述
在上一节课我们证实了在用户层调用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通信交换数据第二节)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复