为每一个CPU执行一次DPC例程

来源:互联网 发布:上海知柚网络公司市值 编辑:程序博客网 时间:2024/06/01 09:27
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_NUMBER CurrentProcessor;ASSERT(KeGetCurrentIrql() < DISPATCH_LEVEL);CpuNumber = KeQueryActiveProcessorCountEx(ALL_PROCESSOR_GROUPS);DpcList = ExAllocatePoolWithTag(NonPagedPool, CpuNumber * sizeof(KDPC), mTags);if (DpcList == NULL) {KeBugCheck(STATUS_INSUFFICIENT_RESOURCES);}StubCount = 0;kIrql = KeRaiseIrqlToDpcLevel();KeGetCurrentProcessorNumberEx(&CurrentProcessor);for (CpuIndex = 0; CpuIndex < CpuNumber; CpuIndex++) {NTSTATUS status;PROCESSOR_NUMBER number;status = KeGetProcessorNumberFromIndex(CpuIndex, &number);if (!NT_SUCCESS(status)) {KeBugCheck(status);}if (RtlEqualMemory(&number, &CurrentProcessor, sizeof(number))) {KeForEachProcessorStub(NULL, (PVOID)&StubCount, DeferredRoutine, DeferredContext);} else {PKDPC dpc;dpc = (DpcList + CpuIndex);KeInitializeDpc(dpc, KeForEachProcessorStub, (PVOID)&StubCount);status = KeSetTargetProcessorDpcEx(dpc, &number);if (!NT_SUCCESS(status)) {KeBugCheck(status);}if (!KeInsertQueueDpc(dpc, DeferredRoutine, DeferredContext)) {KeBugCheck(STATUS_UNSUCCESSFUL);}}}KeLowerIrql(kIrql);while (CpuNumber > (ULONG) StubCount) {LARGE_INTEGER Interval;Interval.QuadPart = -1;KeDelayExecutionThread(KernelMode, FALSE, &Interval);}ExFreePoolWithTag(DpcList, mTags);return;}


0 0
原创粉丝点击