zoukankan      html  css  js  c++  java
  • 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函数:

      

      

  • 相关阅读:
    ASP.NET CORE 使用Consul实现服务治理与健康检查(2)——源码篇
    ASP.NET CORE 使用Consul实现服务治理与健康检查(1)——概念篇
    Asp.Net Core 单元测试正确姿势
    如何通过 Docker 部署 Logstash 同步 Mysql 数据库数据到 ElasticSearch
    Asp.Net Core2.2 源码阅读系列——控制台日志源码解析
    使用VS Code 开发.NET CORE 程序指南
    .NetCore下ES查询驱动 PlainElastic .Net 升级官方驱动 Elasticsearch .Net
    重新认识 async/await 语法糖
    EF添加
    EF修改部分字段
  • 原文地址:https://www.cnblogs.com/onetrainee/p/11676833.html
Copyright © 2011-2022 走看看