DPC

翻译 2017年06月15日 01:06:41

DeferredProcecure Call,延迟过程调用。是一种执行在任意线程上下文的DISPATCH_LEVEL层的可执行例程。硬件中断使用他们处理来自设备的中断。硬件驱动这样做是因为ISR通常运行在更高IRQLs(高于DISPATCH_LEVEL),如果他们花费太长时间,可能会降低系统的整体性能。因此,ISR典型的队列一个DPC并且马上返回,所以系统可以处理其它的中断请求。软驱动能使用DPCs快速的执行短任务。

DPC的用法很简单:用KeInitializeDpc来初始化一个KDPC对象,然后用KeInsertQueueDpc来队列他们。当处理器的IRQL从高优先级降到DISPATCH_LEVEL时,内核处理所有在队列中的DPCs。

每一个CPU保持着他们自己拥有的DPC队列。这个队列存放在CPU相关的KPRCB结构体中。一个是普通的DPC队列,另外一个是线程DPC队列。

Windows有一些机制来处理DPC。如KiIdleLoop、CPU处于DISPATCH_LEVEL或者在系统初始化的一个线程里(KiStartDpcThread)。

运行在DISPATCH_LEVEL这个IRQL上的线程不能被其它软中断(低于DISPATCH_LEVEL)打断。换句话说,如果在DPC例程里有一个死循环,和它相关的CPU便会一直自旋,使得系统看起来好像被冻结了。在多处理器上,或许不会被冻结但是执行这个DPC的处理器将不能被线程调度器使用。另外,DPC例程中不能等待任何的可分发对象,因为这些分发对象他们自己就运行在DISPATCH_LEVEL,这就是为什么相KeWaitForSingleObject和KeDelayExecuteThread不能在DPC例程中被调用的原因。

Windows有运行在特定时间周期的DPC看门狗例程用来检测DPC,bugchecks是DPC_WATCHDOG_VIOLATION(0x133)。可以用KeQueryDpcWatchdogInformation来查询这个看门狗的周期。

一些RootKits用DPC来同步访问全局链表。例如,可以从ActiveProcessLinks中移除一个实体来隐藏进程。因为这个链表能被任意处理器在任何时候修改,一些RootKits作者使用DPC连同其它同步机制来安全的处理这个问题。

相关文章推荐

dpc 去坏点

  • 2013年01月10日 13:20
  • 216KB
  • 下载

DPC与GT寻址

  • 2012年12月30日 17:47
  • 37KB
  • 下载

移除时钟KTIMER和DPC

在win7 32位和64位下 通过枚举系统所有KTIMER时钟,寻找自己想要移除的时钟,达到移除目标驱动的KTIMER和DPC的目的。...

DPC资料.rar

  • 2014年08月18日 18:25
  • 74KB
  • 下载

dpc_code.rar

  • 2014年04月16日 09:42
  • 20.79MB
  • 下载

windows内核情景分析 --- DPC 目的信令点编码

关于DPC的 文章 留着备用 原文地址 http://www.doudouxitong.com/guzhang/xitongjiqiao/2014/0404/901.html   ...

DPC分析 基于ReactOS0.33

windows的过程,有如linux的软中断。以前Linux内核中自旋锁同步分析提到过,Linux通过IN_HARDIRQ/IN_SOFTIRQ来屏蔽软中断的执行,windows其实也类似,偷梁换柱的...

Win32 核心 DPC 设计思想和实现思路浅析

Win32 核心 DPC 设计思想和实现思路浅析 http://www.blogcn.com/user8/flier_lu/index.html?id=1397656&run=.09D4C2F ...
  • wzsy
  • wzsy
  • 2011年08月26日 16:01
  • 913

关于内核定时器,DPC,线程的使用

关于内核定时器,及DPC的使用,看来一些代码,这个估计是比较规范的用法了,很基础,希望对新手有帮助 注意,这里的定时器不太精确! #include typedef struct _DEVICE...

DPC的使用方法

DPC的使用方法DPC即为DeferredProcedureCall,顾名思义就是在一段时间之后调用某一例程或函数。如果想要隔一段时间就执行自己所写的函数,那么我们可以用DPC,当然也可以用IoTim...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:DPC
举报原因:
原因补充:

(最多只允许输入30个字)