Перехват прерывания ISA (неPnP) устройства

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

  1. Mantrid

    Mantrid New Member

    Публикаций:
    0
    Регистрация:
    15 май 2006
    Сообщения:
    15
    Надо перехватить аппаратное прерывание от ISA устройства (не PnP). После прочтения книги Солдатова по разработке драйверов получился почти рабочий пример (опыты провожу на затычке от LPT порта, IRQ 7, ОС - WinXP SP2).

    Проблема заключается в том, что после перехвата прерывания (через ioConnectInterrupt) обработчик вызывается только когда IRQ 7 назначено "родному" драйверу лпт порта винды. Пробовал назначить себе IRQ через ioAssignResources, ioReportResourcesforDetection, ioReportDetectedDevice (все вызывал из DriverEntry) менеджер устройств показывает, что прерывание начначено моему устройству, но обработчик не вызывается :dntknw: .

    Что я делаю не так? Очень помог бы пример на любом языке.

    Для лпт порта нужна специальная настройка?

    На нормальном ISA устройстве это должно сработать?
     
  2. Mantrid

    Mantrid New Member

    Публикаций:
    0
    Регистрация:
    15 май 2006
    Сообщения:
    15
    Для пояснения привожу кусок кода из DriverEntry:
    Код (Text):
    1.  
    2. Irq = 7;
    3. kVector = HalGetInterruptVector(Isa, 0, Irq, Irq, &kIrql, &kAffinity);
    4. status = IoConnectInterrupt (
    5.     &pIntObj,  // Здесь будет создан Interrupt Object
    6.     Isr,       // Наша функция ISR
    7.     NULL,      // Этот указатель ISR функция будет
    8.           // получать при вызове (контекстный указатель)
    9.     NULL, // Не будем использовать spin-блокировку для
    10.           // безопасного доступа к совместно используемым
    11.           // данным
    12.     kVector, // транслированное значение прерывания
    13.     kIrql,   // DIRQL
    14.     kIrql,   // DIRQL
    15.     Latched, // Прерывание по перепаду
    16.     TRUE,   // Совместно используемое (Shared) прерывание
    17.     kAffinity, // Поцессоров в мультипроцессорной системе
    18.     FALSE );   // Не сохранять значения регистров сопроцессора
    19.  


    Что добавить, чтобы прерывание обрабатывалось без его назначения стандартному драйверу LPT?

    Или надо идти по пути обработки запроса IRP_MN_START_DEVICE и прописывать IRQ в INF-файле?