(六)、数据类型与结构化异常处理

一、返回状态NTSTATUS

 
0
 
sev是符号位,两位,最高位为0表示正确,最高位为1表示错误 11代表严重性错误,10代表轻微型错误
C是客户位 标识操作系统定义的错误或者用户定义的错误状态
R位被取消了
Facility 是设施位,基本上用全零结构来表示
Code 16位,0到65535 代表了六万多个错误状态
 

二、结构化异常处理

1、一些API

0
MmIsAddressValid
检查地址合不合法
 
 
ProbeForRead
ProbeForWrite
这两个函数是来验证地址是否可读写和是否对齐的函数,但是仅限于用户地址空间的地址
0
 
 
ExRaiseStatus
ExRaiseAccessViolation
ExRaiseDataTypeMisalignment
这三个函数都是自身产生异常
0
 

2、代码实验

#include <ntddk.h>

VOID Unload(PDRIVER_OBJECT driver)
{
    DbgPrint("Driver Unload\n");
}



NTSTATUS DriverEntry(PDRIVER_OBJECT driver)
{
    DbgPrint("Driver Load\n");
    PCHAR buff = NULL;
    /*
    __try
    {
        //*buff = 'a';//
        //ProbeForRead(buff,4,4);
        //ProbeForWrite(buff, 4, 4);
        //ExRaiseStatus(STATUS_ACCESS_VIOLATION);//直接抛出0xc0000005异常//
        ExRaiseAccessViolation();    //相当于  ExRaiseStatus(STATUS_ACCESS_VIOLATION); //

    }
    __except (EXCEPTION_EXECUTE_HANDLER)
    {
        DbgPrint("异常码: %x\n", GetExceptionCode());
    }
    */

    int f1, f2, f3;
    f1 = 0;
    f2 = 1;
    f3 = 2;
    try
    {
        if (f1 != 0)
        {
            DbgPrint("在f1\n");
            __leave;
        }
        if (f2 == 1)
        {
            DbgPrint("在f2\n");
            __leave;
        }
        if (f3 == 2)
        {
            DbgPrint("在f3\n");
            __leave;//有点像goto 但不涉及堆栈展开
        }
    }
    __finally
    {
        DbgPrint("在finally\n");
    }




    driver->DriverUnload = Unload;
    return STATUS_SUCCESS;
}
EXCEPTION_EXECUTE_HANDLER:
0
 
 
__leave指令作用
0
 
三、LARGE_INTEGER结构体
很巧妙的一个结构体
0
根据预编译指令若定义宏MIDL_PASS,则将 结构体命名为LARGE_INTEGER,若未定义宏MIDL_PASS,则将联合体命名为LARGE_INTEGER。实际上如果编译器具有内置支持64位整数,使用QuadPart成员中存储的64位整数。否则,使用LowPart和HighPart成员的存储的64位整数。
 
posted @ 2022-04-03 23:21  TLSN  阅读(59)  评论(0编辑  收藏  举报