Поделиться через


Регистрация процедур обратного вызова перед операции и после операции

Чтобы зарегистрировать процедуры обратного вызова до операции и подпрограммы обратного вызова после операции, драйвер минифильтра выполняет один вызов FltRegisterFilter в своей подпрограмме DriverEntry . Для параметра Registration в FltRegisterFilter драйвер минифильтра передает указатель на структуру FLT_REGISTRATION . Элемент OperationRegistration этой структуры содержит указатель на массив FLT_OPERATION_REGISTRATION структур, по одному для каждого типа операций ввода-вывода, которые должен фильтровать драйвер минифильтра.

Каждая FLT_OPERATION_REGISTRATION структура в массиве, за исключением последней, содержит следующие сведения:

  • Код основной функции для операции. Сведения об операциях ввода-вывода и их параметрах, относящихся к типу запроса, см. в разделе FLT_PARAMETERS .

  • Для операций чтения и записи (IRP_MJ_READ и IRP_MJ_WRITE) — набор флагов, указывающих, следует ли игнорировать кэшированные операции ввода-вывода или операции ввода-вывода на основе IRP.

  • Точки входа для одной процедуры обратного вызова до операции и одной процедуры обратного вызова после операции

Последним элементом массива должен быть {IRP_MJ_OPERATION_END}.

В следующем примере кода, взятом из примера драйвера минифильтра сканера, показан массив FLT_OPERATION_REGISTRATION структур. Пример драйвера минифильтра сканера регистрирует подпрограммы обратного вызова перед операцией и после операции для IRP_MJ_CREATE и перед операцией обратного вызова для IRP_MJ_CLEANUP и IRP_MJ_WRITE операций.

const FLT_OPERATION_REGISTRATION Callbacks[] = {
    {IRP_MJ_CREATE,
     0,
     ScannerPreCreate,
     ScannerPostCreate},
    {IRP_MJ_CLEANUP,
     0, 
     ScannerPreCleanup,
     NULL},
    {IRP_MJ_WRITE,
     0, 
     ScannerPreWrite,
     NULL},
    {IRP_MJ_OPERATION_END}
};