Compartir a través de


Función CcPrepareMdlWrite (ntifs.h)

La rutina de 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 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

Ninguno

Observaciones

ccPrepareMdlWrite es similar a ccCopyWrite, excepto que los datos no se copian en el archivo almacenado en caché. En su lugar, las páginas físicas que se van a sobrescribir en la memoria caché del sistema están bloqueadas 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 la 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 memoria, pero no asignadas en el espacio del sistema. El autor de la llamada puede realizar esta asignación llamando a MmGetSystemAddressForMdlSafe.

Tenga en cuenta que incluso si se produce 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 lo tiene, 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 un try-except o instrucción try-finally.

Para almacenar en caché un archivo, use CcInitializeCacheMap.

Requisitos

Requisito Valor
de la plataforma de destino de Universal
encabezado de ntifs.h (incluya Ntifs.h)
biblioteca de NtosKrnl.lib
DLL de 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