Partager via


Fonction FltLockUserBuffer (fltkernel.h)

La routine FltLockUserBuffer verrouille la mémoire tampon utilisateur pour une opération d’E/S donnée.

Syntaxe

NTSTATUS FLTAPI FltLockUserBuffer(
  [in] PFLT_CALLBACK_DATA CallbackData
);

Paramètres

[in] CallbackData

Pointeur vers la structure de données de rappel FLT_CALLBACK_DATA pour l’opération d’E/S.

Valeur retournée

FltLockUserBuffer retourne STATUS_SUCCESS s’il verrouille correctement la mémoire tampon utilisateur (ou si la mémoire tampon a déjà été verrouillée par un appel précédent à FltLockUserBuffer.) Sinon, il retourne une valeur NTSTATUS appropriée, telle que l’une des valeurs suivantes :

Code de retour Description
STATUS_INSUFFICIENT_RESOURCES FltLockUserBuffer a rencontré un échec d’allocation de pool. Il s’agit d’un code d’erreur.
STATUS_INVALID_PARAMETER Un paramètre non valide a été rencontré. Par exemple, l’opération d’E/S n’a pas de paramètre MDL, ou les opérations d’E/S IRP_MJ_READ ou IRP_MJ_WRITE ont un code mineur de IRP_MN_MDL. Il s’agit d’un code d’erreur.

Remarques

Pour de meilleures performances, les pilotes de filtre ne doivent pas appeler FltLockUserBuffer , sauf si cela est absolument nécessaire. Le ralentissement des performances n’est pas dû à FltLockUserBuffer lui-même, mais plutôt à la pénalité de performances encourue par l’appel suivant à MmGetSystemAddressForMdlSafe ; pour plus d’informations, consultez remarques ultérieures.

Un pilote de minifiltre peut appeler FltLockUserBuffer pour verrouiller la mémoire tampon utilisateur pour l’une des opérations d’E/S suivantes :

  • 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 (sauf avec IRP_MN_MDL)
  • IRP_MJ_SET_EA
  • IRP_MJ_SET_QUOTA
  • IRP_MJ_WRITE (sauf avec IRP_MN_MDL)

FltLockUserBuffer détermine la méthode d’accès appropriée (IoReadAccess, IoWriteAccess ou IoModifyAccess) à appliquer pour la mémoire tampon verrouillée en fonction du type d’opération d’E/S.

FltLockUserBuffer définit le membre MdlAddress (ou OutputMdlAddress) dans la structure de paramètres de données de rappel (FLT_PARAMETERS) pour qu’il pointe vers la MDL pour les pages verrouillées. S’il n’y a pas de MDL, FltLockUserBuffer en alloue un. (Notez que FltMgr ne peut pas générer de MDL avant le système de fichiers, c’est pourquoi FltLockUserBuffer retourne STATUS_INVALID_PARAMETER pour IRP_MJ_READ ou IRP_MJ_WRITE avec IRP_MN_MDL).

Si la structure des paramètres de données de rappel contient une mémoire tampon système (Irp-AssociatedIrp.SystemBuffer>) et ne contient pas de mémoire tampon utilisateur (Irp-UserBuffer>), FltLockUserBuffer verrouille la mémoire tampon système. S’il n’existe pas de MDL pour la mémoire tampon système, FltLockUserBuffer en alloue un.

Si la structure des paramètres de données de rappel contient une mémoire tampon utilisateur, FltLockUserBuffersonde et verrouille la mémoire tampon utilisateur.

L’appelant peut s’exécuter dans n’importe quel contexte de processus. FltLockUserBuffer verrouille automatiquement la mémoire tampon dans le contexte de processus approprié.

Si FltLockUserBuffer est appelé à partir d’une routine de rappel de pré-opération (PFLT_PRE_OPERATION_CALLBACK) et qu’il alloue un MDL, FltLockUserBuffer définit l’indicateur de FLTFL_CALLBACK_DATA_DIRTY dans la structure de données de rappel (FLT_CALLBACK_DATA) afin que le système d’E/S libère la MDL une fois l’opération d’E/S terminée.

Pour conserver les entrées de table de pages système (PTE), FltLockUserBuffer ne mappe pas les pages verrouillées. Après avoir appelé FltLockUserBuffer, l’appelant doit appeler MmGetSystemAddressForMdlSafe, en passant le membre MdlAddress (ou OutputMdlAddress) dans la structure de paramètres de données de rappel comme valeur du paramètre Mdl , pour obtenir une mémoire tampon système qui représente cette mémoire.

Lorsque la structure de données de rappel est libérée, la mémoire tampon verrouillée est automatiquement déverrouillée et le MDL est libéré. L’appelant ne doit jamais libérer le MDL ; le système d’E/S effectue automatiquement cette opération.

FltLockUserBuffer peut être appelé pour des opérations rapides basées sur les E/S et les IRP.

Configuration requise

Condition requise Valeur
Plateforme cible Universal
En-tête fltkernel.h (inclure Fltkernel.h)
Bibliothèque FltMgr.lib
DLL Fltmgr.sys
IRQL <= APC_LEVEL

Voir aussi

FLT_CALLBACK_DATA

FLT_IS_FASTIO_OPERATION

FLT_IS_IRP_OPERATION

FLT_IS_SYSTEM_BUFFER

FLT_PARAMETERS

FLT_PARAMETERS pour les IRP_MJ_DEVICE_CONTROL et les IRP_MJ_INTERNAL_DEVICE_CONTROL

FLT_PARAMETERS pour IRP_MJ_DIRECTORY_CONTROL

FLT_PARAMETERS pour IRP_MJ_FILE_SYSTEM_CONTROL

FLT_PARAMETERS pour IRP_MJ_QUERY_EA

FLT_PARAMETERS pour IRP_MJ_QUERY_QUOTA

FLT_PARAMETERS pour IRP_MJ_QUERY_SECURITY

FLT_PARAMETERS pour IRP_MJ_READ

FLT_PARAMETERS pour IRP_MJ_SET_EA

FLT_PARAMETERS pour IRP_MJ_SET_QUOTA

FLT_PARAMETERS pour IRP_MJ_WRITE

FltDecodeParameters

MmGetSystemAddressForMdlSafe

MmProbeAndLockPages

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK