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. [kuangbin带你飞]专题一 简单搜索 Find a way HDU - 2612

    Pass a year learning in Hangzhou, yifenfei arrival hometown Ningbo at finally. Leave Ningbo one year ...

  2. [USACO07OCT]障碍路线 & yzoj P1130 拐弯 题解

    题意 给出n* n 的图,A为起点,B为终点,* 为障碍,.可以行走,问最少需要拐90度的弯多少次,无法到达输出-1. 解析 思路:构造N * M * 4个点,即将原图的每个点分裂成4个点.其中点(i ...

  3. vim中处理重定向文件中的^H和^M

    做实验的时候会把日志重定向写到文件中,方便以后查看.但是用vim打开之后出现很多^H和^M,就像乱码一样.如图所示: 现在尝试在vim中解决这个问题. 替换^H 在vim中输入命令,表示把^H替换成空 ...

  4. Go语言基础之指针

    区别于C/C++中的指针,Go语言中的指针不能进行偏移和运算,是安全指针. 要搞明白Go语言中的指针需要先知道3个概念:指针地址.指针类型和指针取值. Go语言中的指针 Go语言中的函数传参都是值拷贝 ...

  5. Python学习之旅:用Python制作一个打字训练小工具

    一.写在前面 说道程序员,你会想到什么呢?有人认为程序员象征着高薪,有人认为程序员都是死肥宅,还有人想到的则是996和 ICU. 别人眼中的程序员:飞快的敲击键盘.酷炫的切换屏幕.各种看不懂的字符代码 ...

  6. Tomcat9控制台中文乱码的解决方案

    1.网上大部分都是这种方法 注释掉 tomcat 9 安装目录下的conf里的 logging.properties 找到 java.util.logging.ConsoleHandler.encod ...

  7. BZOJ 刷题总结(持续更新)

    本篇博客按照题号排序(带*为推荐题目) 1008 [HNOI2008]越狱 很经典的题了..龟速乘,龟速幂裸题,, 1010 [HNOI2008]玩具装箱toy* 斜率优化 基本算是裸题. 1012 ...

  8. JDK1.8的HashMap数据结构及红黑树

    在JDK1.6,1.7中,HashMap的实现都是用基础的“拉链法”去实现,即数组+链表的形式.如下图:通过不同的hash值,来对数据进行分配存储. 关于HashMap的Entry长度,可以参考htt ...

  9. 建议收藏 - 专业的MySQL开发规范

    为了项目的稳定,代码的高效,管理的便捷,在开发团队内部会制定各种各样的规范 这里分享一份我们定义的MySQL开发规范,欢迎交流拍砖 数据库对象命名规范 数据库对象 命名规范的对象是指数据库SCHEMA ...

  10. redis 获取自增数

    近期,有一个项目需要用到数字的自增整数,范围是0-199999,但公司数据库是mongodb.同时装有mysql.redis等存储数据的这些数据库,其中redis是集群模式,mongodb是paa(  ...