как найти IDTвектор irq1

Тема в разделе "WASM.NT.KERNEL", создана пользователем katrus, 4 июл 2007.

  1. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    Помогите пожалуйста - как найти вектор прерывания соответствующий irq 1 (клавиатура). В и-нете нашел два метода:

    1. Через APIC
    Код (Text):
    1. unsigned char *pIoRegSel;
    2. unsigned char *pIoWin;
    3. unsigned char ch;
    4. PHYSICAL_ADDRESS phys;
    5. PVOID pAddr;
    6. phys.u.LowPart = 0xFEC00000;
    7. pAddr = MmMapIoSpace(phys, 0x14, MmNonCached);
    8. pIoWin = (unsigned char *)(pAddr) + 0x10;
    9. *pIoRegSel = 0x12;
    10. ch = *pIoWin; // irq1 vector
    На одном компе все время возвращает 0хFF, на другом падает в BSоD, на VmWare то же BSоD. В каждом случае присутствует ps/2 клавиатура.

    2. Поиск соответствующего драйвера. Нашел на http://www.rootkit.com/newsread.php?newsid=561. К сожалению, статья - плохой (машинный) перевод с китайского. Вкратце, идея проста - начать с драйвера верхнего уровня клавиатуры и итеративно спустится от него к \Driver\i8042prt. Далее непонятно - как то получают объект KINTERRUPT и патчат там функцию. Но как получить этот KINTERRUPT?
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    где инициализируется pIoRegSel?
     
  3. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    n0name
    Опс, copy/paste подвел. Вот полный код:
    Код (Text):
    1. int search_irq1()
    2. {
    3.     unsigned char *pIoRegSel;
    4.     unsigned char *pIoWin;
    5.     unsigned char ch;
    6.  
    7.     PHYSICAL_ADDRESS      phys;
    8.     PVOID                 pAddr;
    9.  
    10.     phys.u.LowPart = 0xFEC00000;
    11.     pAddr = MmMapIoSpace(phys, 0x14, MmNonCached);
    12.     if (pAddr == NULL)
    13.         return 0;
    14.  
    15.     pIoRegSel = (unsigned char *)pAddr;
    16.     pIoWin = (unsigned char *)(pAddr) + 0x10;
    17.  
    18.     *pIoRegSel = 0x12;      // irq1
    19.     ch = *pIoWin;
    20.  
    21.     MmUnmapIoSpace(pAddr, 0x14);
    22.  
    23.     return (int)ch;
    24. }
     
  4. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    katrus
    ну код вроде верный
    да, HighPart = 0?
     
  5. katrus

    katrus New Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    612
    rei3er
    Хм, в самое яблочко! Спасибо!
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Я бы лучше сразу в QuadPart записал, чтобы исключить такие "недопонятки"...