1.
如果Dpc
-
>Importance
=
=
HighImportance,那么把DPC挂载在Dpc队列的头部,`InsertHeadList(&DpcData
-
>DpcListHead, &Dpc
-
>DpcListEntry);`,DPC队列就是由的CPU环境块中的dpcData进行维护。
2.
否则把DPC插入核心DPC队列的尾部
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
1.
如果DPC是线程化的DPC对象 DpcData
=
=
&TargetPrcb
-
>DpcData[DPC_THREADED],且
`TargetPrcb
-
>DpcThreadActive
=
=
FALSE&&
TargetPrcb
-
>DpcThreadRequested
=
=
FALSE`,也就是说Dpc线程不是活动状态,因为执行Dpc的时候会设置TargetPrcb
-
>DpcThreadActive
=
=
TRUE。这种情况下设置如下PRCB的标志:
TargetPrcb
-
>DpcSetEventRequest
=
TRUE;
/
/
设置Prcb
-
>DpcEvent有信号
TargetPrcb
-
>DpcThreadRequested
=
TRUE;
TargetPrcb
-
>QuantumEnd
=
TRUE;
也就是要把线程唤醒。
2.
如果DPC指定的不是当前CPU的PRCB,那么做一些检测以判断是否需要线程唤醒。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
1.
如果DPC是一般的DPC对象,且
`TargetPrcb
-
>DpcRoutineActive
=
=
FALSE&&
TargetPrcb
-
>DpcInterruptRequested
=
=
FALSE`的情况下,
然后判断只要Dpc的Importance不是LowImportance或者
DpcData
-
>DpcQueueDepth已经超过了PRCB的MaximumDpcQueueDepth(最大Queue深度)
获取TargetPrcb
-
>DpcRequestRate小于TargetPrcb
-
>MinimumDpcRate(最小请求率),
那么就会请求当前CPU的dispatch 中断,
且设置 TargetPrcb
-
>DpcInterruptRequested
=
TRUE。
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
那么经过上面的判断检验,需要dispatch 中断的都会执行
` KiRequestSoftwareInterrupt(DISPATCH_LEVEL);`,
这个函数在APC分析中也看到了,只不过那里的参数是APC_LEVEL。
这是由于APC是运行在APC_LEVEL,而DPC是运行在DISPATCH_LEVEL的。