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写测试控制码=%X\n", WriteTest);
OutputDebugStringA(BufferTest);

驱动层添加如下代码:

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

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

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

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值