Função FltNotifyFilterChangeDirectory (fltkernel.h)

A rotina FltNotifyFilterChangeDirectory cria uma estrutura de notificação para uma operação de IRP_MN_NOTIFY_CHANGE_DIRECTORY e a adiciona à lista de notificação especificada.

Sintaxe

VOID FLTAPI FltNotifyFilterChangeDirectory(
  [in, out]      PNOTIFY_SYNC               NotifySync,
  [in, out]      PLIST_ENTRY                NotifyList,
  [in]           PVOID                      FsContext,
  [in]           PSTRING                    FullDirectoryName,
  [in]           BOOLEAN                    WatchTree,
  [in]           BOOLEAN                    IgnoreBuffer,
  [in]           ULONG                      CompletionFilter,
  [in]           PFLT_CALLBACK_DATA         NotifyCallbackData,
  [in, optional] PCHECK_FOR_TRAVERSE_ACCESS TraverseCallback,
  [in, optional] PSECURITY_SUBJECT_CONTEXT  SubjectContext,
  [in, optional] PFILTER_REPORT_CHANGE      FilterCallback
);

Parâmetros

[in, out] NotifySync

Ponteiro para um objeto de sincronização opaco para a lista de notificação do diretório de alterações para a qual o parâmetro NotifyList aponta.

[in, out] NotifyList

Ponteiro para o cabeçalho da lista de notificação do diretório de alterações para o volume atual. Cada elemento na lista é uma estrutura de notificação opaca.

[in] FsContext

Ponteiro para um valor exclusivo atribuído pelo chamador para identificar a estrutura de notificação a ser criada. Se uma rotina de retorno de chamada for fornecida no parâmetro TraverseCallback , FsContext será passado como o parâmetro NotifyContext para essa rotina.

[in] FullDirectoryName

Ponteiro para uma cadeia de caracteres ANSI ou Unicode que contém o nome completo do diretório associado a essa estrutura de notificação.

[in] WatchTree

Defina como TRUE se todos os subdiretórios do diretório especificados pelo parâmetro FullDirectoryName também deverão ser observados. Defina como FALSE se apenas o próprio diretório deve ser observado.

[in] IgnoreBuffer

Defina como TRUE para ignorar os buffers de usuário e forçar o diretório a ser reenumerado. Essa ação acelera a operação.

[in] CompletionFilter

Bitmask de sinalizadores que especificam os tipos de alterações em arquivos ou diretórios que devem fazer com que as estruturas de dados de retorno de chamada na lista de notificação sejam concluídas. Os valores de sinalizador possíveis são descritos na tabela a seguir.

Sinalizador Significado
FILE_NOTIFY_CHANGE_FILE_NAME Um arquivo foi adicionado, excluído ou renomeado neste diretório.
FILE_NOTIFY_CHANGE_DIR_NAME Um subdiretório foi criado, removido ou renomeado.
FILE_NOTIFY_CHANGE_NAME O nome desse diretório foi alterado.
FILE_NOTIFY_CHANGE_ATTRIBUTES O valor de um atributo desse arquivo, como a hora do último acesso, foi alterado.
FILE_NOTIFY_CHANGE_SIZE O tamanho desse arquivo foi alterado.
FILE_NOTIFY_CHANGE_LAST_WRITE A hora da última modificação desse arquivo foi alterada.
FILE_NOTIFY_CHANGE_LAST_ACCESS A hora do último acesso desse arquivo foi alterada.
FILE_NOTIFY_CHANGE_CREATION O tempo de criação desse arquivo foi alterado.
FILE_NOTIFY_CHANGE_EA Os atributos estendidos desse arquivo foram modificados.
FILE_NOTIFY_CHANGE_SECURITY As informações de segurança desse arquivo foram alteradas.
FILE_NOTIFY_CHANGE_STREAM_NAME Um fluxo de arquivos foi adicionado, excluído ou renomeado neste diretório.
FILE_NOTIFY_CHANGE_STREAM_SIZE O tamanho desse fluxo de arquivos foi alterado.
FILE_NOTIFY_CHANGE_STREAM_WRITE Os dados desse fluxo de arquivos foram alterados.

[in] NotifyCallbackData

Ponteiro para a estrutura de dados de retorno de chamada para a operação a ser adicionada à lista de notificação. Esse parâmetro é necessário e não pode ser NULL.

[in, optional] TraverseCallback

Ponteiro opcional para uma rotina de retorno de chamada a ser invocada quando ocorre uma alteração em um subdiretório que está sendo observado em uma árvore de diretório. Esse ponteiro permite que o sistema de arquivos marcar se o observador tem acesso a esse diretório. Essa rotina fornecida pelo chamador é declarada da seguinte maneira:

NTSTATUS
(*PCHECK_FOR_TRAVERSE_ACCESS) (
    IN PVOID NotifyContext,                     // FsContext
    IN PVOID TargetContext,                     // Context pointer
    IN PSECURITY_SUBJECT_CONTEXT SubjectContext // SubjectContext
    );

Para obter mais informações sobre o parâmetro TargetContext , consulte o parâmetro TargetContext da rotina FsRtlNotifyFullReportChange .

[in, optional] SubjectContext

Ponteiro para uma estrutura de contexto a ser passada para TraverseCallback. FltNotifyFilterChangeDirectory libera o contexto e libera a estrutura depois de usá-la. Se uma rotina TraverseCallback for fornecida, SubjectContext será passado como o parâmetro SubjectContext para essa rotina.

[in, optional] FilterCallback

Ponteiro opcional para uma rotina de retorno de chamada a ser invocada quando ocorrer uma alteração no diretório. Se essa rotina de retorno de chamada retornar TRUE, FsRtlNotifyFilterReportChange concluirá as operações de IRP_MN_NOTIFY_CHANGE_DIRECTORY pendentes na lista de notificação; caso contrário, não. Essa rotina fornecida pelo chamador é declarada da seguinte maneira:

BOOLEAN
(*PFILTER_REPORT_CHANGE) (
    IN PVOID NotifyContext,                     // FsContext
    IN PVOID FilterContext                      // Context pointer
    );

Retornar valor

Nenhum

Comentários

Um driver de minifiltro pode chamar FltNotifyFilterChangeDirectory da rotina de retorno de chamada de pré-operação (PFLT_PRE_OPERATION_CALLBACK) que ele registrou para processar operações de notificação de alteração de diretório. Essas operações têm um código de função principal de IRP_MJ_DIRECTORY_CONTROL e um código de função secundária de IRP_MN_NOTIFY_CHANGE_DIRECTORY.

O driver de minifiltro chama FltNotifyFilterChangeDirectory para criar uma estrutura de notificação para manter a estrutura de dados de retorno de chamada para a operação e adicionar a estrutura de notificação à lista de notificação para o volume atual.

FltNotifyFilterChangeDirectory faz o seguinte:

  • Verifica se o objeto de arquivo da operação foi limpo. Nesse caso, FltNotifyFilterChangeDirectory conclui a operação com status STATUS_NOTIFY_CLEANUP e não a adiciona à lista de notificação.
  • Se o objeto de arquivo da operação não tiver sido limpo, FltNotifyFilterChangeDirectory verificará se a lista de notificação já contém uma estrutura de notificação para o valor de FsContext fornecido. Se essa estrutura de notificação for encontrada e houver alterações pendentes no relatório, FltNotifyFilterChangeDirectory concluirá a estrutura de dados de retorno de chamada apontada pelo parâmetro NotifyCallbackData . Se uma estrutura de notificação for encontrada, mas não houver alterações pendentes no relatório, FltNotifyFilterChangeDirectory adicionará a operação à estrutura de notificação. Se nenhuma estrutura de notificação for encontrada, FltNotifyFilterChangeDirectory criará uma estrutura de notificação para a operação e a inserirá na lista.
Quando ocorre uma alteração no diretório, o sistema de arquivos chama FsRtlNotifyFilterReportChange para concluir as operações de IRP_MN_NOTIFY_CHANGE_DIRECTORY pendentes na lista de notificação.

Requisitos

Requisito Valor
Plataforma de Destino Universal
Cabeçalho fltkernel.h (inclua Fltkernel.h)
Biblioteca FltMgr.lib
DLL Fltmgr.sys
IRQL <= APC_LEVEL

Confira também

FsRtlNotifyFilterReportChange

IRP_MJ_DIRECTORY_CONTROL

PFLT_PRE_OPERATION_CALLBACK