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

一、中断级别

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
大存储量设备的驱动程序运行于该级别,实际开发中很少遇到。

  1. DISPATCH_LEVEL
    一般在Hook 的时候用到,或者不想被干扰的时候用到
    处在DISPATCH_LEVEL的地方为:
    1.DPC 函数
  2. 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
);

你可能感兴趣的:(内核,中断级别,分页内存,用户handle)