怎么查开房同住人记录) 公共局怎么才给查开房

本文基于Windows2003以上32位系统,因为XP处理NMI很弱,我们后面再说。  最近为点硬件写驱动,需要处理关于NMI的一些东西,索性把以前记录的一些资料和最新的体会写下来,希望对大家有用。  Nmi(Non Maskable Interrupt),一般在紧急的电源故障、总线超时或者存储器奇偶校验出错时被发出,对应的中断向量号为2,即int 2。CP

本文基于Windows2003以上32位系统,因为XP处理NMI很弱,我们后面再说。  最近为点硬件写驱动,需要处理关于NMI的一些东西,索性把以前记录的一些资料和最新的体会写下来,希望对大家有用。  Nmi(Non Maskable Interrupt),一般在紧急的电源故障、总线超时或者存储器奇偶校验出错时被发出,对应的中断向量号为2,即int 2。CPU有两根引脚INTR和NMI接受外部中断请求信号:INTR接受可屏蔽中断请求,NMI接受不可屏蔽中断请求。在80386以上,标志寄存器 EFLAGS中的IF标志决定是否屏蔽可屏蔽中断请求。下面是调试器的结果:  kd> !idt -a  Dumping IDT:  00: 8082409e nt!KiTrap00  01: 8082421a nt!KiTrap01  02: Task Selector = 0x0058  03: 8082462a nt!KiTrap03  04: 808247a6 nt!KiTrap04  05: 80824904 nt!KiTrap05  06: 80824a86 nt!KiTrap06  07: 808250e6 nt!KiTrap07  08: Task Selector = 0x0050  09: 80825518 nt!KiTrap09  0a: 80825632 nt!KiTrap0A  //...  ff: 808231b0 nt!KiUnexpectedInterrupt207  相关的中断可以查阅详细资料[1],我们只关心下面两个:  IDTEntry _KiTrap02, D_INT032 ; 2: NMI/NPX Error  IDTEntry _KiTrap08, D_INT032 ; 8: Double Exception  即Windbg中显示的:  02: Task Selector = 0x0058  08: Task Selector = 0x0050  表 示的是系统为处理这两个int而设置的任务门,KGDT_DF_TSS(50h)和KGDT_NMI_TSS(58h)。那么是系统什么时候设置的 呢?ntoskrnl加载的时候,KERNEL_ENTRY_POINT是KiSystemStartup()函数,反汇编不难看出它的流程,你也可以参 考WangYu的一篇文章[2],或者可以参考ReactOs的代码,不过我们简单地反汇编一些:  1)首先是为NMI建立任务门,这样我们就能捕捉到NMI了:  INIT:006053CE mov eax, [ebp+var_10] ; 之前由GetMachineBootPointers得到的Idt  INIT:006053D1 lea ecx, [eax+10h] ; 16/8 -> 2号中断描述符  INIT:006053D4 mov byte ptr [ecx+5], 85h ; 10000101 -> dpl=0, present, taskgate  INIT:006053D8 mov word ptr [ecx+2], 58h ; KGDT_NMI_TSS(58h)  INIT:006053DE lea ecx, [edi+58h]  INIT:006053E1 mov byte ptr [ecx+5], 89h ; 10001001 -> 32bit, dpl=0, present, TSS32, not busy  INIT:006053E5 mov edx, offset _KiNMITSS  INIT:006053EA mov eax, edx  INIT:006053EC mov [ecx+2], ax ; KgdtBaseLow(2h)  INIT:006053F0 shr eax, 10h  INIT:006053F3 mov [ecx+7], ah ; KgdtBaseHi(7h)  INIT:006053F6 mov [ecx+4], al ; KgdtBaseMid(4h)  INIT:006053F9 mov eax, 68h ; MINIMUM_TSS_SIZE(68h)  INIT:006053FE mov [ecx], ax ; KgdtLimitLow(0h)  INIT:00605401 push edx  INIT:00605402 push edx  INIT:00605403 call KiInitializeTSS(x)  2)然后是建立堆栈:  INIT:00605408 pop edx  INIT:00605409 mov eax, cr3  INIT:0060540C mov [edx+1Ch], eax ; TssCr3(1ch)  INIT:0060540F mov eax, offset P0BootStack  INIT:00605414 mov eax, [eax+38h]  INIT:00605417 mov [edx+4], eax ; TssEsp0(4h) , NMI stack  INIT:0060541A mov [edx+38h], eax  INIT:0060541D mov dword ptr [edx+20h], offset _KiTrap02 

  • 发表于 2021-02-06 08:19
  • 阅读 ( 218 )
  • 分类:互联网

0 条评论

请先 登录 后评论
实力w6146275
实力w6146275

721 篇文章

你可能感兴趣的文章

相关问题