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