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

相关文章

SysMain服务可以关吗? 解决SysMain服务导致的高CPU使用率问题

《SysMain服务可以关吗?解决SysMain服务导致的高CPU使用率问题》SysMain服务是超级预读取,该服务会记录您打开应用程序的模式,并预先将它们加载到内存中以节省时间,但它可能占用大量... 在使用电脑的过程中,CPU使用率居高不下是许多用户都遇到过的问题,其中名为SysMain的服务往往是罪魁

Python脚本轻松实现检测麦克风功能

《Python脚本轻松实现检测麦克风功能》在进行音频处理或开发需要使用麦克风的应用程序时,确保麦克风功能正常是非常重要的,本文将介绍一个简单的Python脚本,能够帮助我们检测本地麦克风的功能,需要的... 目录轻松检测麦克风功能脚本介绍一、python环境准备二、代码解析三、使用方法四、知识扩展轻松检测麦

MySQL中优化CPU使用的详细指南

《MySQL中优化CPU使用的详细指南》优化MySQL的CPU使用可以显著提高数据库的性能和响应时间,本文为大家整理了一些优化CPU使用的方法,大家可以根据需要进行选择... 目录一、优化查询和索引1.1 优化查询语句1.2 创建和优化索引1.3 避免全表扫描二、调整mysql配置参数2.1 调整线程数2.

Linux进程CPU绑定优化与实践过程

《Linux进程CPU绑定优化与实践过程》Linux支持进程绑定至特定CPU核心,通过sched_setaffinity系统调用和taskset工具实现,优化缓存效率与上下文切换,提升多核计算性能,适... 目录1. 多核处理器及并行计算概念1.1 多核处理器架构概述1.2 并行计算的含义及重要性1.3 并

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

Linux系统性能检测命令详解

《Linux系统性能检测命令详解》本文介绍了Linux系统常用的监控命令(如top、vmstat、iostat、htop等)及其参数功能,涵盖进程状态、内存使用、磁盘I/O、系统负载等多维度资源监控,... 目录toppsuptimevmstatIOStatiotopslabtophtopdstatnmon

C++ 检测文件大小和文件传输的方法示例详解

《C++检测文件大小和文件传输的方法示例详解》文章介绍了在C/C++中获取文件大小的三种方法,推荐使用stat()函数,并详细说明了如何设计一次性发送压缩包的结构体及传输流程,包含CRC校验和自动解... 目录检测文件的大小✅ 方法一:使用 stat() 函数(推荐)✅ 用法示例:✅ 方法二:使用 fsee

k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)

《k8s上运行的mysql、mariadb数据库的备份记录(支持x86和arm两种架构)》本文记录在K8s上运行的MySQL/MariaDB备份方案,通过工具容器执行mysqldump,结合定时任务实... 目录前言一、获取需要备份的数据库的信息二、备份步骤1.准备工作(X86)1.准备工作(arm)2.手

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

华为鸿蒙HarmonyOS 5.1官宣7月开启升级! 首批支持名单公布

《华为鸿蒙HarmonyOS5.1官宣7月开启升级!首批支持名单公布》在刚刚结束的华为Pura80系列及全场景新品发布会上,除了众多新品的发布,还有一个消息也点燃了所有鸿蒙用户的期待,那就是Ha... 在今日的华为 Pura 80 系列及全场景新品发布会上,华为宣布鸿蒙 HarmonyOS 5.1 将于 7