Función MmLockPagableDataSection (wdm.h)
El MmLockPagableDataSection rutina bloquea toda una sección de datos del controlador en el espacio del sistema.
Sintaxis
PVOID MmLockPagableDataSection(
[in] PVOID AddressWithinSection
);
Parámetros
[in] AddressWithinSection
Especifica la dirección simbólica de un elemento de datos dentro de la sección paginable.
Valor devuelto
MmLockPagableDataSection devuelve un valor opaco que identifica la sección. Este valor debe pasarse posteriormente a mmLockPagableSectionByHandle o a MmUnlockPagableImageSection.
Observaciones
Los controladores pueden usar esta rutina, MmLockPagableSectionByHandley MmUnlockPagableImageSection para que sus datos privados normalmente se puedan paginar en la memoria.
Los datos se pueden bloquear si:
Normalmente, se accede a los datos en <= APC_LEVEL, pero es posible que sea necesario acceder a ellos en niveles de IRQL superiores durante períodos cortos.
El controlador usa los datos con poca frecuencia y de forma predecible.
Por ejemplo, los controladores para dispositivos mezcladores usan secciones de datos paginables. Dado que el controlador usa datos suficientes para que la creación de una sección de datos paginable valga la pena y el controlador sepa cuándo se necesitan los datos, este controlador usa MmLockPagableDataSection, MmLockPagableSectionByHandle y MmUnlockPagableImageSection para poner una sección de datos en el espacio del sistema cuando sea necesario y hacer que esté disponible para paginarse cuando no sea necesario.
Una sola llamada a MmLockPagableDataSection hace que toda la sección, que contiene los datos a los que se hace referencia, se bloqueen en el espacio del sistema.
Es una operación costosa para bloquear una sección. Si un controlador bloquea una sección de datos paginables en más de un lugar, use MmLockPagableDataSection para la primera solicitud. Realice solicitudes de bloqueo posteriores llamando a MmLockPagableSectionByHandle, pasando el identificador devuelto por MmLockPagableDataSection. El bloqueo mediante controlador mejora significativamente el rendimiento del controlador. Se desbloquea una sección bloqueada llamando a MmUnlockPagableImageSection.
El administrador de memoria mantiene un recuento de referencias en la sección . Una sección de datos paginables solo está disponible para paginarse cuando el recuento de referencias es cero. Cada solicitud de bloqueo incrementa el recuento; cada solicitud de desbloqueo disminuye el recuento. Un controlador debe desbloquear una sección tantas veces como bloquee una sección para asegurarse de que dicha sección estará disponible para paginarse cuando no se necesite la sección. Un identificador siempre es válido, independientemente del recuento. Si el recuento de un identificador es cero y se realiza una llamada a MmLockPagableSectionByHandle, el recuento se establece en uno y, si la sección se ha paginado, se paginará en .
Los datos de una sección de datos paginables se marcan mediante una directiva del compilador. Para crear una sección de datos paginables, use #pragma data_seg ("PAGE"), al principio del módulo de datos y #pragma data_seg () al final del módulo. La palabra clave PAGE distingue mayúsculas de minúsculas, es decir, PAGE debe estar en mayúsculas.
Tenga en cuenta que también hay un #pragma data_seg("INIT") que se usa para hacer que los datos se puedan descartar después de la inicialización del sistema. Excepto para el uso de INIT en lugar de PAGE, la sintaxis es la misma. Sin embargo, el resultado no es; el uso de la directiva PAGE hace que la sección de datos sea paginable. Cuando se usa la directiva inIT de, los datos de la sección se descartan en cuanto el controlador vuelve de su rutina de entrada del controlador o su rutina de reinicialización si el controlador tiene uno.
Para obtener más información sobre la paginación de datos, vea hacer que los controladores se puedan paginar.
Requisitos
Requisito | Valor |
---|---|
cliente mínimo admitido | Disponible a partir de Windows 2000. |
de la plataforma de destino de | Universal |
encabezado de | wdm.h (include Wdm.h, Ntddk.h, Ntifs.h) |
biblioteca de | NtosKrnl.lib |
DLL de | NtosKrnl.exe |
irQL | <=APC_LEVEL |
reglas de cumplimiento de DDI | HwStorPortProhibitedDIs(storport), IrqlMmApcLte(wdm) |