typedef VOID (*ForEachProcessorDpc)(PVOID Argument);
// 对每一个CPU执行一个DPC例程
VOID KeForEachProcessor(ForEachProcessorDpc DeferredRoutine, PVOID DeferredContext);
#include <ntddk.h>
VOID KeForEachProcessorStub(KDPC *Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2) {
PVOID context;
ForEachProcessorDpc routine;
LONG *StubCount;
UNREFERENCED_PARAMETER(Dpc);
context = SystemArgument2;
routine = (ForEachProcessorDpc)SystemArgument1;
StubCount = (LONG *)DeferredContext;
ASSERT(KeGetCurrentIrql() == DISPATCH_LEVEL);
routine(context);
InterlockedExchangeAdd(StubCount, 1);
}
VOID KeForEachProcessor(ForEachProcessorDpc DeferredRoutine, PVOID DeferredContext) {
// 代码中使用KeBugCheck的部分几乎不会发生
CONST ULONG mTags = 'kfep';
KIRQL kIrql;
KDPC *DpcList;
LONG StubCount;
ULONG CpuIndex, CpuNumber;
PROCESSOR_N