Программирование драйверов Windows


Интервалы ожидания для отдельного потока - часть 7


Существует маленький временной зазор между тем, как функция MyIoTimerRoutine убедилась, что счетчик активен, и моментом, когда произошло его уменьшение на единицу. Если предположить, что в этот момент "вклинилась" процедура OnInterrupt и установила значение счетчика в -1, то функция MyIoTimerRoutine, получив управление, сделает значение счетчика равным -2. Код, приведенный выше, учитывает эту возможность, сравнивая Remaining c нулем.

Зарегистрированная соответствующим образом процедура DpcForIsr может выглядеть следующим образом:

VOID MyDpcForIsr( IN PKDPC pDpcObj, IN PDEVICE_OBJECT pDeviceObj, IN PIRP pIrp, IN PVOID pContext ) { . . . // Инициируем поступление IRP из внутренней очереди в // процедуру StartIO (): TodoStartNextPacket(&pDevExtension-&#62dqReadWrite, pDevObject);

// Даем возможность отработать процедурам завершения всех // вышестоящих драйверов, если они есть: IoCompleteRequest(pIrp, IO_NO_INCREMENT); . . . }




Начало  Назад  Вперед