在初学windows驱动时,开始除了要学习驱动的加载、调试等准备工作后,就要学习内核的API了,作为初学者在刚刚看到那些很陌生的函数时可能会感到很迷茫,其实这些都是很正常的,就像我们在刚刚接触编程时那样。
今天我在我第一篇正式的博文中总结一下windows内核API函数大概的分类,以便以后看到这些函数时首先能通过函数的名字判断出这个函数大概是做哪方面的工作。
大部分内核API都会有前缀,例如Io、Ex、Rtl、Ke、Zw、Nt、Ps、Ndis等等,下面就是各种前缀的函数它们主要功能。
1.Io-系列函数
这类函数的操作是和IO管理器相关的,IO管理器就是将用户调用的API函数翻译成IRP或者将等价请求发
送到内核各个不同的设备的关键组件。这个类别的函数是我们在处理请求时最常调用的。
例如:IoCreateFile 打开文件,这个函数比ZwCreateFile更加底层。
IoCreateDevice 生成一个设备对象。
IoCallDriver 发送请求,IO管理器调用这个函数把不同的IRP发送到不同的设备。
IoCompleteRequest 完成请求。
IoCopyCurrentIrpStackLocationToNet 将当前Irp栈空间所想拷贝到下一个栈空间。
IoSkipCurrentIrpStackLocationToNext 跳过当前IRP的栈空间。
IoGetCurrentStackLocation 获得Irp的当前栈空间指针。
2.Ex-系列函数
这类函数主要用于内存的分配和获取互斥体。
例如:ExAllocatePool 内存分配。相当于malloc。
ExFreePool 内存释放。相当于free。
ExAcquireFastMutex 获取一个快速互斥体。
ExReleaseFastNutex 释放一个快速互斥体。
ExRaiseStatus 抛出一个异常,带有一个错误的status值,用于从代码很深的地
方直接报错。
3.Zw-和Nt-系列函数
这类函数主要用于文件和注册表的操作。Zw和Nt函数具有同样的功能,中间实际上是从Zw函数到Nt函数的
简单跳转。这些函数都有同名的用户态API函数与之对应,而用户态同名函数可以用于所谓的Native程序,
所以这个系列的函数不管是用户态还是内核态都被称为Native API。
例如:ZwCreateFile\NtCreateFile 打开文件
ZwWriteFile\NtWriteFile 写文件
ZwReadFile\NtReadeFile 读文件
ZwQueryDirectoryFile\NtQueryDirectoryFile 目录查询
ZwDeviceIoControlFile\NtDeviceIoControlFile 发出设备控制请求
ZwCreateKey\NtCreateKey 打开一个注册表键
ZwQueryValueKey\NtQueryValueKey 读取一个注册表中的值
4.Rtl-系列函数
这类函数主要用于字符串操作和对内存的操作。
例如:RtlInitUnicodeString 初始化一个字符串
RtlCopyUnicodeString 拷贝字符串
RtlAppendUnicodeToString 将一个字符串追加到另一个字符串后
RtlStringCbPrintf 将字符串打印到一个字符串中。相当于sprintf
RtlCopyMemory 内存数据块拷贝
RtlMoveMemory 内存数据块移动
RtlZeroMemory 内存数据清零
RtlCompareMemory 内存比较
RtlGetVersion 获得当前windows版本
5.其他
Ps系列函数:这类函数大多是与进程、现成信息相关。
Ndis系列函数:这类函数是用来开发NDIS网络驱动。