内核函数前缀
Windows内核会调用一些内核层的函数,这些函数都以固定的前缀开始,分别属于内核中不同的管理模块。
通过这些前缀,根据函数名就可以大致知道这个函数所属的层次和模块了。
- Ex:管理层(Executive)
- Ke:核心层(Kernel)
- Hal:硬件抽象层(Hardware Abstraction Layer)
- Ob:对象管理(Object)
- Mm:内存管理(Memory Manager)
- Ps:进程管理(Process)
- Se:安全管理(Security)
- Io:I/O管理
- Fs:文件系统(File System)
- Cc:文件缓存管理(Cache)
- Cm:系统配置管理(Configuration Manager)
- Pp:即插即用管理(PnP)
- Rtl:运行时程序库(Runtime Library)
- Zw/Nt:对应于SSDT表中的服务函数,例如与文件或注册表相关的操作函数
- Flt:Minifilter文件过滤驱动中调用的函数
- Ndis:Ndis网络框架中调用的函数
与应用层函数不同,调用内核函数的时候需要注意它的IRQL(Interrupt Request Level,中断请求级别)要求。
内核在不同的情况下会运行在不同的IRQL级别上,因此在不同的IRQL级别上,必须调用符合该IRQL级别要求的内核函数。
PASSIVE_LEVEL:IRQL的最低级别,没有被屏蔽的中断,对所有中断都作出响应;可以访问分页内存。
在这个级别上,线程执行用户模式,用户模式代码都是运行在该中断级别上的。
APC_LEVEL:只有APC级别的中断被屏蔽,可以访问分页内存。当有APC发生时,将处理器提升到APC级别,就能屏蔽其他APC了。分页调度管理就运行在该级别上。
DISPATCH_LEVEL:DPC和更低的中断被屏蔽,不能访问分页内存,所有被访问的内存不能分页。因为只能处理不可分页的内存,所以在这个级别上能够访问的API大大减少。线程调度和DPC例程运行在该级别上。
DIRQL:处于高层的驱动程序通常不会使用该IRQL级别,在该级别上所有的中断都会被忽略,这是IRQL的最高级别,通常使用它来判断设备的优先级。