IDT检测(支持多核cpu,兼容xp vista)

2023-12-03 00:38

本文主要是介绍IDT检测(支持多核cpu,兼容xp vista),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

获取idt信息再简单不过,只是随手实验的代码。欢迎各种飘过

ms的某些改动真是很烦人,没多大用处,又给兼容带来许多麻烦,大概ms以为vista会大卖,xp是淘汰货不用兼容了吧!我晕。(win7界面很难看。。学Ubuntu没学好吧....)

1. DbgPrin 用不了,查了查资料

  • Enable output of DbgPrint/KdPrint messages by default --Open the key "HKLM\SYSTEM\CCS\Control\Session Manager\Debug Print Filter".  Under this key, create a  value with the name "DEFAULT"  Set the value of this key equal to the DWORD value 8 to enable xxx_INFO_LEVEL output as well as xxx_ERROR_LEVEL output.  Or try setting the mask to 0xF so you get all output.  You must reboot for these changes to take effect.各种吃饱了没事干。

    2.获取cpu数目的方式变了,具体方法看下文。

      1 #define MAKELONG(a, b) ((unsigned long) (((unsigned short) (a)) | ((unsigned long) ((unsigned short) (b))) << 16)) 2 3 4 VOID ShowIDTinfo( 5                  IN struct _KDPC  *Dpc, 6                  IN ULONG cpuNum, 7                  IN PVOID  SystemArgument1, 8                  IN PVOID  SystemArgument2); 9 typedef struct _IDTENTRY 10 { 11     unsigned short LowOffset; 12     unsigned short selector; 13     unsigned char unused_lo; 14     unsigned char segment_type:4;    //0x0E is an interrupt gate 15     unsigned char system_segment_flag:1; 16     unsigned char DPL:2;           // descriptor privilege level 17     unsigned char P:1;              /* present */ 18     unsigned short HiOffset; 19 } IDTENTRY,*PIDTENTRY; 20 21 /* sidt returns idt in this format */ 22 typedef struct _IDTINFO 23 { 24     unsigned short IDTLimit; 25     unsigned short LowIDTbase; 26     unsigned short HiIDTbase; 27 } IDTINFO,*PIDTINFO; 28 typedef  ULONG (NTAPI *fnKeQueryActiveProcessorCount)(OUT PKAFFINITY  ActiveProcessors); 29 ULONG g_dwBuildNumber; 30 //记录完成dpc的数量 31 volatile LONG g_FinshedDPC = 0; 32 //入口函数 33 extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject,IN PUNICODE_STRING pRegistryPath) 34 { 35     NTSTATUS status; 36 37     //注册驱动调用函数入口 38     pDriverObject->DriverUnload = (PDRIVER_UNLOAD)DriverUnload; 39     pDriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL]= DriverIOCtrl    ; 40     pDriverObject->MajorFunction[IRP_MJ_CLOSE]= DriverDispatch    ; 41     pDriverObject->MajorFunction[IRP_MJ_CREATE]= DriverDispatch    ; 42     pDriverObject->MajorFunction[IRP_MJ_READ]= DriverDispatch    ; 43     pDriverObject->MajorFunction[IRP_MJ_WRITE]= DriverDispatch    ; 44 45 46     //创建设备 47     status = CreateDevice(pDriverObject); 48 49     ULONG count = 0; 50     UNICODE_STRING  ustr; 51     PKDPC pdpc; 52     PsGetVersion(0,0,&g_dwBuildNumber,0); 53     //__asm int 3 54     //动态获取地址,因为获取cpu数目的方法在vista sp1即以后版本有所改变, 55     //如果直接使用KeQueryActiveProcessorCount将导致驱动在xp下无法加载 56     if (g_dwBuildNumber == 2600 || g_dwBuildNumber == 6000) 57     { 58         RtlInitUnicodeString(&ustr,L"KeNumberProcessors"); 59         PVOID p = MmGetSystemRoutineAddress(&ustr); 60         if (p!=0) 61         { 62             count = *(ULONG *)p; 63         }     64     } 65     else 66     { 67         KAFFINITY procs; 68         RtlInitUnicodeString(&ustr,L"KeQueryActiveProcessorCount"); 69         fnKeQueryActiveProcessorCount MyQueryActiveProcessorCount = (fnKeQueryActiveProcessorCount)MmGetSystemRoutineAddress(&ustr); 70         if (MyQueryActiveProcessorCount != 0) 71         { 72             count = MyQueryActiveProcessorCount(&procs); 73         } 74 75     } 76     if (count==1) 77     { 78         ShowIDTinfo(0,0,0,0); 79     } 80     else 81     { 82         ULONG currrent_pro_num = KeGetCurrentProcessorNumber(); 83         ShowIDTinfo(0,currrent_pro_num,0,0); 84         g_FinshedDPC = 1; 85         PKDPC temp_dpc; 86         temp_dpc = (PKDPC)ExAllocatePoolWithTag(NonPagedPool,sizeof(KDPC)*count,'rm'); 87         pdpc = temp_dpc; 88         if (temp_dpc == NULL) 89             return status; 90         for (ULONG i = 0;i<count;i++,*temp_dpc++) 91         { 92             if (i!=currrent_pro_num) 93             { 94                 //传入一个cpu号就好 95                 KeInitializeDpc(temp_dpc,(PKDEFERRED_ROUTINE)ShowIDTinfo,(PVOID)i); 96                 KeSetTargetProcessorDpc(temp_dpc,i); 97                 KeInsertQueueDpc(temp_dpc,NULL,NULL); 98 99             } 
    100              
    101 
    102         } 
    103         //等待所有的dpc历程完事儿 
    104         while(InterlockedCompareExchange(&g_FinshedDPC,count,count) != count) 
    105         { 
    106             __asm nop 
    107         } 
    108         ExFreePoolWithTag(pdpc,'rm'); 
    109     } 
    110 
    111     return status; 
    112 } 
    113 
    114 VOID ShowIDTinfo( 
    115                  IN struct _KDPC  *Dpc, 
    116                  IN ULONG cpuNum, 
    117                  IN PVOID  SystemArgument1, 
    118                  IN PVOID  SystemArgument2) 
    119  { 
    120      IDTINFO idt_info; 
    121   
    122      __asm sidt  idt_info 
    123   
    124      PIDTENTRY pIDTen =( PIDTENTRY)MAKELONG(idt_info.LowIDTbase,idt_info.HiIDTbase); 
    125      PIDTENTRY pIDTtmp; 
    126      ULONG addr; 
    127   
    128      for (ULONG i=0;i<0xFF;i++) 
    129      { 
    130          pIDTtmp = &pIDTen[i]; 
    131          addr = MAKELONG(pIDTtmp->LowOffset,pIDTtmp->HiOffset); 
    132         DbgPrint("CPU:%d       Index:%d       Addr:0x%x   DPL:%d\n",cpuNum,i,addr,pIDTtmp->DPL);         
    133      } 
    134 
    135     InterlockedIncrement(&g_FinshedDPC); 
    136   
    137  }

    恩,就这样,利用dpc可以指定执行的cpu数目来搞。

这篇关于IDT检测(支持多核cpu,兼容xp vista)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/447462

相关文章

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

Android如何获取当前CPU频率和占用率

《Android如何获取当前CPU频率和占用率》最近在优化App的性能,需要获取当前CPU视频频率和占用率,所以本文小编就来和大家总结一下如何在Android中获取当前CPU频率和占用率吧... 最近在优化 App 的性能,需要获取当前 CPU视频频率和占用率,通过查询资料,大致思路如下:目前没有标准的

一文教你解决Python不支持中文路径的问题

《一文教你解决Python不支持中文路径的问题》Python是一种广泛使用的高级编程语言,然而在处理包含中文字符的文件路径时,Python有时会表现出一些不友好的行为,下面小编就来为大家介绍一下具体的... 目录问题背景解决方案1. 设置正确的文件编码2. 使用pathlib模块3. 转换路径为Unicod

Go使用pprof进行CPU,内存和阻塞情况分析

《Go使用pprof进行CPU,内存和阻塞情况分析》Go语言提供了强大的pprof工具,用于分析CPU、内存、Goroutine阻塞等性能问题,帮助开发者优化程序,提高运行效率,下面我们就来深入了解下... 目录1. pprof 介绍2. 快速上手:启用 pprof3. CPU Profiling:分析 C

定价129元!支持双频 Wi-Fi 5的华为AX1路由器发布

《定价129元!支持双频Wi-Fi5的华为AX1路由器发布》华为上周推出了其最新的入门级Wi-Fi5路由器——华为路由AX1,建议零售价129元,这款路由器配置如何?详细请看下文介... 华为 Wi-Fi 5 路由 AX1 已正式开售,新品支持双频 1200 兆、配有四个千兆网口、提供可视化智能诊断功能,建

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

MySQL的cpu使用率100%的问题排查流程

《MySQL的cpu使用率100%的问题排查流程》线上mysql服务器经常性出现cpu使用率100%的告警,因此本文整理一下排查该问题的常规流程,文中通过代码示例讲解的非常详细,对大家的学习或工作有一... 目录1. 确认CPU占用来源2. 实时分析mysql活动3. 分析慢查询与执行计划4. 检查索引与表

SpringBoot使用Apache Tika检测敏感信息

《SpringBoot使用ApacheTika检测敏感信息》ApacheTika是一个功能强大的内容分析工具,它能够从多种文件格式中提取文本、元数据以及其他结构化信息,下面我们来看看如何使用Ap... 目录Tika 主要特性1. 多格式支持2. 自动文件类型检测3. 文本和元数据提取4. 支持 OCR(光学

使用Python检查CPU型号并弹出警告信息

《使用Python检查CPU型号并弹出警告信息》本教程将指导你如何编写一个Python程序,该程序能够在启动时检查计算机的CPU型号,如果检测到CPU型号包含“I3”,则会弹出一个警告窗口,感兴趣的小... 目录教程目标方法一所需库步骤一:安装所需库步骤二:编写python程序步骤三:运行程序注意事项方法二

综合安防管理平台LntonAIServer视频监控汇聚抖动检测算法优势

LntonAIServer视频质量诊断功能中的抖动检测是一个专门针对视频稳定性进行分析的功能。抖动通常是指视频帧之间的不必要运动,这种运动可能是由于摄像机的移动、传输中的错误或编解码问题导致的。抖动检测对于确保视频内容的平滑性和观看体验至关重要。 优势 1. 提高图像质量 - 清晰度提升:减少抖动,提高图像的清晰度和细节表现力,使得监控画面更加真实可信。 - 细节增强:在低光条件下,抖