Función CcPrepareMdlWrite (ntifs.h)
La rutina de ccPrepareMdlWrite
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 |