我有一个Windows VM的驱动程序,允许用户空间应用程序通过IOCTL进行通信。我需要将结构展示给主机(使用virtio),并且在使用VirtIODeviceInitialize
函数初始化EvtDevicePrepareHardware
中的virt设备后,我尝试使用virtqueue_add_buf
。拨打virtqueue_add_buf
时出现致命错误。windows kdmf驱动程序virtio调用virtqueue_add_buf导致系统致命错误
下面的代码
int TellHost(WDFOBJECT WdfDevice, VirtioQArg *virtioArg)
{
VIO_SG sg;
PDEVICE_CONTEXT context = GetDeviceContext(WdfDevice);
sg.physAddr = MmGetPhysicalAddress(virtioArg);
sg.length = sizeof(VirtioQCArg);
WdfSpinLockAcquire(context->VirtQueueLock);
error = virtqueue_add_buf(context->VirtQueue, &sg, 1, 0, virtioArg, NULL, 0);
// more code ....
WdfSpinLockRelease(context->VirtQueueLock);
}
片断我得到的错误是致命系统错误:0X000000D1(0x0000000000000014,0x0000000000000002,0x0000000000000000,0xFFFFF80109FC0637)
中断指令例外 - 代码80000003(第一次机会)
然后windbg无法加载符号和崩溃使我的调试会话无用。任何想法如何我可以调试这个或我可能会失踪?
windbg版本10.0.10586.567,windows 8.1 x64 – Luis