Compartilhar via


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}
};