Compartir a través de


Función CcPrepareMdlWrite (ntifs.h)

La rutina CcPrepareMdlWrite proporciona acceso directo a la memoria de archivo almacenada en caché para que el autor de la llamada pueda escribir datos en el archivo.

Sintaxis

void CcPrepareMdlWrite(
  [in]  PFILE_OBJECT     FileObject,
  [in]  PLARGE_INTEGER   FileOffset,
  [in]  ULONG            Length,
  [out] PMDL             *MdlChain,
  [out] PIO_STATUS_BLOCK IoStatus
);

Parámetros

[in] FileObject

Puntero a un objeto de archivo para el archivo almacenado en caché.

[in] FileOffset

Puntero a una variable que especifica el desplazamiento de bytes inicial dentro del archivo almacenado en caché donde se van a escribir los datos.

[in] Length

Longitud en bytes de los datos que se van a escribir en la memoria caché del sistema.

[out] MdlChain

Cadena de una o varias listas de descriptores de memoria (MDL) que describen las páginas a las que se van a escribir los datos.

[out] IoStatus

Puntero a una estructura de IO_STATUS_BLOCK. Si la llamada a CcPrepareMdlWrite se realiza correctamente, IoStatus.Status se establece en STATUS_SUCCESS. De lo contrario, se establece en un código de error NTSTATUS adecuado. IoStatus.Information se establece en el número real de bytes que se bloquearon correctamente en la cadena MDL.

Valor devuelto

None

Observaciones

CcPrepareMdlWrite es similar a CcCopyWrite, salvo que los datos no se copian en el archivo almacenado en caché. En su lugar, las páginas físicas que se sobrescriben en la memoria caché del sistema se bloquean y CcPrepareMdlWrite devuelve una o varias listas de descriptores de memoria (MDL) que describen el intervalo de bytes especificado. Estas páginas permanecen bloqueadas en memoria hasta que se llama a CcMdlWriteComplete o CcMdlWriteAbort . Por lo tanto, cada llamada a CcPrepareMdlWrite debe ir seguida de una llamada a CcMdlWriteComplete o CcMdlWriteAbort.

Tenga en cuenta que las páginas descritas por MDL están bloqueadas en la memoria, pero no se asignan en el espacio del sistema. El llamador puede realizar esta asignación llamando a MmGetSystemAddressForMdlSafe.

Tenga en cuenta que aunque se produzca un error en la llamada a CcPrepareMdlWrite , se pueden haber asignado una o varias MDL. El autor de la llamada puede examinar el valor de IoStatus.Information para determinar si se ha producido esto. Si es así, el autor de la llamada debe llamar a CcMdlWriteComplete para liberar las MDL asignadas.

Si se produce algún error, CcPrepareMdlWrite genera una excepción de estado para ese error en particular. Por ejemplo, si se produce un error de asignación de grupo, CcPrepareMdlWrite genera una excepción de STATUS_INSUFFICIENT_RESOURCES; Si se produce un error de E/S, CcPrepareMdlWrite genera la excepción de estado del error de E/S. Por lo tanto, para obtener control si se produce un error, el controlador debe encapsular la llamada a CcPrepareMdlWrite en una instrucción try-except o try-finally .

Para almacenar en caché un archivo, use CcInitializeCacheMap.

Requisitos

Requisito Value
Plataforma de destino Universal
Encabezado ntifs.h (incluya Ntifs.h)
Library NtosKrnl.lib
Archivo DLL NtosKrnl.exe
IRQL < DISPATCH_LEVEL

Consulte también

CcCopyWrite

CcInitializeCacheMap

CcMdlWriteAbort

CcMdlWriteComplete

IoAllocateMdl

IoBuildPartialMdl

MmGetMdlByteCount

MmGetMdlByteOffset

MmGetMdlPfnArray

MmGetMdlVirtualAddress

MmGetSystemAddressForMdl

MmGetSystemAddressForMdlSafe

MmInitializeMdl

MmMapLockedPages

MmPrepareMdlForReuse

MmProbeAndLockPages

MmUnlockPages

MmUnmapLockedPages