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层时都是以\0或\0\0结尾。
  但在驱动编程中,这样很容易出现蓝屏。
  因此,为了避免这种问题,使用内核提供的字符串。

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函数:

  

  

Windows内核编程时的习惯与注意事项的更多相关文章

  1. 《天书夜读:从汇编语言到windows内核编程》八 文件操作与注册表操作

    1)Windows运用程序的文件与注册表操作进入R0层之后,都有对应的内核函数实现.在windows内核中,无论打开的是文件.注册表或者设备,都需要使用InitializeObjectAttribut ...

  2. 《天书夜读:从汇编语言到windows内核编程》五 WDM驱动开发环境搭建

    (原书)所有内核空间共享,DriverEntery是内核程序入口,在内核程序被加载时,这个函数被调用,加载入的进程为system进程,xp下它的pid是4.内核程序的编写有一定的规则: 不能调用win ...

  3. windows内核编程之常用数据结构

    1.返回状态 绝大部分的内核api返回值都是一个返回状态,也就是一个错误代码.这个类型为NTSTATUS.我们自己写的函数也大部分这样做. NTSTATUS MyFunction() { NTSTAT ...

  4. 《天书夜读:从汇编语言到windows内核编程》六 驱动、设备、与请求

    1)跳入到基础篇的内核编程第7章,驱动入口函数DriverEnter的返回值决定驱动程序是否加载成功,当打算反汇编阅读驱动内核程序时,可寻找该位置. 2)DRIVER_OBJECT下的派遣函数(分发函 ...

  5. 《Windows内核编程》---系统线程和同步事件

    系统线程: 在驱动中生成的线程一般是系统线程,系统线程所在的进程名为“System”,用到的内核API函数是: NTSTATUS PsCreateSystemThread( OUT PHANDLE T ...

  6. 《天书夜读:从汇编语言到windows内核编程》四 windows内核调试环境搭建

    1) 基础篇是讲理论的,先跳过去,看不到代码运行的效果要去记代码是一个痛苦的事情.这里先跳入探索篇.其实今天的确也很痛苦,这作者对驱动开发的编译与调试环境介绍得太模糊了,我是各种尝试,对这个环境的搭建 ...

  7. windows内核编程基础知识

    /* 1.基本的驱动数据结构 //驱动对象结构体 typedef struct _DRIVER_OBJECT { CSHORT Type; //结构类型 CSHORT Size; //结构大小 PDE ...

  8. 《天书夜读:从汇编语言到windows内核编程》十一 用C++编写内核程序

    ---恢复内容开始--- 1) C++的"高级"特性,是它的优点也是它的缺点,微软对于使用C++写内核程序即不推崇也不排斥,使用C++写驱动需注意: a)New等操作符不能直接使用 ...

  9. 《天书夜读:从汇编语言到windows内核编程》十 线程与事件

    1)驱动中使用到的线程是系统线程,在system进程中.创建线程API函数:PsCreateSystemThread:结束线程(线程内自行调用)API函数:PsTerminateSystemThrea ...

随机推荐

  1. 2017 ACM/ICPC Asia Regional Qingdao Online 1003 The Dominator of Strings hdu 6208

    The Dominator of Strings Time Limit: 3000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java ...

  2. 关于Ubunto在VMwark中无法全屏。

    1.右键点击Ubunto桌面,进入终端 输入: 1.sudo apt-get install open-vm*   安装依赖项 2.sudo apt-get install open-vm-tools ...

  3. (六十二)c#Winform自定义控件-警灯(工业)

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kwwwvagaa/NetWinformControl 码云:ht ...

  4. ECMAScript es6新功能讲解视频教程

    下载链接:https://www.yinxiangit.com/1.html 目录: 01.课程介绍-ECMAScript 新功能.mp402.块的作用域-let.mp403.恒量-const.mp4 ...

  5. iOS代码混淆

    混淆原理 代码编译阶段将符号(方法名.属性名等)替换成随机生成的字符串 长话短说,直接上步骤. 混淆集成步骤 步骤一.创建shell文件(confuse.sh)并配置相应的运行环境. 在项目根目录下新 ...

  6. 基于Arduino和Blynk平台的远程控制智能小车

    /------转载请附上本文链接 https://i.cnblogs.com/EditArticles.aspx?opt=1 -------啦啦啦我是快乐的分割线- ------------/ 小车图 ...

  7. mysql命令行乱码解决办法

     解决办法: 修改mysql的配置文件my.ini,打开my.ini找到default-charactor-set,改为utf8. 进入命令行: show variables like'%char%' ...

  8. IOS13系统升级带来的H5兼容性问题

    20号新推送的IOS13给很多app厂商和RD带来了便秘的感觉,目前复现的问题如下,后续还会持续更新: 1.H5 hybrid输入框导致的页面上移,卡住不动.收起减半后,页面出现半截白屏.(IOS12 ...

  9. 04:videoToolbox:硬编码

    一:前言: 1:apple develop 来源 2:VideoToolbox(视频工具箱)工作流程 2.1:创建 一个压缩会话. 2.2:添加会话属性. 2.3:编码视频帧.接受视频编码回调. 2. ...

  10. java线上cpu、内存问题排查方法

    一.线程 查进程中占用cpu高的线程 ps -mp xxxxx -o THREAD,tid,time | sort -rn 将线程的id从10位转到16位,可以在下面jstack中找到对应线程 输出线 ...