• Windows内核编程时的习惯与注意事项


    Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html

    一、内核编程注意细节:

    1. 在头文件中使用的是 <ntddk.h>,而非普通的 <windows.h>。
    2. 在应用层编程时,在内核编程时,要使用自己的WDK文档。https://docs.microsoft.com/zh-cn/windows-hardware/drivers/?redirectedfrom=MSDN

    二、获取未公开API的方法:

    1. 特征码搜索:遍历内核函数所在的模块。
    2. 解析内核PDB文件:用Windbg U 指令查看汇编函数代码。

      注意:在安全编程时,经常需要用到一些微软未公开文档化的API,这时就需要自己去寻找。

    三、变量定义习惯:

     遵循WDK自己的一套规范的变量定义习惯,而不是再用原来的int之类的C语言的变量名称。

        ULONG(unsigned long)  PULONG(unsigned long*)
        UCHAR(unsigned char)  PUCHAR(unsinged char*)
        UINT(unsigned int)     PUNIT(unsigned int*)
        VOID(void)                PVOID(void*)

    四、返回值:

      很多API都返回 NTSTATUS 来表示函数执行的结果,其中有如下含义。

      STATUS_SUCCESS 0x0000000 成功
      STATUS_INVALID_PARAMETER 0xC000000D 参数无效
      STAUS_BUFFER_OVERFLOW    0x80000005  缓冲区长度不够

      更多的信息可以在 ntstatus.h 中查看。

    五、内核中的异常处理:

            在内核中一个小小的错误就可能导致蓝屏(例如"读写无效内存")
            因此需要使用异常处理代码:

            __try {
                // 可能出错的代码
            }
            __except (filter_value) {
                // 出错时要执行的代码
            }

            filter_value解析:
            EXCEPTION_EXECUTE_HANDLER(1) 代码进入except块。
            EXCEPTION_CONTINUE_SEARCH(0) 不处理异常,由上一层调用函数处理。
            EXCEPTION_CONTINUE_EXECUTION(-1), 回去继续程序错误的代码。

    六、常用的内核内存函数
        对内存的使用,主要就是:申请、设置、拷贝以及释放。

        

       PVOID ExAllocatePool(
         __drv_strictTypeMatch(__drv_typeExpr)POOL_TYPE PoolType, // 这里主要说明其是 主要分页内存还是非分页内存
         SIZE_T // NumberOfBytes
       );

    七、内核字符串种类
      在R3层时都是以或结尾。
      但在驱动编程中,这样很容易出现蓝屏。
      因此,为了避免这种问题,使用内核提供的字符串。

            typedef struct _STRING {
                USHORT  Length;//字节数,不是字符数 一定要* sizeof(CHAR)
                USHORT  MaximumLength;//字节数,不是字符数 一定要* sizeof(CHAR)
                PWSTR  Buffer;//非零结尾,中间也可能含有零
            }ANSI_STRING, *PANSI_STRING;

            typedef struct _UNICODE_STRING {
                USHORT  Length;//字节数,不是字符数 一定要* sizeof(WCHAR)
                USHORT  MaximumLength;//字节数,不是字符数 一定要* sizeof(WCHAR)
                PWSTR  Buffer;//非零结尾,中间也可能含有零
            } UNICODE_STRING, *PUNICODE_STRING;

      常用字符串API函数:

      

      

  • 相关阅读:
    ejs
    appcan.slider.js探索
    js语法重点
    canvas动画
    canvas绘图
    Bootstrap 表单
    模态框
    Node.js EventEmitter(事件队列)
    Node.js 事件循环
    react native 页面跳转
  • 原文地址:https://www.cnblogs.com/onetrainee/p/11676833.html
Copyright © 2020-2023  润新知