问题遇到的现象和发生背景
之前有人咨询过的一个问题,在IOCallDriver中蓝屏了,看了一下回答说是把event附加到deviceExtension中,我试过TopOfDeivceStack->DeviceExtension=&event直接蓝屏了,想问一下具体是怎么把event放到DeviceExtension里呢?
用代码块功能插入代码,请勿粘贴截图
NTSTATUS
MakeSynchronousIoctl(
IN PDEVICE_OBJECT TopOfDeivceStack,
IN ULONG IoctlControlCode,
PVOID InputBuffer,
ULONG InputBufferLength,
PVOID OutputBuffer,
ULONG OutputBufferLength)
{
KEVENT event;
PIRP irp;
IO_STATUS_BLOCK ioStatus;
NTSTATUS status;
//创建设备控制IRP给其它驱动
//初始化同步事件
KeInitializeEvent(&event,NotificationEvent,FALSE);
//用IoBuildDeviceIoControlRequest创建IRP
irp = IoBuildDeviceIoControlRequest(IoctlControlCode,
TopOfDeivceStack,
InputBuffer,
InputBufferLength,
OutputBuffer,
OutputBufferLength,
FALSE,
&event,
&ioStatus);
//判断IRP是否为零
KdPrint((" devicepointer=%u\n", TopOfDeivceStack));
KdPrint((" InputBuffer=%s\n", InputBuffer));
KdPrint((" InputBufferLength=%u\n", InputBufferLength));
KdPrint((" OutputBuffer=%s\n", OutputBuffer));
KdPrint((" OutputBufferLength=%u\n", OutputBufferLength));
if (NULL == irp)
{
KdPrint((" (NULL == irp)\n" ));
return STATUS_INSUFFICIENT_RESOURCES;
}
//调用底层驱动程序 就是这一行会引起蓝屏
status = IoCallDriver(TopOfDeivceStack,irp);
if (status == STATUS_PENDING)
{
KdPrint((" status == STATUS_PENDING\n" ));
status = KeWaitForSingleObject(&event,
Executive,
KernelMode,
FALSE,
NULL);
status = ioStatus.Status;
}