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. 2015北京区域赛 Mysterious Antiques in Sackler Museum 几何基础+思维

    题意是,选出三个,看看是否可以凑成一个新的矩形. #include<bits/stdc++.h> using namespace std; struct node { ]; }a[]; b ...

  2. selenium爬虫

    Web自动化测试工具,可运行在浏览器,根据指令操作浏览器,只是工具,必须与第三方浏览器结合使用,相比于之前学的爬虫只是慢了一点而已.而且这种方法爬取的东西不用在意时候ajax动态加载等反爬机制.因此找 ...

  3. 【Offer】[3-1] 【找出数组中重复的数字】

    题目描述 思路 Java代码 代码链接 题目描述 在一个长度为n的数组里的所有数字都在0~n-1的范围内.数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次. 请找出数组中任 ...

  4. 持续集成高级篇之Jenkins windows/linux混合集群搭建(二)

    系列目录 前面我们说过,要使用ssh方式来配置windows从节点,如果采用ssh方式,则windows和linux配置从节点几乎没有区别,目前发现的惟一的区别在于windows从节点上目录要设置在c ...

  5. 使用VUE实现在table中文字信息超过5个隐藏,鼠标移到时弹窗显示全部

    使用VUE实现在table中文字信息超过5个隐藏,鼠标移到时弹窗显示全部 <template> <div> <table> <tr v-for="i ...

  6. 解决The mysql extension is deprecated and will be removed

    今天打开网站突然发现报错:“PHP Deprecated:  mysql_connect(): The mysql extension is deprecated and will be remove ...

  7. FreeSql (二十九)Lambda 表达式

    FreeSql 支持功能丰富的表达式函数解析,方便程序员在不了解数据库函数的情况下编写代码.这是 FreeSql 非常特色的功能之一,深入细化函数解析尽量做到满意,所支持的类型基本都可以使用对应的表达 ...

  8. Android 网络通信框架Volley(二)

    Volley提供2个静态方法: public static RequestQueue newRequestQueue(Context context) {} public static Request ...

  9. 【第十四篇】easyui datagrid导出excel

    <a class="btn btn-app" onclick="exportExcel()"><i class="fa fa-edi ...

  10. Winform中实现ZedGraph中曲线右键显示为中文

    场景 Winforn中设置ZedGraph曲线图的属性.坐标轴属性.刻度属性: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...