Добрый день. Столкнулся с проблемой при обработке прерывания от PCI target устройства. Устройство на альтеровской корке. Выставляет прерывание по записи в один из своих регистров (в Bar0), снимается аналогично. Проблема где-то в драйвере. Распишу по порядку. 1.В StartDevice устанавливаю обработчик (IoConnectInterrupt....) 2. В обработчике кидаю мессагу (DebugPrint), что вызвался ISR, потом лезу в девайс, проверяю от него ли прерывание. Если от него, то сбрасываю это прерывание, иначе выхожу с FALSE. Причем, если из регистра вычитывается 0xFFFFFFFF, то считаем, что power down и выхожу из обработчика с FALSE. 3. Если прерывание было от моего устройства, то назначаю отложенную процедуру (KeInsertQueueDpc...) 4. В DPCforISR просто кидаю мессагу, что вызван DPCforISR.
Вроде как все работает - при установке прерывания я вижу, что мессаги летят и из ISR и из DPCforISR. Последующие установки прерывания так же корректно отрабатываются.
Проблема возникает, когда через диспетчер устройств пытаюсь переустановить драйвер. Даже если переустанавливаю на тот же самый sys. Последнее, что я вижу - как идет копирование в system32. Далее перезагрузка компа.
Если же после старта компьютера не генерировать прерываний, а просто пару обменов с платой сделать (или не делать ничего вообще), то переустановка драйвера проходит успешно.
У меня есть подозрение, что я выполняю не все процедуры по обработке прерывания.
Поделитесь, пожалуйста идеями по этому поводу.
|