内核学习-中断级别,分页内存,用户模式以及内核模式
2015-10-08 21:20
260 查看
一、中断级别
1.PASSIVE_LEVEL代码运行在这个级别不用担心分页内存被交换出去。
处在PASSIVE_LEVEL的地方为:
1.Driver_Entry,Unload,ShutDown,Dispatchxx
2.应用程序的线程所处的Zw例程
3.系统线程PsCreateSystemThread
4.minifilter 的 post 读写函数
5.WorkItem 后续会慢慢讲到,先放一放
6. DDK(WRK)文档中的 函数指定的函数
2.APC_LEVEL
大存储量设备的驱动程序运行于该级别,实际开发中很少遇到。
DISPATCH_LEVEL
一般在Hook 的时候用到,或者不想被干扰的时候用到
处在DISPATCH_LEVEL的地方为:
1.DPC 函数
DDK(WRK)文档中的 函数指定要求的函数
一般函数文档都会有这句话:
调用者必须运行在低于或等于DISPATCH_LEVEL级上
这个意思就是说这个函数的实现可能用了分页内存,如果高于DISPATCH_LEVEL级别的话,分页内存要交换出去,导致程序崩溃。
3.怎么提高到DPC
KIRQL oldirql;
ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL)
KeRaiseIrql (DISPATCH_LEVEL,&oldirql)
KeRaiseIrqlToDpcLevel
KeLowerIrql(oldirql)
二、用户模式和内核模式
1.为了隔离用户和内核的空间,系统空间的数据不能被用户空间访问到
2.当系统访问用户空间的数据时间,要保证用户地址空间数据的有效性
判断当前模式(ExGetPreviousMode )
1.一般我们在做hook 或者是重入处理的时候用得到,这个编程不注意的话,是大多数hook蓝屏的根源
2.我们只需要关注用户的操作而不关心来自内核的操作的时候
3.ProbeForRead 和 ProbeForWrite的使用
三、分页内存和非分页内存
Windows规定有些虚拟内存页面是可以交换到文件中的,这类内存被称为分页内存。而有些虚拟内存永远不会交换到文件中,这些内存被称为非分页内存。当程序的中断请求级在DISPATCH_LEVEL之上(包括DISPATCH_LEVEL层),程序只能使用非分页内存,否则将导致内存交换出去,蓝屏死机。
注意事项
1.分配后,要注意当前的调度级别,如果>= DISPATCH_LEVEL,可能导致蓝屏
2.有些函数调用会提高irql,这样也会导致系统蓝屏,注意使用函数时多看看ddk(wdk)文档
四、内核handle 和用户handle
handle 进程相关的,每个进程有一个handle表:3层表
handle 有效性验证
ObReferenceObjectByHandle
handle object转换
ObReferenceObjectByHandle
NTSTATUS
ObReferenceObjectByHandle(
IN HANDLE Handle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_TYPE ObjectType OPTIONAL,
IN KPROCESSOR_MODE AccessMode,
OUT PVOID *Object,
OUT POBJECT_HANDLE_INFORMATION HandleInformation OPTIONAL
);
相关文章推荐
- Linux 自检和 SystemTap
- Linux内核链表实现过程
- C++中Semaphore内核对象用法实例
- 修改内核 内存分配 root、文件系统和内核镜像的位置
- 移植linux-2.6.30.4到S3C2440
- 看《Linux0.11内核完全注释2.01》的方法
- 升级LINUX内核(支持8G内存)的命令
- FreeBSD系统优化部分内核参数调整中文注释
- Linux2.6X内核中文件相关结构体总结
- 内核的主要配置文件的详细说明
- redhat AS4内核配置更改再编译
- Linux启动添加内核参数简介
- 几个重要的Linux操作系统 内核文件介绍
- linux 2.4内核编译详解
- linux2.6内核编译方法详述
- 自己动手编译Linux内核
- linux 2.4内核编译详解
- selinux介绍及关闭方式!
- 如何编译内核
- linux 每日学一点《 Linux内核编译配置过程》