最近学习使用IoBuildAsynchronousFsdRequest创建读写IRP进行驱动间通讯的方式,在使用IoBuildAsynchronousFsdRequest成功创建读IRP后进行安装,安装时出现蓝屏,蓝屏提示错误0x000000BE:Write Read-Only Memory。
进过研究分析,发现
IoBuildAsynchronousFsdRequest创建读IRP时我传入的输入缓冲区为局部变量缓冲区地址,而在IRP的完成例程中使用了此地址,局部变量的有效性只限于当前函数,所以非法使用导致出现蓝屏。所以在使用
IoBuildAsynchronousFsdRequest创建读写IRP时,如果在其它函数中需要使用到输入输出缓冲区时,应该传入全局的缓冲区地址。
下面是一个例子:
char g_szbuffer[4096] = "";
//用来处理等待请求
void CompleteWait(WDFQUEUE Queue)
{
NTSTATUS status = STATUS_SUCCESS;
IO_STATUS_BLOCK IoStatus;
WDFREQUEST WaitRequest = NULL;
int nRes = 1;
HANDLE hReadEvent;
PKEVENT pEvent;
PDEVICE_CONTEXT pDeviceContext;
PIRP irp;
//char szBuf[4096] = "";
LARGE_INTEGER StartingOffset = { 0 };
PDEVICE_OBJECT pUsbDeviceObject = NULL;
LARGE_INTEGER StartingOffset = { 0 };
PDEVICE_OBJECT pUsbDeviceObject = NULL;