Помогите пожалуйста - как найти вектор прерывания соответствующий irq 1 (клавиатура). В и-нете нашел два метода: 1. Через APIC Код (Text): unsigned char *pIoRegSel; unsigned char *pIoWin; unsigned char ch; PHYSICAL_ADDRESS phys; PVOID pAddr; phys.u.LowPart = 0xFEC00000; pAddr = MmMapIoSpace(phys, 0x14, MmNonCached); pIoWin = (unsigned char *)(pAddr) + 0x10; *pIoRegSel = 0x12; 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?
n0name Опс, copy/paste подвел. Вот полный код: Код (Text): int search_irq1() { unsigned char *pIoRegSel; unsigned char *pIoWin; unsigned char ch; PHYSICAL_ADDRESS phys; PVOID pAddr; phys.u.LowPart = 0xFEC00000; pAddr = MmMapIoSpace(phys, 0x14, MmNonCached); if (pAddr == NULL) return 0; pIoRegSel = (unsigned char *)pAddr; pIoWin = (unsigned char *)(pAddr) + 0x10; *pIoRegSel = 0x12; // irq1 ch = *pIoWin; MmUnmapIoSpace(pAddr, 0x14); return (int)ch; }