我有一个 Windows VM 驱动程序,它允许用户空间应用程序通过 IOCTL 进行通信。我需要向主机公开一个结构(使用 virtio),并且在using函数virtqueue_add_buf
中初始化 virt 设备后尝试使用。调用时出现致命错误。EvtDevicePrepareHardware
VirtIODeviceInitialize
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 无法加载符号和崩溃使我的调试会话无用。有什么想法可以调试这个或我可能缺少什么吗?