Usando ECPs para processar operações de IRP_MJ_CREATE em um driver de filtro do sistema de arquivos

Você pode usar ECPs (parâmetros de criação) extras no driver de filtro do sistema de arquivos para processar operações IRP_MJ_CREATE. O driver de filtro do sistema de arquivos pode chamar as rotinas nas seções a seguir para recuperar, definir (adicionar), confirmar e remover ECPs para a operação IRP_MJ_CREATE . Você também pode determinar o espaço do sistema operacional do qual os ECPs se originaram.

Recuperando ECPs

Para recuperar ECPs para a operação IRP_MJ_CREATE:

  1. Chame FltGetEcpListFromCallbackData (ou FsRtlGetEcpListFromIrp) para recuperar um ponteiro para o ECP_LIST associado à operação de criação.

  2. Execute uma das seguintes operações:

    • Chame FltGetNextExtraCreateParameter (ou FsRtlGetNextExtraCreateParameter) para recuperar um ponteiro para a próxima (ou primeira) estrutura de contexto ECP na lista ECP.
    • Chame FltFindExtraCreateParameter (ou FsRtlFindExtraCreateParameter) para pesquisar a lista ECP para uma estrutura de contexto ECP de um determinado tipo. Qualquer rotina retorna um ponteiro para a estrutura de contexto ECP se a estrutura for encontrada.

Configurando ECPs

Para definir ECPs para a operação IRP_MJ_CREATE, o driver de filtro do sistema de arquivos:

  • Defina ECPs em um ECP_LIST existente.

  • Defina ECPs em um ECP_LIST recém-criado.

Configurando ECPs em um ECP_LIST existente

Para definir ECPs em um ECP_LIST existente associado à operação de criação:

  1. Chame FltGetEcpListFromCallbackData (ou FsRtlGetEcpListFromIrp) para recuperar um ponteiro para o ECP_LIST associado à operação de criação.

  2. Chame FltAllocateExtraCreateParameter (ou FsRtlAllocateExtraCreateParameter) para alocar o pool de memória paginado para uma estrutura de contexto ECP e gerar um ponteiro para essa estrutura.

  3. Chame FltInsertExtraCreateParameter (ou FsRtlInsertExtraCreateParameter) para inserir estruturas de contexto ECP na estrutura ECP_LIST.

Configurando ECPs em um ECP_LIST recém-criado

Se um ECP_LIST não estiver associado à operação de criação, você precisará criar um e definir ECPs nele:

  1. Chame FltAllocateExtraCreateParameterList (ou FsRtlAllocateExtraCreateParameterList) para alocar memória para uma estrutura ECP_LIST.

  2. Chame FltAllocateExtraCreateParameter (ou FsRtlAllocateExtraCreateParameter) para alocar o pool de memória paginado para uma estrutura de contexto ECP e gerar um ponteiro para essa estrutura.

  3. Chame FltInsertExtraCreateParameter (ou FsRtlInsertExtraCreateParameter) para inserir estruturas de contexto ECP no ECP_LIST.

  4. Chame FltSetEcpListIntoCallbackData (ou FsRtlSetEcpListIntoIrp) para anexar uma lista ECP à operação de criação.

Removendo ECPs

Para remover ECPs para a operação IRP_MJ_CREATE:

  1. Chame FltRemoveExtraCreateParameter (ou FsRtlRemoveExtraCreateParameter) para pesquisar uma lista ECP para uma estrutura de contexto ECP. Se a estrutura de contexto ECP for encontrada, a rotina desanexará a estrutura de contexto ECP da lista ECP.

  2. Para liberar a memória para a estrutura de contexto ECP desanexada, chame FltFreeExtraCreateParameter (ou FsRtlFreeExtraCreateParameter). Você pode chamar essas rotinas para liberar memória para a estrutura de contexto ECP se alocar a memória de uma das seguintes maneiras:

Marcar ECPs como confirmados ou determinar o status de reconhecimento

Chame as seguintes rotinas para marcar ECPs como confirmados ou determinar se os ECPs são marcados como reconhecidos:

  • Chame FltAcknowledgeEcp (ou FsRtlAcknowledgeEcp) para marcar uma estrutura de contexto ECP como reconhecida. O ECP pode ser marcado como examinado, usado, processado ou qualquer outra condição do ECP.

  • Chame FltIsEcpAcknowledged (ou FsRtlIsEcpAcknowledged) para determinar se uma estrutura de contexto ECP está marcada como reconhecida.

Determinando o modo de origem

Chame FltIsEcpFromUserMode (ou FsRtlIsEcpFromUserMode) para determinar se uma estrutura de contexto ECP se originou do modo de usuário. Um driver de filtro do sistema de arquivos pode se recusar a aceitar uma estrutura de contexto ECP originada do modo de usuário.

Usando listas lookaside para alocar ECPs

Chame as seguintes rotinas para alocar ECPs de listas lookaside e para gerenciar as listas lookaside e ECPs: