Организация ввода-вывода. Драйверы WDM. Рощин А.В. - 54 стр.

UptoLike

Составители: 

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