IDT 2E

Тема в разделе "WASM.BEGINNERS", создана пользователем IceFire, 8 июн 2009.

  1. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Уважаемые, подскажите. Хочу сделать код, который бы читал поле Offset из дескриптора IDE для прерывания 2E.

    Стараюсь писать по док-ции Intel: "Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 3A: System Programming Guide, Part 1"

    Вот получилось что:

    Код (Text):
    1. typedef struct _Idt
    2. {
    3.     USHORT Size;
    4.     ULONG  Base;
    5. } TIdt;
    6.  
    7. typedef struct _IDT_DESCRIPTOR {
    8.     USHORT LowPartOffset;  
    9.     USHORT Selector;      
    10.     USHORT Flags;          
    11.     USHORT HighPartOffset;
    12. } IDT_DESCRIPTOR, *PIDT_DESCRIPTOR;
    13.  
    14. ULONG       CR0Reg;  
    15. ULONG       Trap2eOffset=0;  
    16.  
    17. void ClearInt()
    18. {
    19. __asm
    20.     {
    21.         cli                    
    22.         mov eax, cr0
    23.         mov CR0Reg,eax
    24.         and eax,0xFFFEFFFF      
    25.         mov cr0, eax
    26.     }
    27. }
    28.  
    29. void SetInt()
    30. {
    31. __asm
    32.     {
    33.         mov eax, CR0Reg    
    34.         mov cr0, eax            
    35.         sti                    
    36.     }
    37. }
    38.  
    39. VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
    40. {
    41.     DPRINT("Driver unloaded");
    42.     return;
    43. }
    44.  
    45. VOID GetIDT()
    46. {
    47.     TIdt Idt;
    48.     PIDT_DESCRIPTOR Desc2e;
    49.    
    50.     ClearInt();
    51.  
    52.     __asm
    53.     {
    54.         sidt [Idt]
    55.     }
    56.  
    57.     SetInt();    
    58.  
    59.     DPRINT("Idt.Base: %#0x",Idt.Base);
    60.     DPRINT("Idt.Limit: %#0x",Idt.Size);
    61.    
    62.     Desc2e=(PIDT_DESCRIPTOR)(Idt.Base+(0x2e-1)*8);
    63.     Trap2eOffset=(USHORT)Desc2e->HighPartOffset;  //!!!
    64.     Trap2eOffset=Trap2eOffset<<16;
    65.     Trap2eOffset+=Desc2e->LowPartOffset;
    66.     DPRINT("2E Int routine offset: %x", Trap2eOffset);
    67. }
    На строке, помеченной "//!!!", система падает (ребут). Подскажите, в чем моя ошибка, я хочу до конца разобраться.

    Инфа о системе: WXP SP3 on Microsoft Virtual PC 2007.
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    #pragma pack(push,2)
     
  3. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Great

    А что это значит?
     
  4. TSS

    TSS New Member

    Публикаций:
    0
    Регистрация:
    13 апр 2009
    Сообщения:
    494
    Выравнивание, кстати гугл не умер, он работает.
     
  5. redcat

    redcat New Member

    Публикаций:
    0
    Регистрация:
    20 ноя 2007
    Сообщения:
    62
    Это значит, что твоя струтура имеет размер 8 байт
    Код (Text):
    1. typedef struct _Idt
    2. {
    3.     USHORT Size; // После этого идут два байта заполнения для оптимизации
    4.     ULONG  Base;
    5. } TIdt;
    А вот так она станет размером 6 байт , т.е. упакуется:)
    Код (Text):
    1. #pragma pack(push,2)
    2. typedef struct _Idt
    3. {
    4.     USHORT Size; // После этого идут два байта
    5.     ULONG  Base;
    6. } TIdt;
     
  6. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Спасибо, все работает.
     
  7. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Кстати, а не накосячил-ли я вот с этой строкой:

    Код (Text):
    1. Desc2e=(PIDT_DESCRIPTOR)(Idt.Base+(0x2e-1)*8);
    Потому как видел в дикой природе что-то вроде:

    Код (Text):
    1. Desc2e=(PIDT_DESCRIPTOR)Idt.Base+0x2e;
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    монописуально
     
  9. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    В первом случае Desc2e: 0xf7798668,
    а во втором - Desc2e: 0xf7798670

    "-1" там нужна или нет?
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Не понял зачем -1 ?
    Конечно, не нужна. Индексы в идт с нуля и векторы с нуля начинаются
     
  11. IceFire

    IceFire New Member

    Публикаций:
    0
    Регистрация:
    30 окт 2006
    Сообщения:
    244
    Great

    В руководстве Intel (см. выше) на схеме Figure 5-1 индексы идут с нуля, а векторы - с 1. Поэтому и спросил.

    Спасибо за ответ, сделаю без "-1".