我是靠谱客的博主 潇洒早晨,这篇文章主要介绍windows驱动开发第13课(R3与R0通信之读取数据),现在分享给大家,希望可以做个参考。

在上一节课(R3与R0通信之写入数据)里,我们知道和IRP有关的系统缓冲区(pirp->Associatedlrp.SystemBuffer)是一个读写共享的缓冲区。这节课我们通过这个缓冲区来从驱动层读取数据。

知识点:和IRP有关的系统缓冲区
pirp->AssociatedIrp.SystemBuffer; //和IRP有关的系统缓冲区

要点:这个缓冲区读和写是共享的。

具体实现步骤如下:

第一步:在用户层(MFC工程项目里)选“资源视图”,在对话框里双击“读数据”按钮,在里面添加如下代码:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DWORD dwRetSize = 0;//返回字节数 char ReData[512] = {0};//返回数据 //数组示例 DWORD WriteInBuffer; //DWORD OutBuf[512] = { 0 };//输出缓冲区 DeviceIoControl( DeviceHandle,//CreateFile打开驱动设备 返回的句柄 ReadTest,//控制码 CTL_CODE &WriteInBuffer,//输入缓冲区指针 4,//输入缓冲区大小 ReData,//返回缓冲区 sizeof(ReData),//返回缓冲区大小 &dwRetSize, //返回字节数 NULL); OutputDebugStringA(ReData);

第二步:在驱动层写相应的操作代码,这里我们可以把读取数据的代码单独写到一个函数里,代码如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
void IRP_IO_READ_TEST(PIRP pirp) { //读数据 KdPrint(("zdsoft:IRP_IO_READ_TEST Line=%d", __LINE__)); char* IrpSysBuffer = (char*)pirp->AssociatedIrp.SystemBuffer; //和IRP有关的系统缓冲区 PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(pirp);//获取应用层传来的参数 //向缓冲区写入 char DataFromR0[] = "zdsoft:sys来自驱动层R0的数据"; memcpy_s(IrpSysBuffer, sizeof(DataFromR0), DataFromR0, sizeof(DataFromR0)); pirp->IoStatus.Status = STATUS_SUCCESS; pirp->IoStatus.Information = sizeof(DataFromR0);//返回给DeviceIoControl中的倒数第二个参数 lpBytesReturned IoCompleteRequest(pirp, IO_NO_INCREMENT);//调用方已完成所有I/O请求处理操作,并且不增加优先 级 KdPrint(("zdsoft:离开派遣函数")); }

 然后在 IRP_CALL函数里直接调用,这里为了不影响上一节课的写入功能,使用了一个开关,可以根据控制码分别处理读数据和写数据功能。代码如下:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
switch (irpStackL->MajorFunction) { case IRP_MJ_DEVICE_CONTROL://DeviceIoControl { UINT32 CtlCode = irpStackL->Parameters.DeviceIoControl.IoControlCode; if (CtlCode==ReadTest) { IRP_IO_READ_TEST(pirp); return STATUS_SUCCESS; } else if (CtlCode==WriteTest) { char* IrpSysBuffer = (char*)pirp->AssociatedIrp.SystemBuffer; //和IRP有关的 系统缓冲区 KdPrint(("zdsoft:用户层调用了DeviceIoControl R0控制码=%X", CtlCode)); KdPrint(("zdsoft:和IRP有关的系统缓冲区=%s", IrpSysBuffer)); } else if (CtlCode==ReadWriteTest) { } break; }

 重点:一定要注意 pirp->IoStatus.Information = sizeof(DataFromR0);这个是返回的长度,一定要大于等于IRP系统缓冲区数据的长度。

最后编译生成(驱动层生成Debug版,用户层生成Release版),再把生成后的文件复制到虚拟机里,打开相应的调试工具,测试效果如下图(图1):

最后

以上就是潇洒早晨最近收集整理的关于windows驱动开发第13课(R3与R0通信之读取数据)的全部内容,更多相关windows驱动开发第13课(R3与R0通信之读取数据)内容请搜索靠谱客的其他文章。

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

评论列表共有 0 条评论

立即
投稿
返回
顶部