День добрый! В очередной раз огорчившись тем как winlirc отваливается при запуске высокоприоритетных процессов вроде видеоплейера я решил написать дровинку, которая будет собирать статистику с СОМ порта более оперативно, чем WaitForCommEvent. Приемник ИК подсоединен к DCD пину COM порта, соотвественно надо перехватить прерывание от порта и проанализировать состояние пина - сложить в массив временную метку и состояние линии, дернуть евент для юзермода - типа пусть вычитывает. Проблема возникла с подсоединением прерывания, вот такой код проваливается:
KIRQL kIrql;
KAFFINITY kAffinity;
ULONG kVector = HalGetInterruptVector(PCIBus, 0, COM_PORT_IRQ, COM_PORT_IRQ,
&kIrql, &kAffinity);
status = IoConnectInterrupt (
&dx->pIntObj,
Isr,
dx,
NULL,
kVector,
kIrql, // DIRQL
kIrql, // DIRQL
LevelSensitive,
TRUE,
kAffinity,
FALSE );
Irq=4 не аттачится, функция возвращает STATUS_INVALID_PARAMETER. Вычитал про регистрацию ресурсов В\В пробовал так:
CM_RESOURCE_LIST rlist;
rlist.Count = 1;
rlist.List[1].InterfaceType = Isa;
rlist.List[1].BusNumber = -1;
rlist.List[1].PartialResourceList.Version = 1;
rlist.List[1].PartialResourceList.Revision = 1;
rlist.List[1].PartialResourceList.Count = 1;
rlist.List[1].PartialResourceList.PartialDescriptors[1].Type = CmResourceTypeInterrupt;
rlist.List[1].PartialResourceList.PartialDescriptors[1].ShareDisposition = CmResourceShareShared;
rlist.List[1].PartialResourceList.PartialDescriptors[1].Flags = CM_RESOURCE_INTERRUPT_LEVEL_SENSITIVE;
rlist.List[1].PartialResourceList.PartialDescriptors[1].u.Interrupt.Level = kIrql;
rlist.List[1].PartialResourceList.PartialDescriptors[1].u.Interrupt.Vector= kVector;
rlist.List[1].PartialResourceList.PartialDescriptors[1].u.Interrupt.Affinity = kAffinity;
BOOLEAN bConflict;
status = IoReportResourceForDetection(
DriverObject,
&rlist,
sizeof(rlist),
NULL,
NULL,
0,
&bConflict
);
Конфликтов не обнаруживается, но после этого тоже самое. Попытка зарегистрировать девайс проваливается:
status = IoCreateDevice(DriverObject,
sizeof(EXAMPLE_DEVICE_EXTENSION),
&devName, // ìîæåò áûòü è NULL
FILE_DEVICE_UNKNOWN,
0,
FALSE, // áåç ýêñêëþçèâíîãî äîñòóïà
&fdo);
if(!NT_SUCCESS(status)) return status;
status = IoReportDetectedDevice( //FAIL
DriverObject,
Isa,
-1,
-1,
&rlist,
NULL,
TRUE,
&fdo
);
возвращается код STATUS_NO_SUCH_DEVICE. Не знаю что делать что не так. Помогите пожалуйста! OS-WinXP SP2