Compartir a través de


Función FltInitializePushLock (fltkernel.h)

La rutina FltInitializePushLock inicializa una variable de bloqueo de inserción.

Sintaxis

VOID FLTAPI FltInitializePushLock(
  [out] PEX_PUSH_LOCK PushLock
);

Parámetros

[out] PushLock

Puntero al almacenamiento proporcionado por el autor de la llamada, que debe ser al menos el valor sizeof(EX_PUSH_LOCK), para que se inicialice la variable de bloqueo de inserción. El almacenamiento debe estar alineado con 4 bytes en plataformas de 32 bits y 8 bytes alineados en plataformas de 64 bits.

Valor devuelto

None

Observaciones

Los bloqueos de inserción rara vez son una buena opción para minifiltros del sistema de archivos. Como se describe a continuación, algunas de sus características pueden ser incompatibles con la naturaleza inherentemente de reintento de los sistemas de archivos.

Los bloqueos de inserción son similares a las estructuras ERESOURCE (también denominadas "recursos") de las siguientes maneras:

  • Los bloqueos de inserción se pueden usar para la sincronización mediante un conjunto de subprocesos.
  • Los bloqueos de inserción se pueden adquirir para el acceso compartido o exclusivo.
  • Aunque el autor de la llamada proporciona el almacenamiento para la variable de bloqueo de inserción, la estructura de EX_PUSH_LOCK es opaca: es decir, sus miembros están reservados para uso del sistema.
Los bloqueos de inserción tienen las siguientes desventajas en comparación con las estructuras ERESOURCE:
  • El algoritmo para conceder acceso exclusivo no es justo para todos los subprocesos. Si hay un alto nivel de contención de bloqueo exclusivo, no hay ninguna garantía sobre el orden en que se concederá acceso exclusivo a los subprocesos.
  • No hay rutinas de soporte técnico para determinar el propietario actual de un bloqueo de inserción en tiempo de ejecución. (Los usuarios de estructuras ERESOURCE pueden llamar a rutinas como ExIsResourceAcquiredExclusiveLite para determinar si el subproceso actual tiene acceso exclusivo al recurso).
  • Por la misma razón, no hay extensiones de soporte técnico para determinar el propietario actual de un bloqueo de inserción en tiempo de depuración y, por tanto, diagnosticar interbloqueos. (Los usuarios de estructuras ERESOURCE pueden usar la !locks extensión en kd o windbg para averiguarlo).
  • No hay compatibilidad con el comprobador de controladores para ayudar al diagnóstico temprano de interbloqueos a través de bloqueos de inserción.
  • Los bloqueos de inserción exclusivos no se pueden adquirir de forma recursiva.
Los bloqueos de inserción ofrecen las siguientes ventajas sobre las estructuras ERESOURCE:
  • Cuando los bloqueos de inserción se adquieren principalmente para el acceso compartido, son más eficientes que las estructuras ERESOURCE.
  • El almacenamiento para bloqueos de inserción se puede asignar desde un grupo paginado o no paginado. Las estructuras ERESOURCE solo se deben asignar desde un grupo no paginado.
  • EX_PUSH_LOCK estructuras son mucho más pequeñas que las estructuras ERESOURCE.
A menos que cualquiera de estas ventajas sea atractiva, un ERESOURCE suele ser la solución más sólida y fácil de mantener para el problema de sincronización de lectura y escritura.

Para adquirir un bloqueo de inserción para el acceso exclusivo, llame a FltAcquirePushLockExclusive.

Para adquirir un bloqueo de inserción para el acceso compartido, llame a FltAcquirePushLockShared.

Para liberar un bloqueo de inserción, llame a FltReleasePushLock.

Para eliminar un bloqueo de inserción, llame a FltDeletePushLock.

Requisitos

Requisito Value
Cliente mínimo compatible Esta rutina está disponible en Microsoft Windows XP SP2, Microsoft Windows Server 2003 SP1 y versiones posteriores.
Plataforma de destino Universal
Encabezado fltkernel.h (incluya Fltkernel.h)
Library FltMgr.lib
Archivo DLL Fltmgr.sys
IRQL <= APC_LEVEL

Consulte también

ExIsResourceAcquiredExclusiveLite

FltAcquirePushLockExclusive

FltAcquirePushLockShared

FltDeletePushLock

FltReleasePushLock