Нужно сделать обработчик прерывания. Номер прерывания известен. Есть функция IOConnectInterrupt, глядя на нее хочется воспользоваться напрямую IDT. Что содержится в параметре Vector? (в литературе встречается вызов HalGetInterruptVector(...), зачем?) Что содержится в параметре IRQL? (это просто заданный IRQL для кода обработчика прерывания?) Что содержится в параметре SynchronizeIRQL? В параметре InterruptMode можно передать два значения: Latched и LevelSensitive, чем они отличаются? Если в системе уже есть обработчик прерывания он может не допустить дальнейшую обработку прерывания другими процедурами?
да темный вопрос для любой ос ладно, хотя бы прототипы привел: bash-2.05b$ grep -i -A 11 -B 3 -e ioconnect -e halgetint * winddk.h-NTOSAPI winddk.h-NTSTATUS winddk.h-DDKAPI winddk.h:IoConnectInterrupt( winddk.h- OUT PKINTERRUPT *InterruptObject, winddk.h- IN PKSERVICE_ROUTINE ServiceRoutine, winddk.h- IN PVOID ServiceContext, winddk.h- IN PKSPIN_LOCK SpinLock OPTIONAL, winddk.h- IN ULONG Vector, winddk.h- IN KIRQL Irql, winddk.h- IN KIRQL SynchronizeIrql, winddk.h- IN KINTERRUPT_MODE InterruptMode, winddk.h- IN BOOLEAN ShareVector, winddk.h- IN KAFFINITY ProcessorEnableMask, winddk.h- IN BOOLEAN FloatingSave); -- winnt4.h-NTOSAPI winnt4.h-ULONG winnt4.h-DDKAPI winnt4.h:HalGetInterruptVector( winnt4.h- IN INTERFACE_TYPE InterfaceType, winnt4.h- IN ULONG BusNumber, winnt4.h- IN ULONG BusInterruptLevel, winnt4.h- IN ULONG BusInterruptVector, winnt4.h- OUT PKIRQL Irql, winnt4.h- OUT PKAFFINITY Affinity); Да не так уж и много параметров для простоты посмотри ddk или reactos InterruptMode тож самое наверно что в биосе и больше к железу относится Остальное мда , можно пофантазировать
netex О каких прерываниях речь? Ты хочешь сделать шлюз из юзерленда в ядро (тогда проще IDT), или обработчик аппаратного прерывания (тогда IoConnectInterrupt и читать MSDN о ISR)
S_T_A_S_ есть физическое устройство, оно выдает физическое прерывание через контроллер прерываний, номер прерывания известен. Нужно лишь сделать процедуру обработки этого прерывания. Во всех исходниках используют ConnectInterrupt в связке с HalGetInterruptVector. Я понятия не имею про номер шины (Bus number) и загадочных векторах (в вызове IOConnectInterrupt). Нужно просто сделать процедуру для прерывания, типа как в DOS'е подменить адреса в таблице прерываний (поставить свой обработчик, а затем вызывать стандартный). Это можно сделать через IDT, но хочется использовать штатные средства ОС.
Почему бы методом тыка не подобрать параметры типа "шины"? (Раз уж хочется все сделать средствами DDK). У меня, например чтобы приконнектить прерывание 7 лпт-порта указанные функции вызываются с такими параметрами: KIRQL kIrql; KAFFINITY kAffinity; ULONG kVector = HalGetInterruptVector(Isa, 0, pDevExt->Irq/*=7*/, 0, &kIrql, &kAffinity); status = IoConnectInterrupt( &pDevExt->pIntObj, // the Interrupt object Isr, // our ISR pDevExt, // Service Context NULL, // no spin lock kVector, // vector kIrql, // DIRQL kIrql, // DIRQL Latched, // Latched or LevelSensitive TRUE, // Shared? kAffinity, // processors in an MP set FALSE ); // save FP registers? А если у тебя устройстрво PCI, то оно скорее всего PnP - тогда вообще все ресурсы определяются автоматически...
Почему бы методом тыка не подобрать параметры типа "шины"? "Тыкать" удел делитантов... Твой код списан из: The Windows 2000 Device Driver Book, A Guide for Programmers, Second Edition. Art Baker Jerry Lozano, слово в слово. Нужно понимание процесса. Устройство самодельное, не PnP.
Да, это именно оттуда Я бы конечно поспорил насчет "делитанта"... В общем, все зависит от того, какие цели преследуются