Windows内核编程时的习惯与注意事项
Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html
一、内核编程注意细节:
- 在头文件中使用的是 <ntddk.h>,而非普通的 <windows.h>。
- 在应用层编程时,在内核编程时,要使用自己的WDK文档。https://docs.microsoft.com/zh-cn/windows-hardware/drivers/?redirectedfrom=MSDN
二、获取未公开API的方法:
- 特征码搜索:遍历内核函数所在的模块。
- 解析内核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内核编程时的习惯与注意事项的更多相关文章
- 《天书夜读:从汇编语言到windows内核编程》八 文件操作与注册表操作
1)Windows运用程序的文件与注册表操作进入R0层之后,都有对应的内核函数实现.在windows内核中,无论打开的是文件.注册表或者设备,都需要使用InitializeObjectAttribut ...
- 《天书夜读:从汇编语言到windows内核编程》五 WDM驱动开发环境搭建
(原书)所有内核空间共享,DriverEntery是内核程序入口,在内核程序被加载时,这个函数被调用,加载入的进程为system进程,xp下它的pid是4.内核程序的编写有一定的规则: 不能调用win ...
- windows内核编程之常用数据结构
1.返回状态 绝大部分的内核api返回值都是一个返回状态,也就是一个错误代码.这个类型为NTSTATUS.我们自己写的函数也大部分这样做. NTSTATUS MyFunction() { NTSTAT ...
- 《天书夜读:从汇编语言到windows内核编程》六 驱动、设备、与请求
1)跳入到基础篇的内核编程第7章,驱动入口函数DriverEnter的返回值决定驱动程序是否加载成功,当打算反汇编阅读驱动内核程序时,可寻找该位置. 2)DRIVER_OBJECT下的派遣函数(分发函 ...
- 《Windows内核编程》---系统线程和同步事件
系统线程: 在驱动中生成的线程一般是系统线程,系统线程所在的进程名为“System”,用到的内核API函数是: NTSTATUS PsCreateSystemThread( OUT PHANDLE T ...
- 《天书夜读:从汇编语言到windows内核编程》四 windows内核调试环境搭建
1) 基础篇是讲理论的,先跳过去,看不到代码运行的效果要去记代码是一个痛苦的事情.这里先跳入探索篇.其实今天的确也很痛苦,这作者对驱动开发的编译与调试环境介绍得太模糊了,我是各种尝试,对这个环境的搭建 ...
- windows内核编程基础知识
/* 1.基本的驱动数据结构 //驱动对象结构体 typedef struct _DRIVER_OBJECT { CSHORT Type; //结构类型 CSHORT Size; //结构大小 PDE ...
- 《天书夜读:从汇编语言到windows内核编程》十一 用C++编写内核程序
---恢复内容开始--- 1) C++的"高级"特性,是它的优点也是它的缺点,微软对于使用C++写内核程序即不推崇也不排斥,使用C++写驱动需注意: a)New等操作符不能直接使用 ...
- 《天书夜读:从汇编语言到windows内核编程》十 线程与事件
1)驱动中使用到的线程是系统线程,在system进程中.创建线程API函数:PsCreateSystemThread:结束线程(线程内自行调用)API函数:PsTerminateSystemThrea ...
随机推荐
- List集合的排序
最近在写需求时,将某张表中的短信信息拿出,sql写完后,取出来后的结构是List<Map>,在进行到某一步时需要将这个List<Map>进行逆序排序, 当时第一想法便是写一个f ...
- Linux基础Day001-001章
运维工作职责:(运行和维护服务器) 1.数据不能丢失, 2.保障网站7*24H正常运行,--一直运行; 3.用户体验要好,--打开网站速度要快 服务器核心硬件(硬盘,内存,CPU) 尺寸: 1U-4. ...
- 第 15 篇:优化博客功能的细节,提升使用体验—— HelloDjango 系列教程
作者:HelloGitHub-追梦人物 文中涉及的示例代码,已同步更新到 HelloGitHub-Team 仓库 在之前的系列教程中,我们已经实现了:文章的发布.展示.评论等功能,可能认真的小伙伴已经 ...
- 一篇RPO漏洞挖掘文章翻译加深理解。
这是我第一次尝试翻译一篇漏洞挖掘文章,翻译它也是为了加深理解它.这是一篇很有意思的漏洞挖掘文章. 前几天在看fd的博客,偶然看到了这篇文章,虽然有点老了.但是思路真的牛皮.我决定花费时间和精力研究它们 ...
- 随笔之AJAX粗解 小白入门向
AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准的新方法. AJAX 最大的 ...
- 粗糙版ORM(附详细注释)
目录 ORM 其他 ORM代码 数据库表代码 mysql代码 db/models.py db/pymysql_opreator.py ORM 作为数据库表记录 和 python中对象的映射关系中间件 ...
- Hive的动态分区
关系型数据库(如Oracle)中,对分区表Insert数据时候,数据库自动会根据分区字段的值,将数据插入到相应的分区中,Hive中也提供了类似的机制,即动态分区(Dynamic Partition), ...
- 【学习笔记】第一章 python安全开发简介
1.1为什么黑客喜欢用python? python为我们提供了非常完善的基础代码库,覆盖了网络.文件.GUI.数据库.文本等大量内容,被形象的称为“”内置电池“”,用python开发,许多功能不必从零 ...
- flex布局笔记整理
flex布局笔记整理 了解-webkit-box 利用postcss进行css代码的向后兼容时,display:flex兼容后的代码常会带有display:-webkit-box. 部分移动端内核较低 ...
- linux 操作系统级别监控 TOP命令
Top命令是Linux下一个实时的.交互式的,对操作系统整体监控的命令,可以对CPU.内存.进程监控. 是Linux下最常用的监控命令. 第一行是任务队列信息 1 user 当前登录用户数load a ...