Compartir a través de


Función FsRtlMdlReadEx (ntifs.h)

La rutina FsRtlMdlReadEx realiza una lectura mdL almacenada en caché rápida. Si los datos solicitados no se almacenan en caché, la rutina se revierte a una operación de lectura MDL basada en IRP.

Sintaxis

NTSTATUS FsRtlMdlReadEx(
  [in]  PFILE_OBJECT     FileObject,
  [in]  PLARGE_INTEGER   FileOffset,
  [in]  ULONG            Length,
  [in]  ULONG            LockKey,
  [out] PMDL             *MdlChain,
  [out] PIO_STATUS_BLOCK IoStatus
);

Parámetros

[in] FileObject

Puntero al objeto de archivo.

[in] FileOffset

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

[in] Length

Longitud en bytes de los datos que se van a leer de la memoria caché.

[in] LockKey

Valor asociado al intervalo de bytes que se va a bloquear. Si el intervalo que se va a bloquear se superpone a otro intervalo que ya está bloqueado con un bloqueo noclusivo, o si el intervalo que se va a leer es un subrango de otro rango que ya está bloqueado de forma noclusiva, el valor de este parámetro debe ser la clave para ese bloqueo noclusivo El bloqueo debe ser mantenido por el proceso primario del subproceso de llamada. De lo contrario, este parámetro no tiene ningún efecto.

[out] MdlChain

Dirección de una variable que recibe un puntero a una lista vinculada de listas de descriptores de memoria (MDL). MdlChain se debe inicializar para NULL antes de la llamada a FsRtlMdlReadEx.

[out] IoStatus

Puntero a una estructura de IO_STATUS_BLOCK que, en la salida, contiene el estado de la transferencia. Si la operación 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 la rutina bloqueó correctamente.

Valor devuelto

FsRtlMdlReadEx devuelve STATUS_SUCCESS o un valor de NTSTATUS adecuado, como uno de los siguientes:

Código devuelto Descripción
STATUS_INSUFFICIENT_RESOURCES No se pudo asignar el IRP para una lectura basada en IRP.

Observaciones

Si la E/S rápida está disponible en el sistema de archivos, la rutina de FsRtlMdlReadEx omitirá el mecanismo de lectura irP habitual y devolverá una lista vinculada de listas de descriptores de memoria (MDL) que el autor de la llamada puede usar para acceder directamente a los datos del archivo almacenados en caché. Esta operación no copia ni almacena en búfer datos y, por tanto, es mucho más rápido que una lectura normal. Si la E/S rápida no está habilitada, FsRtlMdlReadEx generará una lectura MDL sincrónica basada en IRP y devolverá las MDL de la solicitud.

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

Al igual que ccMdlRead, el FsRtlMdlReadEx bloquea las páginas que contienen los datos de archivo almacenados en caché para evitar que el sistema cambie estas páginas al archivo de página. Las páginas permanecen bloqueadas en memoria hasta que el autor de la llamada invoca la rutina de ccMdlReadComplete .

Requisitos

Requisito Valor
cliente mínimo admitido Windows 8
de la plataforma de destino de Universal
encabezado de ntifs.h (incluya Ntifs.h)
biblioteca de NtosKrnl.lib
DLL de NtosKrnl.exe
irQL PASSIVE_LEVEL

Consulte también

ccMdlRead

CcMdlReadComplete

IO_STATUS_BLOCK

MmGetSystemAddressForMdlSafe