Надо перехватить аппаратное прерывание от ISA устройства (не PnP). После прочтения книги Солдатова по разработке драйверов получился почти рабочий пример (опыты провожу на затычке от LPT порта, IRQ 7, ОС - WinXP SP2). Проблема заключается в том, что после перехвата прерывания (через ioConnectInterrupt) обработчик вызывается только когда IRQ 7 назначено "родному" драйверу лпт порта винды. Пробовал назначить себе IRQ через ioAssignResources, ioReportResourcesforDetection, ioReportDetectedDevice (все вызывал из DriverEntry) менеджер устройств показывает, что прерывание начначено моему устройству, но обработчик не вызывается . Что я делаю не так? Очень помог бы пример на любом языке. Для лпт порта нужна специальная настройка? На нормальном ISA устройстве это должно сработать?
Для пояснения привожу кусок кода из DriverEntry: Код (Text): Irq = 7; kVector = HalGetInterruptVector(Isa, 0, Irq, Irq, &kIrql, &kAffinity); status = IoConnectInterrupt ( &pIntObj, // Здесь будет создан Interrupt Object Isr, // Наша функция ISR NULL, // Этот указатель ISR функция будет // получать при вызове (контекстный указатель) NULL, // Не будем использовать spin-блокировку для // безопасного доступа к совместно используемым // данным kVector, // транслированное значение прерывания kIrql, // DIRQL kIrql, // DIRQL Latched, // Прерывание по перепаду TRUE, // Совместно используемое (Shared) прерывание kAffinity, // Поцессоров в мультипроцессорной системе FALSE ); // Не сохранять значения регистров сопроцессора Что добавить, чтобы прерывание обрабатывалось без его назначения стандартному драйверу LPT? Или надо идти по пути обработки запроса IRP_MN_START_DEVICE и прописывать IRQ в INF-файле?