CcPrepareMdlWrite, fonction (ntifs.h)
La routine CcPrepareMdlWrite fournit un accès direct à la mémoire de fichier mise en cache afin que l’appelant puisse écrire des données dans le fichier.
Syntaxe
void CcPrepareMdlWrite(
[in] PFILE_OBJECT FileObject,
[in] PLARGE_INTEGER FileOffset,
[in] ULONG Length,
[out] PMDL *MdlChain,
[out] PIO_STATUS_BLOCK IoStatus
);
Paramètres
[in] FileObject
Pointeur vers un objet de fichier pour le fichier mis en cache.
[in] FileOffset
Pointeur vers une variable qui spécifie le décalage d’octets de départ dans le fichier mis en cache où les données doivent être écrites.
[in] Length
Longueur en octets des données à écrire dans le cache système.
[out] MdlChain
Chaîne d’une ou plusieurs listes de descripteurs de mémoire (MDL) décrivant les pages dans lesquelles les données doivent être écrites.
[out] IoStatus
Pointeur vers une structure IO_STATUS_BLOCK. Si l’appel à CcPrepareMdlWrite réussit, IoStatus.Status est défini sur STATUS_SUCCESS. Sinon, il est défini sur un code d’erreur NTSTATUS approprié. IoStatus.Information est défini sur le nombre réel d’octets qui ont été correctement verrouillés dans la chaîne MDL.
Valeur de retour
Aucun
Remarques
CcPrepareMdlWrite est similaire à CcCopyWrite, sauf que les données ne sont pas copiées dans le fichier mis en cache. Au lieu de cela, les pages physiques à remplacer dans le cache système sont verrouillées en mémoire, et CcPrepareMdlWrite retourne une ou plusieurs listes de descripteurs de mémoire (MDL) décrivant la plage d’octets spécifiée. Ces pages restent verrouillées en mémoire jusqu’à ce que CcMdlWriteComplete ou CcMdlWriteAbort soit appelée. Ainsi, chaque appel à CcPrepareMdlWrite doit être suivi d’un appel à CcMdlWriteComplete ou CcMdlWriteAbort.
Notez que les pages décrites par le MDL sont verrouillées en mémoire, mais pas mappées dans l’espace système. L’appelant peut effectuer ce mappage en appelant MmGetSystemAddressForMdlSafe.
Notez que même si l’appel à CcPrepareMdlWrite échoue, un ou plusieurs MDL peuvent avoir été alloués. L’appelant peut examiner la valeur de IoStatus.Information pour déterminer si cela s’est produit. Si c’est le cas, l’appelant doit appeler CcMdlWriteComplete pour libérer les DLL allouées.
Si une défaillance se produit, CcPrepareMdlWrite déclenche une exception d’état pour cet échec particulier. Par exemple, si un échec d’allocation de pool se produit, CcPrepareMdlWrite déclenche une exception STATUS_INSUFFICIENT_RESOURCES ; si une erreur d’E/S se produit, CcPrepareMdlWrite déclenche l’exception d’état de l’erreur d’E/S. Par conséquent, pour obtenir le contrôle si une défaillance se produit, le pilote doit encapsuler l’appel à CcPrepareMdlWrite dans une instruction try-except ou try-finally.
Pour mettre en cache un fichier, utilisez CcInitializeCacheMap.
Exigences
Exigence | Valeur |
---|---|
plateforme cible | Universel |
d’en-tête | ntifs.h (include Ntifs.h) |
bibliothèque | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | < DISPATCH_LEVEL |