ВУЗ:
Составители:
54
операции на уровнях IRQL выше PASSIVE_LEVEL не могут прерываться
другими операциями, работающими на том же или более низком уровне.
Типичный код ISR выглядит следующим образом:
BOOLEAN OnInterrupt (PKINTERRUPT InterruptObject.
PDEVICE_EXTENSION pdx)
{
if <устройство не выдавало прерывания>
return FALSE;
…
}
Первый аргумент ISR содержит адрес объекта прерывания, созданного
функцией IoConnectInterrupt.
Второй аргумент указывает на контекст. Чаще всего, это адрес расширения
устройства.
Обработчик прерываний в основном отвечает за чтение и запись данных.
При этом в большинстве случаев в его обязанности входит планирование
отложенного вызова процедуры (DPC – Defered Procedure Call). Помимо
основного назначения DPC – быстрее освободить
механизм прерываний – в DPC
можно выполнять действия, которые не могут быть выполнены на уровне
обработчика (DIRQL), например, вызвать IoCompleneRequest.
Для этого в обработчике может присутствовать строка типа:
IoRequestDpc(pdx->DeviceObject, NULL, pdx);
3.13 Функция DPC
Функция DpcForIsr, запрашиваемая обработчиком прерывания, получает
управление на уровне DISPATCH_LEVEL. Обычно она должна обработать IRP,
ставший причиной последнего прерывания. Для
этого приходится вызывать
функцию IoCompleteRequest для завершения IRP, а также функцию
StartNextPacket для исключения следующего IRP из очереди устройств и
передачи его функции StartIo.
Например, так:
VOID DpcForIsr(PKDPC Dpc, PDEVICE_OBJECT fdo, PIRP junk,
операции на уровнях IRQL выше PASSIVE_LEVEL не могут прерываться
другими операциями, работающими на том же или более низком уровне.
Типичный код ISR выглядит следующим образом:
BOOLEAN OnInterrupt (PKINTERRUPT InterruptObject.
PDEVICE_EXTENSION pdx)
{
if <устройство не выдавало прерывания>
return FALSE;
…
}
Первый аргумент ISR содержит адрес объекта прерывания, созданного
функцией IoConnectInterrupt.
Второй аргумент указывает на контекст. Чаще всего, это адрес расширения
устройства.
Обработчик прерываний в основном отвечает за чтение и запись данных.
При этом в большинстве случаев в его обязанности входит планирование
отложенного вызова процедуры (DPC – Defered Procedure Call). Помимо
основного назначения DPC – быстрее освободить механизм прерываний – в DPC
можно выполнять действия, которые не могут быть выполнены на уровне
обработчика (DIRQL), например, вызвать IoCompleneRequest.
Для этого в обработчике может присутствовать строка типа:
IoRequestDpc(pdx->DeviceObject, NULL, pdx);
3.13 Функция DPC
Функция DpcForIsr, запрашиваемая обработчиком прерывания, получает
управление на уровне DISPATCH_LEVEL. Обычно она должна обработать IRP,
ставший причиной последнего прерывания. Для этого приходится вызывать
функцию IoCompleteRequest для завершения IRP, а также функцию
StartNextPacket для исключения следующего IRP из очереди устройств и
передачи его функции StartIo.
Например, так:
VOID DpcForIsr(PKDPC Dpc, PDEVICE_OBJECT fdo, PIRP junk,
54
Страницы
- « первая
- ‹ предыдущая
- …
- 52
- 53
- 54
- 55
- 56
- …
- следующая ›
- последняя »
