zoukankan      html  css  js  c++  java
  • 46、Windows驱动程序模型笔记(四),异常

    1、Summary of Kernel-Mode Support Routines

    http://msdn.microsoft.com/en-us/library/ff563889%28VS.85%29.aspx

    决不在内核模式服务函数的参数中使用带有侧效的表达式。

    2、异常

        对用户模式虚拟内存直接引用的代码段应该用结构化异常帧保护起来。这样的引用通常发生在调用MmProbeAndLockPages、ProbeForRead,和ProbeForWrite函数时。

        当异常发生时,操作系统通过扫描堆栈异常帧来寻找相应的异常处理程序。

    wps_clip_image-1409

    图示 结构化异常处理逻辑

        显示了对过滤函数的两次调用。一次为了定位异常处理程序,另一次为了回卷堆栈。

        如果你需要获得更多的关于异常的信息,有两个函数可以在__except的求值表达式中调用,它们可以提供本次异常的相关信息。实际上,这两个函数是在Microsoft编译器的内部实现的,所以仅能用于特定时刻:

    •GetExceptionCode() 返回当前异常的数值代码。该值是一个NTSTATUS值。该函数仅在__except表达式和其后的异常处理代码中有效。

    •GetExceptionInformation() 返回EXCEPTION_POINTERS结构的地址,该结构包含异常的所有详细信息,在哪发生、发生时寄存器的内容,等等。该函数仅在__except表达式中有效。

    生成异常

    仅当你知道存在一个异常处理代码并知道你真正在做什么时,才可以在非任意线程上下文下生成一个异常。

    RaiseException

    ExRaiseStatus

    ExRaiseAccessViolation

    ExRaiseDatatypeMisalignment

        有一个地方必须使用结构化异常处理机制,那就是当调用MmProbeAndLockPages函数锁定被MDL(内存描述符表)使用的内存页时,必须建立一个异常处理例程。对于WDM驱动程序,这个问题不经常出现,因为通常你使用的MDL都已经被其它程序探测并锁定(probe-and-lock)过。但是,由于你可以定义使用METHOD_NEITHER缓冲方法的I/O控制(IOCTL)操作,所以你必须按下面方式写代码:

    PMDL mdl = MmCreateMdl(...);

    __try

    {

    MmProbeAndLockPages(mdl, ...);

    }

    __except(EXCEPTION_EXECUTE_HANDLER)

    {

    NTSTATUS status = GetExceptionCode();

    ExFreePool((PVOID) mdl);

    return CompleteRequest(Irp, status, 0);

    }

        程序可以在任何IRQL上调用KeBugCheckEx。如果程序发现一个不可恢复的错误,并且该程序继续运行将会破坏系统,那么该程序就调用KeBugCheckEx函数,这个函数将使系统以一种可控制的方式关闭。

  • 相关阅读:
    Ubuntu完全教程,让你成为Ubuntu高手!
    Centos7安装完毕后重启提示Initial setup of CentOS Linux 7 (core)的解决方法
    MS SQL操作Xml示例
    MY SQL sql_mode设置
    MS SQL " 无法启动分布式事务"问题的解决思路
    MS SQL常用系统表汇总
    SQL不同服务器数据库之间数据操作整理
    OPENQUERY用法
    SQL Compare 10.4.8.87 Edition 数据库比较工具 完全破解+使用教程
    各种主流 SQLServer 迁移到 MySQL 工具对比
  • 原文地址:https://www.cnblogs.com/mydomain/p/1925428.html
Copyright © 2011-2022 走看看