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 |