为啥内核驱动程序在抛出异常时无法更新注册表值?

Posted

技术标签:

【中文标题】为啥内核驱动程序在抛出异常时无法更新注册表值?【英文标题】:why Kernel Driver can not update registry value when it throw an exception?为什么内核驱动程序在抛出异常时无法更新注册表值? 【发布时间】:2017-03-23 09:23:23 【问题描述】:

这是一个测试 KMDF 项目。它的功能是读写注册表。

案例1:

1.读取一个注册表值并将一个值写入注册表

2.在windows中检查注册表,更新值。

案例2:

1.读取一个注册表值并写入一个值到注册表,最后添加异常。启动窗口时发生蓝屏

2.删除异常,启动窗口,检查注册表,值没有更新。

这些是我使用的异常代码。

    void GoException()
    
    PDRIVER_OBJECT obj = NULL;
    obj->DeviceObject->CurrentIrp = NULL;
    

我尝试了两个注册表路径。

HKEY_LOCAL_MACHINE\SOFTWARE\DELL\test(正常路径)

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TEST(服务路径)

【问题讨论】:

【参考方案1】:

注册表项之所以不能更新,是因为开机时需要到一定的时间点才能保存更改。一个驱动出现异常,可能无法保存。

【讨论】:

以上是关于为啥内核驱动程序在抛出异常时无法更新注册表值?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我应该在抛出异常指针时使用按引用捕获

了解Java在抛出异常时的堆栈展开

为啥内部异常到达 ThreadException 处理程序而不是实际抛出的异常?

谁在抛出(并捕获)这个 MySQL 异常?

SmtpClient.SendMailAsync 在抛出特定异常时导致死锁

XCode 6.3 在抛出 Objective-C++ 异常时立即引发 SIGABRT