функция обратного вызова KSERVICE_ROUTINE (wdm.h)
Программа прерывания (ISR) быстро обслуживает прерывание устройства и при необходимости планирует обработку полученных данных после прерывания.
KSERVICE_ROUTINE KserviceRoutine;
BOOLEAN KserviceRoutine(
[in] _KINTERRUPT *Interrupt,
[in] PVOID ServiceContext
)
{...}
[in] Interrupt
Вызывающий указатель на структуру KINTERRUPT для прерывания.
[in] ServiceContext
Указатель на контекстную информацию, указанную в предыдущем вызове IoConnectInterrupt или IoConnectInterruptEx.
Если подпрограмма определяет, что прерывание не произошло с одного из устройств драйвера, он должен вернуть FALSE. В противном случае подпрограмма должна обслуживать прерывание и возвращать TRUE.
Чтобы зарегистрировать ISR для определенного вектора прерываний и сопоставления процессора, драйвер должен вызвать IoConnectInterrupt или IoConnectInterruptEx.
подпрограмма прерывания (ISR) драйвера выполняется в контексте прерывания, назначаемом системой DIRQL, как указано параметром SynchronizeIrql для IoConnectInterrupt. (Другие устройства с более высокими значениями DIRQL могут прервать ISR.)
Прежде чем система вызывает ISR, он получает блокировку спина прерывания (параметр SpinLock для IoConnectInterrupt), поэтому ISR не может одновременно выполняться на другом процессоре. После возвращения ISR система освобождает спин-блокировку.
IsR должен сначала определить, произошла ли прерывание с одного из устройств драйвера, проверив сведения о контексте, предоставленные Context. Если прерывание не из одного из устройств драйвера, подпрограмма должна немедленно вернуть FALSE, чтобы диспетчер операций ввода-вывода может вызывать другие драйверы, которые зарегистрировали ISR для того же процессора и вектора прерываний.
Дополнительные сведения о реализации поставщиков услуг см. в разделе подпрограммы прерываний.
Чтобы определить подпрограмму обратного вызова прерывания, необходимо сначала указать объявление функции, определяющее тип определяемой подпрограммы обратного вызова. Windows предоставляет набор типов функций обратного вызова для драйверов. Объявление функции с помощью типов функций обратного вызова помогает анализ кода для драйверов, статический проверяющий драйвер (SDV) и другие средства проверки подлинности, и это требование для написания драйверов для операционной системы Windows.
Например, чтобы определить подпрограмму обратного вызова прерывания, которая называется MyInterruptService
, используйте тип KSERVICE_ROUTINE, как показано в этом примере кода:
KSERVICE_ROUTINE MyInterruptService;
Затем реализуйте подпрограмму обратного вызова следующим образом:
_Use_decl_annotations_
BOOLEAN
MyInterruptService(
struct _KINTERRUPT *Interrupt,
PVOID ServiceContext
)
{
// Function body
}
Тип функции KSERVICE_ROUTINE определен в файле заголовка Wdm.h. Чтобы более точно определить ошибки при запуске средств анализа кода, обязательно добавьте в определение функции _Use_decl_annotations_
заметку. Заметка _Use_decl_annotations_
гарантирует, что используются заметки, применяемые к типу функции KSERVICE_ROUTINE в файле заголовка. Дополнительные сведения о требованиях к объявлениям функций см. в объявлении функций с помощью типов ролей функций для драйверов WDM. Сведения о _Use_decl_annotations_
см. в поведению функции.
Требование | Ценность |
---|---|
целевая платформа | Настольный |
заголовка | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
IRQL | Вызывается в DIRQL (см. раздел "Примечания"). |