Re[2]: прерывания под Windows или чтение из регистра LPT
От: Аноним  
Дата: 22.04.05 06:29
Оценка:
S> Под NT — писать parallel port class driver, пример есть в DDK, под 9х — в принципе, и так (in/out) сойдет. По крайней мере, в некоторых версиях 95 работало.

Да ну!
Обычный Legasy драйвер сойдет , многое зависит от того какой контроллер прерываний используется APIC или PIC.
Если PIC то понятно какое софтверное прерывание будет соответствовать IRQ принтера,
если APIC все несколько сложнее.
Для PIC контроллера , соответствие SOftware Interrupt и IRQ расчитываются следующим образом:
SoftInt = IrqN + 0x30h — для NT подобных операционок , к примеру прерывание таймера IRQ0
SoftInt = 0 + 0x30h = > int 0x30h в таблице idt соответственно находится адресс обработчика прерывания таймеры по вектору 0x30.
Для машин с hypertrading или просто многопроццесорных машин обладающих APIC контроллерами все сложнее те могут индивидуальным IQR присвоить индивидуальные int x .
Соответственно расчитаем int для LPT (для PIC контроллера):
для LPT1 — IRQ7
int 0x37
lkz ДЗЕ2 — IRQ5
int 0x35
Подключить свой обработчик к прерыванию можно с помощью системного вызова
IoConnectInterrupt или както так, точно непомню, самостоятельно корректировать IDT
не рекомендую можно такой херни накрутить.

status = IoConnectInterrupt(&DeviceExtension->InterruptObject, // InterruptObject
InterruptIsr, // ServiceRoutine
DeviceObject, // ServiceContext
NULL, // SpinLock
MappedVector, // Vector
Irql, // Irql
Irql, // SynchronizeIrql
Latched, // InterruptMode
FALSE, // ShareVector
DeviceExtension->Affinity, // ProcessorEnableMask
FALSE);
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.