Fonction FltWriteFile (fltkernel.h)
FltWriteFile est utilisé pour écrire des données dans un fichier, un flux ou un appareil ouvert.
Syntaxe
NTSTATUS FLTAPI FltWriteFile(
[in] PFLT_INSTANCE InitiatingInstance,
[in] PFILE_OBJECT FileObject,
[in, optional] PLARGE_INTEGER ByteOffset,
[in] ULONG Length,
[in] PVOID Buffer,
[in] FLT_IO_OPERATION_FLAGS Flags,
[out, optional] PULONG BytesWritten,
[in, optional] PFLT_COMPLETED_ASYNC_IO_CALLBACK CallbackRoutine,
[in, optional] PVOID CallbackContext
);
Paramètres
[in] InitiatingInstance
Pointeur de instance opaque pour le pilote minifiltre instance à laquelle l’opération doit être envoyée. Le instance doit être attaché au volume où réside le fichier. Ce paramètre est obligatoire et ne peut pas avoir la valeur NULL.
[in] FileObject
Pointeur vers un FILE_OBJECT pour le fichier dans lequel les données doivent être écrites. Cet objet de fichier doit être actuellement ouvert. L’appel de FltWriteFile lorsque l’objet fichier n’est pas encore ouvert ou n’est plus ouvert (par exemple, dans une routine de rappel précréation ou post-nettoyage) entraîne l’assertion du système sur une build vérifiée. Ce paramètre est obligatoire et ne peut pas avoir la valeur NULL.
[in, optional] ByteOffset
Pointeur vers une variable allouée par l’appelant qui spécifie le décalage d’octet de début dans le fichier où l’opération de lecture doit commencer.
Si ByteOffset est spécifié, les E/S sont effectuées à ce décalage, quelle que soit la valeur actuelle du champ CurrentByteOffset de l’objet fichier.
- Si le fichier a été ouvert pour les E/S synchrones (FO_SYNCHRONOUS_IO est défini dans le champ Flags de l’objet fichier), l’appelant peut définir ByteOffset-LowPart> sur FILE_USE_FILE_POINTER_POSITION et ByteOffset-HighPart> sur -1 pour que les E/S s’effectuent dans le champ CurrentByteOffset de l’objet fichier. Si le fichier n’a pas été ouvert pour les E/S synchrones, l’utilisation de FILE_USE_FILE_POINTER_POSITION est une erreur.
- L’appelant peut définir ByteOffset-LowPart> sur FILE_WRITE_TO_END_OF_FILE et ByteOffset-HighPart> sur -1 pour démarrer l’écriture à la fin du fichier (par exemple, effectuer une écriture d’ajout).
Si ByteOffset n’est pas spécifié :
- Si le fichier n’a pas été ouvert pour les E/S synchrones, il s’agit d’une erreur.
- Dans le cas contraire, les E/S sont effectuées au niveau du CurrentByteOffset de l’objet fichier.
Si l’objet fichier a été ouvert pour les E/S synchrones, le champ CurrentByteOffset est mis à jour, sauf si l’appelant passe l’indicateur FLTFL_IO_OPERATION_DO_NOT_UPDATE_BYTE_OFFSET.
- Remarque : le système de fichiers met toujours à jour CurrentByteOffset dans ce cas. Le Gestionnaire de filtres enregistre la valeur CurrentByteOffset avant d’envoyer les E/S dans la pile et les restaure lorsque l’E/S est retournée. Du point de vue de l’appelant de FltWriteFile (et des filtres à des altitudes plus élevées), le CurrrentByteOffset n’est pas mis à jour. Mais les filtres situés sous l’appelant voient la valeur CurrentByteOffset mise à jour dans leurs rappels post-lecture/écriture.
Si l’objet fichier n’a pas été ouvert pour les E/S synchrones, le champ CurrentByteOffset n’est pas mis à jour quel que soit l’état du paramètre ByteOffset .
Si l’objet de fichier vers lequel FileObject pointe a été ouvert pour les E/S asynchrones, ce paramètre est obligatoire et ne peut pas être NULL.
Avant Windows 8, les constantes spéciales FILE_WRITE_TO_END_OF_FILE et FILE_USE_FILE_POINTER_POSITION ne sont pas prises en charge pour ce paramètre.
[in] Length
Taille, en octets, de la mémoire tampon vers laquelle pointe le paramètre Buffer .
[in] Buffer
Pointeur vers une mémoire tampon qui contient les données à écrire dans le fichier. Si le fichier est ouvert pour les E/S non mises en cache, cette mémoire tampon doit être alignée conformément à l’exigence d’alignement du périphérique de stockage sous-jacent. Les pilotes de minifiltre peuvent allouer une telle mémoire tampon alignée en appelant FltAllocatePoolAlignedWithTag.
[in] Flags
Masque de bits d’indicateurs spécifiant le type d’opération d’écriture à effectuer.
Indicateur | Signification |
---|---|
FLTFL_IO_OPERATION_DO_NOT_UPDATE_BYTE_OFFSET | Les pilotes de minifiltre peuvent définir cet indicateur pour spécifier que FltWriteFile ne met pas à jour le champ CurrentByteOffset de l’objet de fichier. |
FLTFL_IO_OPERATION_NON_CACHED | Les pilotes de minifiltre peuvent définir cet indicateur pour spécifier une écriture non mise en cache, même si l’objet de fichier n’a pas été ouvert avec FILE_NO_INTERMEDIATE_BUFFERING. |
FLTFL_IO_OPERATION_PAGING | Les pilotes de minifiltre peuvent définir cet indicateur pour spécifier une écriture de pagination. |
FLTFL_IO_OPERATION_SYNCHRONOUS_PAGING | Les pilotes minifilter peuvent définir cet indicateur pour spécifier une écriture d’E/S de pagination synchrone. Les pilotes de minifiltre qui définissent cet indicateur doivent également définir l’indicateur FLTFL_IO_OPERATION_PAGING. Cet indicateur est disponible à partir de Windows Vista. |
[out, optional] BytesWritten
Pointeur vers une variable allouée par l’appelant qui reçoit le nombre d’octets écrits dans le fichier. Si CallbackRoutine n’a pas la valeur NULL, ce paramètre est ignoré. Sinon, ce paramètre est facultatif et peut avoir la valeur NULL.
[in, optional] CallbackRoutine
Pointeur vers une routine de rappel de type PFLT_COMPLETED_ASYNC_IO_CALLBACK à appeler une fois l’opération d’écriture terminée. Ce paramètre est facultatif et peut être NULL.
[in, optional] CallbackContext
Pointeur de contexte à passer à l’objet CallbackRoutine le cas échéant. Ce paramètre est facultatif et peut être NULL. Si CallbackRoutine a la valeur NULL, ce paramètre est ignoré.
Valeur retournée
FltWriteFile retourne la valeur NTSTATUS qui a été retournée par le système de fichiers.
Remarques
Un pilote de minifiltre appelle FltWriteFile pour écrire des données dans un fichier ouvert.
FltWriteFile entraîne l’envoi d’une demande d’écriture aux instances de pilote de minifiltre jointes sous le instance initial et au système de fichiers. Le instance spécifié et les instances jointes ci-dessus ne reçoivent pas la demande d’écriture.
FltWriteFile effectue des E/S non mises en cache si l’une des conditions suivantes est vraie :
L’appelant définit l’indicateur FLTFL_IO_OPERATION_NON_CACHED dans le paramètre Flags .
L’objet file a été ouvert pour les E/S non mises en cache. En règle générale, cela s’effectue en spécifiant l’indicateur CreateOptions FILE_NO_INTERMEDIATE_BUFFERING dans l’appel précédent à FltCreateFile, FltCreateFileEx ou ZwCreateFile.
Les E/S non mises en cache imposent les restrictions suivantes sur les valeurs de paramètre transmises à FltWriteFile :
La mémoire tampon vers laquelle pointe le paramètre Buffer doit être alignée conformément à l’exigence d’alignement du périphérique de stockage sous-jacent. Pour allouer une telle mémoire tampon alignée, appelez FltAllocatePoolAlignedWithTag.
Le décalage d’octet vers lequel pointe le paramètre ByteOffset doit être un multiple non négatif de la taille de secteur du volume.
La longueur spécifiée dans le paramètre Length doit être un multiple non négatif de la taille de secteur du volume.
Si la valeur du paramètre CallbackRoutine n’est pas NULL, l’opération d’écriture est effectuée de manière asynchrone.
Si la valeur du paramètre CallbackRoutine est NULL, l’opération d’écriture est effectuée de manière synchrone. Autrement dit, FltWriteFile attend que l’opération d’écriture soit terminée avant de retourner. Cela est vrai même si l’objet de fichier vers lequel FileObject pointe a été ouvert pour les E/S asynchrones.
Si plusieurs threads appellent FltWriteFile pour le même objet de fichier et que l’objet fichier a été ouvert pour les E/S synchrones, le Gestionnaire de filtres ne tente pas de sérialiser les E/S sur le fichier. À cet égard, FltWriteFile diffère de ZwWriteFile.
Configuration requise
Condition requise | Valeur |
---|---|
Plateforme cible | Universal |
En-tête | fltkernel.h (inclure Fltkernel.h) |
Bibliothèque | FltMgr.lib |
DLL | Fltmgr.sys |
IRQL | PASSIVE_LEVEL |