Подскажите есть ли программный способ зарезервировать в ядре слот в IDT ? Может ключик в реестре какой есть ?
Чтобы вызвать эту функцию уже нужно знать номер прерывания - входной параметр __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 файлов ?
Может и подойдёт, но как быть уверенным что драйвер какой-нибудь шины при подключении нового устройства не отдаст ему номер моего занятого прерывания ? С таким же успехом можно напрямую прописать в свободный дескриптор IDT свой обработчик, будет быстрее работать.
Для этого и используется ISR table, так как на одном векторе прерывания может быть несколько обработчиков ... Постмотрите реализацию: IoConnectInterrupt KeConnectInterrupt KiInterruptDispatch То и есть в ISR table это таблица объектов, в каждом из них есть список (LIST_ENTRY) обработчиков, так что не сколько обрабочиков без проблем.
x64 А можно указать произвольный номер прерывания, к примеру 0xFF, и делать вызов через int ff в коде ?
Обычно, ресурсы система сама назначает устройствам, т.е. драйверу железки достаточно получить свою конфигурацию через PnP-запросы и вызвать уже IoConnectInterrupt() и что там ещё полагается. Если тебе нужно назначить себе прерывание в обход системного механизма, то, думаю, стоит, как минимум, почитать про таблицу прерываний в документации от Intel и WDK, а также в соответствующих учебниках. Подключаться к произвольным прерываниям лично я никогда не пробовал, - вот и попробуешь, много времени не займёт.