Функция WdfInterruptAcquireLock (wdfinterrupt.h)
[Применимо к KMDF и UMDF]
Метод WdfInterruptAcquireLock начинает последовательность кода, которая выполняется на уровне запроса прерывания устройства (DIRQL), удерживая блокировку спина объекта прерывания.
Для объектов прерывания пассивного уровня метод начинает последовательность кода, которая выполняется на пассивном уровне, удерживая пассивную блокировку объекта прерывания.
Синтаксис
void WdfInterruptAcquireLock(
[in] WDFINTERRUPT Interrupt
);
Параметры
[in] Interrupt
Дескриптор объекта прерывания платформы.
Комментарии
Ошибка проверка возникает, если драйвер предоставляет недопустимый дескриптор объекта.
Когда драйвер вызывает WdfInterruptAcquireLock для объекта прерывания DIRQL, система поднимает IRQL процессора в DIRQL устройства и получает спин-блокировку, указанную драйвером в структуре WDF_INTERRUPT_CONFIG объекта прерывания. В результате функции обратного вызова EvtInterruptIsr и EvtInterruptSynchronize объекта прерывания (и любой другой код, вызывающий WdfInterruptAcquireLock для того же объекта прерывания) не могут выполняться.
Когда драйвер вызывает WdfInterruptReleaseLock, система возвращает IRQL процессора на предыдущий уровень и освобождает спин-блокировку.
Когда драйвер вызывает WdfInterruptAcquireLock для объекта прерывания пассивного уровня, система получает блокировку прерывания пассивного уровня, настроенную драйвером в WDF_INTERRUPT_CONFIG структуре объекта прерывания.
Когда драйвер вызывает WdfInterruptReleaseLock, система снимает блокировку прерываний.
Для прерываний пассивного уровня драйвер должен вызвать WdfInterruptAcquireLock в IRQL = PASSIVE_LEVEL.
Не вызывайте WdfInterruptAcquireLock из произвольного контекста потока, например обработчика запросов.
Вы можете использовать WdfInterruptAcquireLock и WdfInterruptReleaseLock , если драйвер должен выполнить несколько строк кода без упреждения, а обслуживание прерываний устройства эффективно отключено. Для более крупных разделов кода драйвер должен предоставлять функцию обратного вызова EvtInterruptSynchronize .
Драйвер не может вызвать WdfInterruptAcquireLock до того, как платформа вызовет функцию обратного вызова EvtInterruptEnable драйвера или после того, как платформа вызвала функцию обратного вызова EvtInterruptDisable драйвера.
После вызова WdfInterruptAcquireLock драйвер не должен повторно вызывать метод для того же объекта прерывания перед вызовом WdfInterruptReleaseLock.
Дополнительные сведения о методе WdfInterruptAcquireLock см. в разделе Синхронизация кода прерывания.
Дополнительные сведения об обработке прерываний в драйверах на основе платформы см. в разделе Обработка аппаратных прерываний.
Для объектов прерываний пассивного уровня драйверы должны вызывать WdfInterruptTryToAcquireLock вместо WdfInterruptAcquireLock при выполнении в произвольном потоке, например функции обратного вызова объекта очереди. Например, драйвер может вызывать WdfInterruptTryToAcquireLock из EvtIoRead.
Это позволяет избежать взаимоблокировки, как описано в следующем сценарии.
- Чтобы определить, было ли устройство прервано, драйвер функции для периферийного устройства SPB отправляет в шину ввод-вывод из isR, удерживая блокировку прерывания пассивного уровня.
- Драйвер шины выполняет второй запрос в том же потоке, в котором он получил указанный выше запрос.
- Подпрограмма завершения второго запроса отправляет запрос в драйвер периферийного устройства.
- Подпрограмма диспетчеризации ввода-вывода драйвера периферийного устройства вызывает WdfInterruptAcquireLock, который затем пытается получить пассивную блокировку объекта прерывания.
Требования
Требование | Значение |
---|---|
Целевая платформа | Универсальное |
Минимальная версия KMDF | 1,0 |
Минимальная версия UMDF | 2,0 |
Верхняя часть | wdfinterrupt.h (включая Wdf.h) |
IRQL | <= DIRQL |
Правила соответствия DDI | DriverCreate(kmdf), KmdfIrql(kmdf), KmdfIrql2(kmdf), KmdfIrqlExplicit(kmdf), WdfInterruptLock(kmdf), WdfInterruptLockRelease(kmdf) |