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:
Chame FltGetEcpListFromCallbackData (ou FsRtlGetEcpListFromIrp) para recuperar um ponteiro para o ECP_LIST associado à operação de criação.
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:
Chame FltGetEcpListFromCallbackData (ou FsRtlGetEcpListFromIrp) para recuperar um ponteiro para o ECP_LIST associado à operação de criação.
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.
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:
Chame FltAllocateExtraCreateParameterList (ou FsRtlAllocateExtraCreateParameterList) para alocar memória para uma estrutura ECP_LIST.
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.
Chame FltInsertExtraCreateParameter (ou FsRtlInsertExtraCreateParameter) para inserir estruturas de contexto ECP no ECP_LIST.
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:
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.
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:
- Você chamou FltAllocateExtraCreateParameter (ou FsRtlAllocateExtraCreateParameter) para alocar o pool de memória paginado
- Você chamou FltAllocateExtraCreateParameterFromLookasideList (ou FsRtlAllocateExtraCreateParameterFromLookasideList) para alocar o pool de memória de uma lista lookaside
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:
Chame FltInitExtraCreateParameterLookasideList (ou FsRtlInitExtraCreateParameterLookasideList) para inicializar uma lista lookaside de pool paginada ou não paginada que é usada para a alocação de uma ou mais estruturas de contexto ECP de tamanho fixo.
Chame FltDeleteExtraCreateParameterLookasideList (ou FsRtlDeleteExtraCreateParameterLookasideList) para liberar a lista lookaside.
Chame FltAllocateExtraCreateParameterFromLookasideList (ou FsRtlAllocateExtraCreateParameterFromLookasideList) para alocar o pool de memória da lista lookaside para uma estrutura de contexto ECP e gerar um ponteiro para essa estrutura.
Chame FltFreeExtraCreateParameter (ou FsRtlFreeExtraCreateParameter) para liberar a memória para as estruturas de contexto ECP.