您的位置:首页 > 其它

内核学习-中断级别,分页内存,用户模式以及内核模式

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

);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息