Partager via


FsRtlCopyRead, fonction (ntifs.h)

La routine FsRtlCopyRead copie les données d’un fichier mis en cache vers une mémoire tampon utilisateur.

Syntaxe

BOOLEAN FsRtlCopyRead(
  [in]  PFILE_OBJECT     FileObject,
  [in]  PLARGE_INTEGER   FileOffset,
  [in]  ULONG            Length,
  [in]  BOOLEAN          Wait,
  [in]  ULONG            LockKey,
  [out] PVOID            Buffer,
  [out] PIO_STATUS_BLOCK IoStatus,
  [in]  PDEVICE_OBJECT   DeviceObject
);

Paramètres

[in] FileObject

Pointeur vers un objet de fichier pour le fichier mis en cache à partir duquel les données doivent être lues.

[in] FileOffset

Début du décalage d’octet dans le fichier mis en cache.

[in] Length

Longueur en octets des données à lire.

[in] Wait

Définissez la valeur TRUE si l’appelant peut être placé dans un état d’attente jusqu’à ce que toutes les données aient été copiées, FALSE dans le cas contraire.

[in] LockKey

Valeur associée à la plage d’octets à verrouiller. Si la plage à verrouiller chevauche une autre plage qui est déjà verrouillée avec un verrou non-cluster ou si la plage à lire est une sous-plage d’une autre plage qui est déjà verrouillée de manière non-cluster, la valeur de ce paramètre doit être la clé de ce verrou non cluster. Le verrou doit être conservé par le processus parent du thread appelant. Sinon, ce paramètre n’a aucun effet.

[out] Buffer

Pointeur vers une mémoire tampon dans laquelle les données doivent être copiées.

[out] IoStatus

Pointeur vers une structure allouée par l’appelant qui reçoit l’état d’achèvement final et les informations relatives à l’opération. Si les données sont copiées avec succès, ioStatus.Status contient STATUS_SUCCESS. Si toutes les données ne sont pas copiées correctement, IoStatus.Information contient le nombre réel d’octets copiés.

[in] DeviceObject

Objet d’appareil pour l’appareil qui contient les données du fichier.

Valeur de retour

FsRtlCopyRead retourne TRUE si la demande de copie a été effectuée, FALSE sinon. Notez qu’une valeur de retour de TRUE ne signifie pas nécessairement que l’opération de copie a réussi.

Si FsRtlCopyRead retourne FALSE ou si le contenu de IoStatus indique que l’opération de copie a échoué, l’appelant doit allouer un IRP de lecture au lieu d’appeler FsRtlCopyRead.

Remarques

Au lieu d’implémenter une routine de lecture d’E/S spécifique au système de fichiers, les développeurs de systèmes de fichiers qui prennent en charge la mise en cache des fichiers doivent envisager d’utiliser FsRtlCopyRead comme point d’entrée du système de fichiers pour le traitement des demandes de lecture d’E/S rapides. Cela nécessite que la routine DriverEntry du système de fichiers définisse le point d’entrée FastIoRead sur FsRtlCopyRead dans la structure FAST_IO_DISPATCH de l’objet de pilote du système de fichiers. En outre, le système de fichiers doit effectuer les opérations suivantes :

  1. Pour chaque fichier sur lequel des E/S rapides peuvent être effectuées, le système de fichiers doit allouer et initialiser une structure de FSRTL_COMMON_FCB_HEADER.

    Dans la plupart des systèmes de fichiers, cela s’effectue en incluant la structure FSRTL_COMMON_FCB_HEADER dans un bloc de contrôle de fichier (FCB) ou une structure comparable utilisée pour maintenir l’état d’un fichier ouvert.

    Le stockage de la structure FSRTL_COMMON_FCB_HEADER est généralement alloué à partir d’un pool paginé.

  2. Pour chaque fichier sur lequel des E/S rapides peuvent être effectuées, le système de fichiers doit lier tous les objets de fichier du fichier à la structure FSRTL_COMMON_FCB_HEADER. Pour ce faire, définissez le membre FsCon text de chaque objet de fichier pour qu’il pointe vers cette structure (ou la structure FCB ou autre qui contient la structure FSRTL_COMMON_FCB_HEADER).

  3. Lors de la mise en cache d’un fichier, le système de fichiers doit définir l'IsFastIoPossible membre de la structure FSRTL_COMMON_FCB_HEADER du fichier sur une valeur appropriée. Cette valeur doit être mise à jour si nécessaire tant que le fichier reste mis en cache.

    En particulier, les systèmes de fichiers doivent définir le membre IsFastIoPossible de la structure FSRTL_COMMON_FCB_HEADER sur FastIoIsQuestionable dès qu’il existe un verrou de plage d’octets exclusif sur le fichier mis en cache.

Si wait a la valeur TRUE, FsRtlCopyRead est garanti pour terminer la demande de copie et retourner TRUE. Si les pages requises du fichier mis en cache résident déjà en mémoire, les données sont copiées immédiatement et aucun blocage ne se produit. Si les pages nécessaires ne sont pas résidentes, l’appelant est placé dans un état d’attente jusqu’à ce que toutes les pages requises aient été rendues résidentes et que les données puissent être copiées.

Si 'attente a la valeur FALSE, FsRtlCopyRead refuse de bloquer et retourne FALSE, s’il ne peut pas acquérir la ressource principale du fichier ou si les pages requises du fichier mis en cache ne résident pas déjà en mémoire.

La routine FastIoCheckIfPossible du système de fichiers est chargée de s’assurer que la plage d’octets définie par FileOffset et Length n’inclut aucune plage d’octets verrouillée exclusivement pour laquelle l’appelant ne passe pas la valeur LockKey appropriée. Si le système de fichiers utilise les routines FsRtlXxxLockYyy prennent en charge les routines de gestion des verrous de plage d’octets, cela peut être effectué en appelant FsRtlFastCheckLockForRead à partir de la routine FastIoCheckIfPoss ible avant d’appeler FsRtlCopyRead.

Pour mettre en cache un fichier, utilisez la routine CcInitializeCacheMap.

Exigences

Exigence Valeur
plateforme cible Universel
d’en-tête ntifs.h (include Ntifs.h)
bibliothèque NtosKrnl.lib
DLL NtosKrnl.exe
IRQL PASSIVE_LEVEL
règles de conformité DDI PowerIrpDDis(wdm)

Voir aussi

CcInitializeCacheMap

FsRtlCopyWrite

FsRtlFastCheckLockForRead