CcPrepareMdlWrite, fonction (ntifs.h)
La routine CcPrepareMdlWrite fournit un accès direct à la mémoire du 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’octet 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
None
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’à l’appel de CcMdlWriteComplete ou CcMdlWriteAbort . Ainsi, chaque appel à CcPrepareMdlWrite doit être suivi d’un appel à CcMdlWriteComplete ou CcMdlWriteAbort.
Notez que les pages décrites par 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, une ou plusieurs DLL peuvent avoir été allouées. 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.
En cas d’échec, CcPrepareMdlWrite déclenche une exception status 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 la status exception de l’erreur d’E/S. Par conséquent, pour prendre le contrôle en cas de défaillance, le pilote doit encapsuler l’appel à CcPrepareMdlWrite dans une instruction try-except ou try-finally .
Pour mettre en cache un fichier, utilisez CcInitializeCacheMap.
Configuration requise
Condition requise | Valeur |
---|---|
Plateforme cible | Universal |
En-tête | ntifs.h (include Ntifs.h) |
Bibliothèque | NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | < DISPATCH_LEVEL |