获取多处理器系统的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开始进行编号的,如果只有一个处理器那它的编号就是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跟我联系.