DPC函数

DPC(Deferred Procedure Call)是Windows内核中的一种机制,用于在调度级别以下执行任务。每个CPU维护一个DPC请求队列,设备对象初始化时会设置KDPC结构。当需要执行DPC函数时,通过KeInsertQueueDpc()将其加入队列,并通过HalRequestSoftwareInterrupt()触发。一旦调度级别下降,内核会扫描并执行DPC函数。此外,Windows内核有一条工作线程处理DPC函数,使用工作队列进行任务调度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    DPC是Deferred Procedure Call,推迟的过程调用。内核中每个CPU都有一个DPC请求队列,DPC请求队列在每个CPU的PRCB数据结构中

    设备对象的数据结构DEVICE_OBJECT中有个成分Dpc,它是KDPC数据结构,用来设置有关本设备对象的DPC函数的信息。

ntdll!_KDPC
   +0x000 Type             : Int2B
   +0x002 Number           : UChar
   +0x003 Importance       : UChar
   +0x004 DpcListEntry     : _LIST_ENTRY
   +0x00c DeferredRoutine  : Ptr32     void 
   +0x010 DeferredContext  : Ptr32 Void
   +0x014 SystemArgument1  : Ptr32 Void
   +0x018 SystemArgument2  : Ptr32 Void
   +0x01c Lock             : Ptr32 Uint4B

    设备对象在初始化时通过KeInitializeDpc()设置好它的KDPC数据结构。当需要执行DPC函数时,通过KeInsertQueueDpc()提出DPC请求,把具体的KPC结构挂入PRCB中的DPC请求队列。如果将DPC请求挂入了队列,通过HalRequestSoftwareInterrupt()将PCR中的相应标志位设置为TRUE,表示要求扫描DPC请求队列。

    当CPU的运行级别从DISPATCH_LEVEL或以上降低到DISPATCH_LEVEL以下时,如果有扫描DPC请求队列的要求存在,内核就会扫描DPC请求队列并执行DPC函数。

    Windows内核提供了一个专门的线程来处理这些DPC函数。线程通过工作队列接受来自其他线程的工作请求。工作队列一共有3个,组成工作队列数组

EX_WORK_QUEUE ExWorkerQueue[MaximumWorkQueue];

    如有需要,别的线程可以准备好一个工作请求WORK_QUEUE_ITEM数据结构,将其挂入ExWorkerQueue[]中的某个队列。准备函数是ExInitializeWorkItem(),通过ExQueueWorkItem()将其挂入某个工作队列

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值