获取多处理器系统的IDT表地址

 获取多处理器系统的IDT表地址,是通过设置操作所依赖的处理器核心来实现的.
在系统中处理器是从0开始进行编号的,如果只有一个处理器那它的编号就是0;
有两个就是0和1,依此类推.
获取系统处理器的总数是直接使用内核的导出变量KeNumberProcessors来实现的,
当然还有其他的方法,在这里我就不说了.
下面这段代码就是获取多处理器系统所有IDT地址的代码.
主要函数的描述,我在前面的帖子中已经发出
        PKDPC pDpc;        

        IDTInfo.uProcessorCount=KeNumberProcessors;

    if (KeNumberProcessors==1)
    {
                QueryAllIDTInfo(0,0,0,0);
    }
    else
    {
        PKDPC pTempDpc;

        pTempDpc=(PKDPC)ExAllocatePoolWithTag(NonPagedPool,sizeof(KDPC)*KeNumberProcessors,'rm');
        pDpc=pTempDpc;
        if(pTempDpc==NULL)
                        return ;

                for (ULONG i=0;i<KeNumberProcessors;i++,pTempDpc++)
        {
                        KeInitializeDpc(pTempDpc,(PKDEFERRED_ROUTINE)QueryAllIDTInfo,(PVOID)i);
                        KeSetTargetProcessorDpc(pTempDpc,i);
                        KeInsertQueueDpc(pTempDpc,NULL,NULL);
                }


                while(InterlockedCompareExchange(&g_FinshedDPC,KeNumberProcessors,KeNumberProcessors) != KeNumberProcessors)
                {
                        _asm nop
                }
                ExFreePoolWithTag(pDpc,'rm');
        }

//分派程序
VOID QueryAllIDTInfo(
IN struct _KDPC  *Dpc,
    IN ULONG ProcessorNumber,
    IN PVOID  SystemArgument1,
    IN PVOID  SystemArgument2)
{
IDT_REGISTER IDTR;
  
     __asm sidt  IDTR;
  
//下面这几个变量是我自定义的结构中的数据,这不重要,把获取到的信息放哪里自己决定.
    IDTInfo.IDTEntryPoint[ProcessorNumber].uProcessorNumber=ProcessorNumber;
IDTInfo.IDTEntryPoint[ProcessorNumber].uServiceLimit=IDTR.SegmentLimit;
IDTInfo.IDTEntryPoint[ProcessorNumber].pServiceTable =
  (PULONG)MAKELONG(IDTR.SegmentBaseAddressLow16,IDTR.SegmentBaseAddressHigh16);
    
//互锁函数.对数据执行增量操作.
    InterlockedIncrement(&g_FinshedDPC);
}

以上代码是在网络上找到的,我稍微的做了些修改,感谢这位无私奉献朋友友
以上的代码在WDK7600下编译通过,如果因为编译器版本不同无法通过编译,
可以对某些提示未定义的功能或者变量采取替代的方法,或者升级WDK,
反正是免费的.有不明白的地方可以QQ跟我联系.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值