首页
社区
课程
招聘
[求助]如何向其他CPU投递DPC啊?在网上找了好久也没找到代码....谁能提供一下关键代码?
发表于: 2010-5-5 20:52 5533

[求助]如何向其他CPU投递DPC啊?在网上找了好久也没找到代码....谁能提供一下关键代码?

2010-5-5 20:52
5533
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 350
活跃值: (87)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
投递DPC 啊 简单啊
我只给出关键部分的代码

ULONG   allProcessorDone =0;
DWORD cpuNum[16] = {0};
void MyDpcCallBack(PKDPC pKDpc,PVOID Data1,PVOID Data2,PVOID Data3);
void MyDpcCallBack(PKDPC pKDpc,PVOID Data1,PVOID Data2,PVOID Data3)
{//这个函数被调用的时候已经椒DPC级别
        DpcCallBack( Data1,Data2,Data3,KeGetCurrentProcessorNumber());
        InterlockedIncrement(&allProcessorDone);
}
NTSTATUS UpCpuToDpc()
{
        CCHAR i;
        long currentProcessor =0;
        PKDPC pkDpc =NULL;
        KIRQL oldIrql, currentIrql;
                currentIrql = KeGetCurrentIrql();
allProcessorDone =0;
        if (currentIrql < DISPATCH_LEVEL)
                KeRaiseIrql(DISPATCH_LEVEL, &oldIrql);
        InterlockedAnd(&allProcessorDone, 0);
        pkDpc = (PKDPC)ExAllocatePoolWithTag(NonPagedPool, KeNumberProcessors * sizeof(KDPC), (ULONG)' pni');
        //DpcCallBack
                if (!pkDpc)
        {
                DbgPrint("Insufficient Resource error\n");
                return 0xc000005;
        }
//循环向CPU插入DPC
                        for (i = 0; i < KeNumberProcessors; i++)
        {
               
                KeInitializeDpc(&pkDpc[i],
                        MyDpcCallBack,
                        &cpuNum[i]);
                KeSetTargetProcessorDpc(&pkDpc[i], i);
                KeInsertQueueDpc(&pkDpc[i], NULL, NULL);
        }
//等待DPC函数调用完成
        while(InterlockedCompareExchange(&allProcessorDone, KeNumberProcessors - 1, KeNumberProcessors - 1) != KeNumberProcessors - 1)
        {
                _asm pause;
        }
        if (currentIrql < DISPATCH_LEVEL)
                KeLowerIrql(oldIrql);

        if (pkDpc)
        {
                ExFreePool(pkDpc);
                pkDpc = NULL;
        }
        return 0;
}
2010-5-5 21:42
0
雪    币: 334
活跃值: (78)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
// MAXIMUM_PROCESSORS 在32位系统中是32, 64位是64
pDpc->Number = MAXIMUM_PROCESSORS + CpuNumber;
KeInsertQueueDpc(pDpc, NULL, NULL);
2010-5-6 10:00
0
雪    币: 225
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢大家.......但楼上的朋友,你这样投递DPC好象不大对吧?
2010-5-6 19:04
0
雪    币: 334
活跃值: (78)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
很对, 不信就试试
2010-5-6 20:00
0
游客
登录 | 注册 方可回帖
返回
//