一次电脑蓝屏NO_MORE_IRP_STACK_LOCATIONS的处理

电脑自从装了某安全软件,每次开机都蓝屏,复位后又正常,提示说内存怎么怎么的,但看起来不像内存问题,于是下决心研究下。

首先在微软网站找故障说明。

发现 发生此问题是因为 Mup.sys 驱动程序假定有必须不超过三种文件系统筛选驱动程序同时运行。 Mup.sys 驱动程序处理分布式文件系统 (DFS) 文件 I / O 请求。 如果有四个或多个文件系统过滤器驱动程序, I / O 请求数据包 (IRP) 位置缓冲区, 是由 Mup.sys pre-allocated 将溢出。 这时, 收到 Stop 错误症状部分中描述。

于是:需要修改修改DfsIrpStackSize注册表项,增加该值超过三。

步骤如下:

1 运行regedit。

2 找到如下下注册表子项:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Mup\Parameters

3 单击DfsIrpStackSize,然后单击修改值为10。

4 如果没有该项,则新建一个DWORD值,命名为DfsIrpStackSize。

5 设置该项值为10,十进制。

6退出regedit,重启计算机。

然后就不出现蓝屏现象了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WDF驱动向底层磁盘驱动发送IRP_MJ_READ请求读取原始数据的示例代码如下: ```cpp NTSTATUS ReadFromDisk(WDFDEVICE Device, PVOID Buffer, ULONG Length) { NTSTATUS status = STATUS_SUCCESS; WDFREQUEST request = NULL; PIRP irp = NULL; KEVENT event; IO_STATUS_BLOCK ioStatusBlock; // 初始化事件 KeInitializeEvent(&event, NotificationEvent, FALSE); // 创建请求对象 status = WdfRequestCreate(WDF_NO_OBJECT_ATTRIBUTES, WdfDeviceGetIoTarget(Device), &request); if (!NT_SUCCESS(status)) { return status; } // 获取IRP对象 irp = WdfRequestWdmGetIrp(request); // 设置IRP参数 IoSetCompletionRoutine(irp, ReadCompletionRoutine, &event, TRUE, TRUE, TRUE); irp->Flags |= IRP_BUFFERED_IO | IRP_DEALLOCATE_BUFFER; irp->AssociatedIrp.SystemBuffer = Buffer; irp->MdlAddress = NULL; irp->IoStatus.Status = STATUS_NOT_SUPPORTED; irp->IoStatus.Information = 0; irp->Tail.Overlay.Thread = PsGetCurrentThread(); irp->Tail.Overlay.OriginalFileObject = NULL; irp->Tail.Overlay.AuxiliaryBuffer = NULL; irp->Flags &= ~(IRP_PAGING_IO | IRP_NOCACHE | IRP_SYNCHRONOUS_API); // 设置IO栈位置 PIO_STACK_LOCATION irpStack = IoGetNextIrpStackLocation(irp); irpStack->MajorFunction = IRP_MJ_READ; irpStack->Parameters.Read.Length = Length; irpStack->Parameters.Read.ByteOffset.QuadPart = 0; // 发送IRP请求 status = WdfRequestSend(request, WdfDeviceGetIoTarget(Device), WDF_NO_SEND_OPTIONS); if (!NT_SUCCESS(status)) { WdfRequestComplete(request, status); return status; } // 等待请求完成 KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); // 获取IO状态 status = irp->IoStatus.Status; // 完成请求 WdfRequestComplete(request, status); return status; } ``` 在以上代码中,我们创建了一个WDF请求对象,并获取了其对应的IRP对象,然后设置了IRP的各项参数,最终发送请求并等待请求完成。一旦请求完成,我们就可以通过IRP的IoStatus成员获取IO操作的状态,然后使用WdfRequestComplete函数完成请求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值