Как зарезервировать номер прерывания в Windows ?

Тема в разделе "WASM.NT.KERNEL", создана пользователем Charlief, 9 авг 2011.

  1. Charlief

    Charlief New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2010
    Сообщения:
    129
    Подскажите есть ли программный способ зарезервировать в ядре слот в IDT ? Может ключик в реестре какой есть ?
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Может быть, IoConnectInterrupt() подойдёт?
     
  3. Charlief

    Charlief New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2010
    Сообщения:
    129
    Чтобы вызвать эту функцию уже нужно знать номер прерывания - входной параметр __in ULONG Vector, этот вектор можно найти из структуры IO_STACK_LOCATION: Parameters for IRP_MN_START_DEVICE StartDevice: PCM_RESOURCE_LIST --> CM_FULL_RESOURCE_DESCRIPTOR: CM_PARTIAL_RESOURCE_LIST: CM_PARTIAL_RESOURCE_DESCRIPTOR: Interrupt.Vector

    IO_STACK_LOCATION можно получить вызвав IoGetCurrentIrpStackLocation или может быть из обработчика IRP_MJ_PNP - IRP_MN_START_DEVICE из входного параметра IRP.Tail.Overlay.CurrentStackLocation(PIO_STACK_LOCATION)

    В книге Уолтера Они написано что PnP Manager после вызова AddDevice посылает запрос IRP_MN_QUERY_RESOURCE_REQUIREMENTS драйверу шины к которой подключено устройство, этот IRP просит у драйвера шины описать требования устройства к линии запроса прерывания, адресам портов ввода/вывода и системным каналам DMA. Драйвер шины строит список требования к ресурсам и возвращает его. Если выделение ресурсов возможно PnP Manager посылает драйверу пакет IRP_MJ_PNP с дополнительным кодом IRP_MN_START_DEVICE.

    Это вся информация что у меня есть. Я ещё не читал про INF файлы, там при установке наследного драйвера наверное можно указать номер прерывания, если так можно тогда появляется вопрос: как получить программно список занятых или свободных номеров прерываний - перебором содержимого IDT ?

    И где почитать о установке наследных драйверов с помощью INF файлов ?
     
  4. Charlief

    Charlief New Member

    Публикаций:
    0
    Регистрация:
    17 авг 2010
    Сообщения:
    129
    Может и подойдёт, но как быть уверенным что драйвер какой-нибудь шины при подключении нового устройства не отдаст ему номер моего занятого прерывания ? С таким же успехом можно напрямую прописать в свободный дескриптор IDT свой обработчик, будет быстрее работать.
     
  5. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Для этого и используется ISR table, так как на одном векторе прерывания может быть несколько обработчиков ...
    Постмотрите реализацию:
    IoConnectInterrupt
    KeConnectInterrupt
    KiInterruptDispatch

    То и есть в ISR table это таблица объектов, в каждом из них есть список (LIST_ENTRY) обработчиков, так что не сколько обрабочиков без проблем.
     
  6. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    x64
    А можно указать произвольный номер прерывания, к примеру 0xFF, и делать вызов через int ff в коде ?
     
  7. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Обычно, ресурсы система сама назначает устройствам, т.е. драйверу железки достаточно получить свою конфигурацию через PnP-запросы и вызвать уже IoConnectInterrupt() и что там ещё полагается. Если тебе нужно назначить себе прерывание в обход системного механизма, то, думаю, стоит, как минимум, почитать про таблицу прерываний в документации от Intel и WDK, а также в соответствующих учебниках. Подключаться к произвольным прерываниям лично я никогда не пробовал, - вот и попробуешь, много времени не займёт.