Função FltLockUserBuffer (fltkernel.h)
A rotina FltLockUserBuffer bloqueia o buffer de usuário para uma determinada operação de E/S.
Sintaxe
NTSTATUS FLTAPI FltLockUserBuffer(
[in] PFLT_CALLBACK_DATA CallbackData
);
Parâmetros
[in] CallbackData
Ponteiro para a estrutura de dados de retorno de chamada FLT_CALLBACK_DATA para a operação de E/S.
Retornar valor
FltLockUserBuffer retornará STATUS_SUCCESS se bloquear com êxito o buffer de usuário (ou se o buffer já tiver sido bloqueado por uma chamada anterior para FltLockUserBuffer.) Caso contrário, ele retornará um valor NTSTATUS apropriado, como um dos seguintes:
Código de retorno | Descrição |
---|---|
STATUS_INSUFFICIENT_RESOURCES | FltLockUserBuffer encontrou uma falha de alocação de pool. Este é um código de erro. |
STATUS_INVALID_PARAMETER | Um parâmetro inválido foi encontrado. Por exemplo, a operação de E/S não tem um parâmetro MDL ou as operações de E/S IRP_MJ_READ ou IRP_MJ_WRITE têm um código secundário de IRP_MN_MDL. Este é um código de erro. |
Comentários
Para obter o melhor desempenho, os drivers de filtro não devem chamar FltLockUserBuffer , a menos que seja absolutamente necessário. A desaceleração do desempenho não é devido ao próprio FltLockUserBuffer , mas sim devido à penalidade de desempenho incorrida pela chamada subsequente para MmGetSystemAddressForMdlSafe; consulte Comentários posteriores para obter mais informações.
Um driver de minifiltro pode chamar FltLockUserBuffer para bloquear o buffer de usuário para uma das seguintes operações de E/S:
- IRP_MJ_DEVICE_CONTROL
- IRP_MJ_DIRECTORY_CONTROL
- IRP_MJ_FILE_SYSTEM_CONTROL
- IRP_MJ_INTERNAL_DEVICE_CONTROL
- IRP_MJ_QUERY_EA
- IRP_MJ_QUERY_QUOTA
- IRP_MJ_QUERY_SECURITY
- IRP_MJ_READ (exceto com IRP_MN_MDL)
- IRP_MJ_SET_EA
- IRP_MJ_SET_QUOTA
- IRP_MJ_WRITE (exceto com IRP_MN_MDL)
FltLockUserBuffer determina o método de acesso apropriado (IoReadAccess, IoWriteAccess ou IoModifyAccess) a ser aplicado ao buffer bloqueado com base no tipo de operação de E/S.
FltLockUserBuffer define o membro MdlAddress (ou OutputMdlAddress) na estrutura do parâmetro de dados de retorno de chamada (FLT_PARAMETERS) para apontar para o MDL para as páginas bloqueadas. Se não houver MDL, FltLockUserBuffer alocará um. (Observe que o FltMgr não pode gerar um MDL antes do sistema de arquivos, razão pela qual FltLockUserBuffer retorna STATUS_INVALID_PARAMETER para IRP_MJ_READ ou IRP_MJ_WRITE com IRP_MN_MDL).
Se a estrutura do parâmetro de dados de retorno de chamada contiver um buffer do sistema (Irp-AssociatedIrp.SystemBuffer>) e não contiver um buffer de usuário (Irp-UserBuffer>), FltLockUserBuffer bloqueará o buffer do sistema. Se não houver MDL para o buffer do sistema, FltLockUserBuffer alocará um.
Se a estrutura de parâmetros de dados de retorno de chamada contiver um buffer de usuário, FltLockUserBufferinvestigará e bloqueará o buffer de usuário.
O chamador pode estar em execução em qualquer contexto de processo. FltLockUserBuffer bloqueia automaticamente o buffer no contexto de processo correto.
Se FltLockUserBuffer for chamado de uma rotina de retorno de chamada pré-operação (PFLT_PRE_OPERATION_CALLBACK) e alocar um MDL, FltLockUserBuffer definirá o sinalizador FLTFL_CALLBACK_DATA_DIRTY na estrutura de dados de retorno de chamada (FLT_CALLBACK_DATA) para que o sistema de E/S libere o MDL quando a operação de E/S for concluída.
Para conservar ptes (entradas de tabela de página do sistema), FltLockUserBuffer não mapeia as páginas bloqueadas. Depois de chamar FltLockUserBuffer, o chamador deve chamar MmGetSystemAddressForMdlSafe, passando o membro MdlAddress (ou OutputMdlAddress) na estrutura do parâmetro de dados de retorno de chamada como o valor do parâmetro Mdl , para obter um buffer do sistema que representa essa memória.
Quando a estrutura de dados de retorno de chamada é liberada, o buffer bloqueado é desbloqueado automaticamente e o MDL é liberado. O chamador nunca deve liberar o MDL; o sistema de E/S faz isso automaticamente.
FltLockUserBuffer pode ser chamado para operações rápidas baseadas em E/S e IRP.
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
FLT_PARAMETERS para IRP_MJ_DEVICE_CONTROL e IRP_MJ_INTERNAL_DEVICE_CONTROL
FLT_PARAMETERS para IRP_MJ_DIRECTORY_CONTROL
FLT_PARAMETERS para IRP_MJ_FILE_SYSTEM_CONTROL
FLT_PARAMETERS para IRP_MJ_QUERY_EA
FLT_PARAMETERS para IRP_MJ_QUERY_QUOTA
FLT_PARAMETERS para IRP_MJ_QUERY_SECURITY
FLT_PARAMETERS para IRP_MJ_READ
FLT_PARAMETERS para IRP_MJ_SET_EA
FLT_PARAMETERS para IRP_MJ_SET_QUOTA
Comentários
https://aka.ms/ContentUserFeedback.
Em breve: Ao longo de 2024, eliminaremos os problemas do GitHub como o mecanismo de comentários para conteúdo e o substituiremos por um novo sistema de comentários. Para obter mais informações, consulteEnviar e exibir comentários de