内核写入:R3写入R0时蓝屏的问题解决

 R0代码如下:

NTSTATUS MyWrite(PDEVICE_OBJECT pdevice, PIRP pirp) {
	NTSTATUS status = STATUS_SUCCESS;
	DbgPrintEx(77, 0, "My device write");
	PIO_STACK_LOCATION pstack = IoGetCurrentIrpStackLocation(pirp);
	ULONG writesize = 0;
	writesize = pstack->Parameters.Write.Length;
	PCHAR writebuffer = pirp->AssociatedIrp.SystemBuffer;
	RtlZeroMemory(pdevice->DeviceExtension, 200);
	RtlCopyMemory(pdevice->DeviceExtension,writebuffer,writesize);
	DbgPrintEx(77,0,"--%p--%s\n", writebuffer, (PCHAR)pdevice->DeviceExtension);
	pirp->IoStatus.Status = status;
	pirp->IoStatus.Information = writesize;
	IoCompleteRequest(pirp, IO_NO_INCREMENT);
	return STATUS_SUCCESS;	

}

 驱动运行时蓝屏。调试后发现是如下两行代码导致蓝屏

RtlZeroMemory(pdevice->DeviceExtension, 200);
RtlCopyMemory(pdevice->DeviceExtension,writebuffer,writesize);

推测可能是PDEVICE_OBJECT中的DeviceExtension内存区域不足以容纳writesize的字节数据,导致了访问违规。而DeviceExtensionSize在IoCreateDevice时定义,于是转到DriverEntry查看代码是否有问题。

status = IoCreateDevice(driver, 0, &deviceName, FILE_DEVICE_UNKNOWN, 0, TRUE, &pdevice);

IoCreateDevice的第二个参数指定了DeviceExtensionSize,这里设置成了0,所以导致违规访问。将之改成300(任意大于max{200,writesize}的数即可)。

修改之后蓝屏问题解决,R3的字符串成功在驱动中打印出来。

这里顺便贴出R3代码:

DWORD bread = 0;
WriteFile(hdevice, "This Message come from R3.", strlen("This Message come from R3."), &bread, NULL);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值