windows驱动开发第13课(R3与R0通信之读取数据)

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

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

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

具体实现步骤如下:

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

	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);

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

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函数里直接调用,这里为了不影响上一节课的写入功能,使用了一个开关,可以根据控制码分别处理读数据和写数据功能。代码如下:

	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):

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值