Partager via


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

Voir aussi

CcCopyWrite

CcInitializeCacheMap

CcMdlWriteAbort

CcMdlWriteComplete

IoAllocateMdl

IoBuildPartialMdl

MmGetMdlByteCount

MmGetMdlByteOffset

MmGetMdlPfnArray

MmGetMdlVirtualAddress

MmGetSystemAddressForMdl

MmGetSystemAddressForMdlSafe

MmInitializeMdl

MmMapLockedPages

MmPrepareMdlForReuse

MmProbeAndLockPages

MmUnlockPages

MmUnmapLockedPages