Не могу получить адрес прерывания N9

Тема в разделе "WASM.WIN32", создана пользователем ANDLL, 14 апр 2006.

  1. ANDLL

    ANDLL New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2006
    Сообщения:
    24
    Адрес:
    Russia
    Я пишу:
    Код (Text):
    1.        
    2. struct IDT_REGISTER
    3. {
    4.     unsigned short size;
    5.     unsigned int* address;
    6. };
    7.  
    8. /*
    9. ...
    10. */
    11.  
    12.         IDT_REGISTER IDT_ADDR;
    13.         IDT_ADDR.address=0;
    14.         IDT_ADDR.size=0;
    15.         long ptr;
    16.         __asm
    17.         {
    18.             sidt fword ptr IDT_ADDR
    19.         }
    20.         DbgPrint("IDT_ADDR:%x, size:%i",IDT_ADDR.address,(long)IDT_ADDR.size);
    21.         int i9;
    22.         __try
    23.         {
    24.             i9=IDT_ADDR.address[9];
    25.             DbgPrint("I9:%i",i9);
    26.         }
    27.         __except(EXCEPTION_EXECUTE_HANDLER)
    28.         {
    29.             DbgPrint("Exception!");
    30.         };
    31.  


    Вот, что выводить DbgView:

    IDT_ADDR:8003, size:2047

    Exception!

    Я конечно понимаю, что вопрос ужасно глупый, но почему?? Ведь по идеи, загружаем IDT в переменную, далее просто высовываем 9 элемент массива... А оно не пашет :dntknw:
     
  2. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    ANDLL

    IDT_REGISTER IDT_ADDR;



    Как это будет выглядеть?



    кодом:

    IDT_ADDR.address ты обращаешься к маленкой переменной! Так как В стеке создается только sizeof(IDT_REGISTER) байт!



    Я бы сказал IDT_REGISTER IDT_ADDR[n_прерываний];



    зы:

    может глуплю?
     
  3. ANDLL

    ANDLL New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2006
    Сообщения:
    24
    Адрес:
    Russia
    Если б я знал :dntknw:



    Ну это кажеться как-то не логично. Как я понимаю, sidt загружает содержимое шестибайтового регистра IDT в переменную в памяти. Соответственно переменная то же должна иметь размер шесть байт. А в твоем случае получается больше... Хотя бы эти соображения правильные?
     
  4. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    поправил выше
     
  5. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    Элементами IDT являтся 8-байтовые дескрипторы, а не указатели как в реальном режиме.

    Соответственно

    unsigned int* address

    надо заменить на

    struct ID * address
     
  6. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Посмотри, может тебе это поможет?



    ; Загрузка в idt

    ; Получить текущий idt_base

    sidt fword ptr idt_descr

    mov ebx,dword ptr idt_descr.lin_addr

    ; Получить начало описателя #1 - debug

    add ebx,8



    ; Установить ловушку #1, сохранив старую



    mov eax,dword ptr trap

    xchg [ebx],eax

    mov dword ptr old_trap_01,eax

    mov eax,dword ptr trap+4

    xchg [ebx+4],eax

    mov dword ptr old_trap_01+4,eax



    Взято из Интернет.
     
  7. ANDLL

    ANDLL New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2006
    Сообщения:
    24
    Адрес:
    Russia
    crypto, спасибо, но я этот код видел... И делает он аналогичную операцию....

    2green:Проблема не в этом. Какая разница, восемь или четыре байта занимает каждый элемент в таблице, если в данном случае получается, что IDT_ADDR.address это _неправильный_ указатель.

    Или не так?(кстати, на слово ID компилятор ругается)
     
  8. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    ANDLL

    адрес неверен вероятно из-за того что у тебя лимит выравнивания членов структуры 4 байт или выше.



    Вот так надо

    #pragma pack(push, 1)

    struct IDT_REGISTER

    {

    unsigned short size;

    unsigned int* address;

    };

    #pragma pack(pop)
     
  9. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    ANDLL



    Я под struct ID имел ввиду структуру дескриптора прерывания. :derisive:



    По-моему так её определить надо (хотя лучше сам глянь в документацию):

    struct ID

    {

    short selector;

    DWORD offset; // адрес т.е.

    short flags;

    };

    Опять же, с выравниванием 1.
     
  10. ANDLL

    ANDLL New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2006
    Сообщения:
    24
    Адрес:
    Russia
    2green:Спасибо, теперь по крайней мере нет exception'а, и адрес вполне рельный... О дальнейших изысканиях напишу :)
     
  11. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia