为每一个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
- 为每一个CPU执行一次DPC例程
- KeXxxTimer例程, KTIMER对象, 和DPC
- 如何实现每个对象只执行一次的例程
- DPC
- DPC
- Ps回调通知例程、Dpc定时器、内核线程使用方法.
- 为每一个早晨拍日出
- Crontab 实现定时执行一个shell脚本(以每隔十分钟执行一次为例)
- while语句 执行到直到()为假 if只执行一次
- 后台执行格式化的例程
- javascript执行可执行文件的例程
- MapRedcue例程编译和执行
- boost仅运行一次的例程
- 为每一个工种定义一个适配器
- 记一次CPU占用率过高
- 一次cpu标高问题查找
- windows内核原理分析之DPC函数的执行(1)
- windows内核原理分析之DPC函数的执行(2)
- 【Android】给Android Studio设置代理
- Android Dalvik虚拟机
- maya extrude by python
- LeetCode_直方图最大面积(Largest Rectangle in Histogram)
- Remove Duplicates from Sorted List II
- 为每一个CPU执行一次DPC例程
- 念数字
- EasyChair提交会议论文的方法简介-转载
- 这是我的第一篇博客
- struts2 环境搭建
- mac的一点点使用心得
- 代码分析工具推荐Understand
- Medium 186题 Reverse Words in a String II
- 【codevs 3269】混合背包