遍历IDT表和分析GDT表结构

来源:互联网 发布:通达oa2016源码反编译 编辑:程序博客网 时间:2024/05/28 05:14
#include"basetsd.h"/**IDT寄存器结构*IDTR寄存器共有48位,高32位是IDT表的基地址,低16位是IDT表的长度(Limit)*IDT表示一张位于物理内存中的线性表,共有256个表项。*/typedef struct _IDT_INFO{    UINT16 uIdtLimit;    UINT16 uLowIdtBase;    UINT16 uHighIdBase;    }IDT_INFO,*PIDT_INFO;/* ----------------选择子-----------------------|   1   |     0    |  字节|7654321076543 2 10|  比特|-------------|-|--|  占位|    INDEX    |T|R |  含义|             |I|P ||             | |L |*Index : 在GDT数组或LDT数组的索引号*TI:Table Indicator ,这个值为0表示查找GDT,1表示查找LDT*RPL:请求特权级,以什么样的权限去访问段。*/typedef struct _SELECTOR{    int PRL:2;    int TI:1;    int Index:13;    }SELECTOR,*PSELECTOR;/*----------------------段描述符结构--------------------|   7    |     6       |     5     |   4    |   3    |   2    |   1    |   0    |  字节|76543210|7 6 5 4 3210 |7 65 4 3210|76543210|76543210|76543210|76543210|76543210|  比特|--------|-|-|-|-|---- |-|--|-|----|--------|--------|--------|--------|--------|  占位|  BASE  |G|D|0|A|LIMIT|P|D |S|TYPE|<------- BASE 23-0 ------>|<-- LIMIT 15-0 ->|  含义|  31-24 | |/| |V|19-16| |P |           |B| |L|     | |L |BASE: 段基址,由上图中的两部分(BASE 31-24 和 BSE23-0)组成G:LIMIT的单位,该位 0 表示单位是字节,1表示单位是 4KBD/B: 该位为 0 表示这是一个 16 位的段,1 表示这是一个 32 位段AVL: 该位是用户位,可以被用户自由使用LIMIT: 段的界限,单位由 G 位决定。数值上(经过单位换算后的值)等于段的长度(字节)- 1。P: 段存在位,该位为 0 表示该段不存在,为 1 表示存在。DPL:段权限S: 该位为 1 表示这是一个数据段或者代码段。为 0 表示这是一个系统段(比如调用门,中断门等)TYPE: 根据 S 位的结果,再次对段类型进行细分。*/typedef struct _GDT{    INT64 Limit0_15 : 16;    INT64 base0_23  : 24;    INT64 TYPE      : 4;    INT64 S         : 1;    INT64 DPL       : 2;    INT64 P         : 1;    INT64 Limit16_19: 4;    INT64 AVL       : 1;    INT64 O         : 1;    INT64 D_B       : 1;    INT64 G         : 1;    INT64 Base24_31 : 8;    }GDT,*PGDT;//830089f700000068/*------------------IDT表----------|   7    |     6       |     5     |   4    |   3    |   2    |   1    |   0    |  字节|76543210|76543210|7 65 43210|76543210 |76543210|76543210|76543210     |76543210|  比特|-----------------|-|---|----|-------- |-----------------|----------------------|  占位|  uOffsetHigh    |P|DPL|type|reserve_1|    selector     | uOffsetLow       |  含义type 用来区分类型;中断恩的类型是0b00101(b代表的二进制数),中断门的类型是0b0D110,其中D为用来表示描述的是16位们(0)还是32位门(1),陷阱门的类型是0b0D111.*0x05 : 32 位的任务门*0x06 : 16位的中断门*0x07 : 16位的陷阱门*0x0E : 32位的中断门*0x0F : 32位的陷阱门*/typedef struct  _IDT{    UINT16 uOffsetLow ;  //处理程序低地址便宜    UINT16 selector ;    //段选择子    UINT8 reserve_1 ;    //保留    UINT8 type       : 5; //中断类型    UINT8 DPL        : 2;  //特权级    UINT8 P          : 1;  //如未使用中断可置为0    INT16 uOffsetHigh;     //处理程序高地址偏移    }IDT,*PIDT;
#include<ntddk.h>#include"IDT_GDT.h"VOID DriverUnload(PDRIVER_OBJECT objDriver)    {    //避免编译器报为引用参数的警告    UNREFERENCED_PARAMETER(objDriver);    DbgPrint("My Driver is unloading ...");    }NTSTATUS DriverEntry(    PDRIVER_OBJECT objDriver,    PUNICODE_STRING strRegPath    )    {    UNREFERENCED_PARAMETER(strRegPath);    objDriver->DriverUnload = DriverUnload;    DbgPrint("My first Driver ");    KdBreakPoint();    IDT_INFO stcIdtInfo = {0};    PIDT pIdt =NULL;    _asm sidt stcIdtInfo;#define MAKE_LONG(Low,High) ((UINT32) (((UINT16)(Low))|((UINT32)((UINT16)(High)))<<16) )    pIdt = (PIDT)MAKE_LONG(        stcIdtInfo.uLowIdtBase,stcIdtInfo.uHighIdBase);    for(UINT32 uCount = 0;uCount<=256;uCount++)        {        //需要对16任务门进行特殊处理,具体参见软件调试275页        //简单流程:TSS段选择子,GDT表,TSS段分析        PIDT  pIndex = &pIdt[uCount];        UINT32 uAddr = MAKE_LONG(pIndex->uOffsetLow,pIndex->uOffsetHigh);        DbgPrint("Interrput %d: ISR 0x%08X\n",uCount,uAddr);        }    return STATUS_SUCCESS;    }

                                             
0 0