Registrando rotinas de retorno de chamada de pré-operação e operação de operação
Para registrar rotinas de retorno de chamada de pré-operação e rotinas de retorno de chamada de postoperation, um driver de minifiltro faz uma única chamada para FltRegisterFilter em sua rotina driverEntry . Para o parâmetro Registration em FltRegisterFilter, o driver de minifiltro passa um ponteiro para uma estrutura FLT_REGISTRATION . O membro OperationRegistration dessa estrutura contém um ponteiro para uma matriz de estruturas de FLT_OPERATION_REGISTRATION , uma para cada tipo de operação de E/S que o driver de minifiltro deve filtrar.
Cada estrutura FLT_OPERATION_REGISTRATION na matriz, exceto a última, contém as seguintes informações:
O código de função principal para a operação. Consulte FLT_PARAMETERS para obter informações sobre operações de E/S e seus parâmetros específicos do tipo de solicitação.
Para operações de leitura e gravação (IRP_MJ_READ e IRP_MJ_WRITE), um conjunto de sinalizadores que especificam se a E/S armazenada em cache ou a paginação de E/S ou ambas para operações de E/S baseadas em IRP
Pontos de entrada para até uma rotina de retorno de chamada de pré-operação e uma rotina de retorno de chamada de postoperation
O último elemento na matriz deve ser {IRP_MJ_OPERATION_END}.
O exemplo de código a seguir, que é obtido do driver de minifiltro de exemplo scanner, mostra uma matriz de estruturas de FLT_OPERATION_REGISTRATION. O driver de minifiltro de exemplo do Scanner registra rotinas de retorno de chamada de pré-operação e operação de IRP_MJ_CREATE e rotinas de retorno de chamada de pré-operação para operações de IRP_MJ_CLEANUP e 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}
};