内核相关基础知识
1. CPU模式:实模式、保护魔术、8086虚拟模式
实模式:操作系统和软件权限一样,可以随便访问内存的每一个地方
保护模式:32位开始、开启了段页的保护,分为了用户模式和特权模式,这样可以保护关键内存不被访问修改。用户权限的应用程序,是不能访问特效模式的。
8086虚拟模式:CPU提供这种模式,使得可以跑16位程序
2. 内核:就是操作系统的一部分,这部分在0环运行
3. 驱动:可以看做是操作系统的一个dll,在0环运行操控硬件,但是我们肯定不是用来操控硬件。硬件不是微软产的,所有他肯定得让厂家能够编写,驱动代码控制硬件。所有我们就有机会能够访问内核。到了win7 64位后编写驱动需要增加签名才能够,被系统加载进去。
4. 用户模式和内核模式通信图
用户模式和内核模式
对内核驱动程序进行证明签名以便公开发布
安装开发驱动包(WDK)
我们现在学习的是XP系统,所有我们要开发XP的驱动,所以选择这个。
自己随便安装到一个目录、我安装的是D:\WinDDK
介绍WDK
第一个重要的是WDK的帮助文档
这个部分就是我们关于内核的帮助,驱动还有开发硬件的相关的,这些我们不需要了解。
这些就是内核函数
1. ob开头的API: 一般是对象使用,操作系统是C和汇编写的,但是用的却是面向对象设计,比如进程.还有引用计数等等.所以需要调用这种API.
2. Mm开头的API: Mm开头的API,都是内存管理的API,比如锁定一块内存,不让其与磁盘交换数据等等.
3. Ps开头的API: ps开头的API,一般都是管理进程和线程的API,比如psGetCurrentProcessId,获得当前进程ID.
4. Io开头的API: Io开头的API一般就是负责IO操作的.如果写硬件驱动则不用管这些.直接使用in 或者out进行操作.
5. Po开头的API: Po开头的API一般就是管理电源的API.对于写内核驱动的我们,不关心这些.写硬件驱动的则要关心,比如通电了.硬件驱动需要做些初始化什么的.
6. Cm开头的API: Cm开头的API一般是注册表常用的API.
7. Zw开头的API: Zw开头的API,一般是内核版本的API,比如三环有CreateFile,那么在内核API中则是ZwCreateFile.
8. Ke开头API: ke开头的API,一般是内核层的API.在内核中,分为内核层还有执行层.
9. Ex开头的API: Ex开头的API,则是执行层的API.
10. Rtl开头的API : Rtl开头的Api和C库函数很像,在驱动中可以使用C库函数,但是 微软不建议使用.所以提供了Rtl开头的API,甚至比C库函数还多.
11. DMA开头的API: 一般是写硬件驱动用的,我们不用.
12. HAL开头的API: 操作硬件抽象层的API.
13. Dbg开头的是调试函数
编译环境
我们现在看的是编译XP内核的环境
free编译的就是Release版
Checked编译的就是debug版
编写第一个内核程序
dll编写时候有一个dllmain
驱动有DriverEntry
编写代码
然后在DKK目录下找到src
找到这两个文件夹,然后拷贝到我们源码那里
把不需要的删除并且改名字就可以了
然后打开编译环境
进入源码路径,然后编译(build),发现这个错误就时路径有空格
得到sys的程序
#include <ntddk.h> VOID DriverUnload(__in struct _DRIVER_OBJECT *DriverObject) { DbgPrint("DriverUnload\n"); } int g_num = 100; NTSTATUS DriverEntry( PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegistryPath) { //注册卸载函数 DriverObject->DriverUnload = DriverUnload; DbgPrint("Hello WDK!:%p\n", &g_num); return STATUS_SUCCESS; }