Compartir a través de


Solicitud y concesión de interbloqueos

Cuando el redirector de red accede a archivos en servidores remotos, solicita el interbloqueo desde el servidor remoto. Las aplicaciones cliente solicitan directamente bloqueos de operación solo cuando el bloqueo está pensado para un archivo en el servidor local.

Los interbloqueos se solicitan a través de FSCTLs. Los siguientes FSCTLs se usan para los diferentes tipos de interbloqueo, que pueden emitir las aplicaciones en modo de usuario y los controladores en modo kernel:

Para solicitar un interbloqueo de Windows 7 en modo de usuario, llame a DeviceIoControl:

De forma similar, para solicitar interbloqueos de Windows 7 en modo kernel:

Para especificar cuál de los cuatro interbloqueos de Windows 7 es necesario, establezca una o varias de las marcas siguientes en el miembro RequestedOplockLevel de la estructura REQUEST_OPLOCK_INPUT_BUFFER :

  • OPLOCK_LEVEL_CACHE_READ
  • OPLOCK_LEVEL_CACHE_HANDLE
  • OPLOCK_LEVEL_CACHE_WRITE

Para obtener más información, consulte FSCTL_REQUEST_OPLOCK.

Si se puede conceder el interbloqueo solicitado, el sistema de archivos devuelve STATUS_PENDING. Por este motivo, nunca se conceden interbloqueos para E/S sincrónicas. El IRP FSCTL no se completa hasta que se rompe el interbloqueo.

Si no se puede conceder el interbloqueo, el sistema de archivos devuelve un código de error adecuado. Los códigos de error devueltos con más frecuencia son STATUS_OPLOCK_NOT_GRANTED y STATUS_INVALID_PARAMETER (y sus equivalentes análogos del modo de usuario).

El interbloqueo Filter permite que una aplicación "vuelva a salir" cuando otras aplicaciones o clientes intenten acceder a la misma secuencia. Este mecanismo permite que una aplicación acceda a una secuencia sin provocar que otros descriptores de acceso de la secuencia reciban infracciones de uso compartido al intentar abrir la secuencia. Para evitar infracciones de uso compartido, se debe usar un procedimiento especial de tres pasos para solicitar un interbloqueo de filtro (FSCTL_REQUEST_FILTER_OPLOCK):

  1. Abra el archivo con un acceso necesario de FILE_READ_ATTRIBUTES y un modo compartido de FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE.

  2. Solicite un interbloqueo filter en el identificador del paso 1.

  3. Vuelva a abrir el archivo para el acceso de lectura.

El identificador abierto en el paso 1 no hará que otras aplicaciones reciban infracciones de uso compartido, ya que solo está abierta para el acceso a atributos (FILE_READ_ATTRIBUTES) y no para el acceso a datos (FILE_READ_DATA). Este identificador es adecuado para solicitar el interbloqueo filtro, pero no para realizar E/S reales en el flujo de datos. El identificador abierto en el paso 3 permite al titular del interbloqueo realizar E/S en la secuencia; el interbloqueo concedido en el paso 2 permite al titular del interbloqueo "salir del camino" sin provocar una infracción de uso compartido en otra aplicación que intenta acceder a la secuencia.

El sistema de archivos NTFS proporciona una optimización para este procedimiento a través de la marca de opción FILE_RESERVE_OPFILTER crear. Si esta marca se especifica en el paso 1 del procedimiento anterior, permite que el sistema de archivos produzca un error en la solicitud de creación con STATUS_OPLOCK_NOT_GRANTED si el sistema de archivos puede determinar que se producirá un error en el paso 2. Si el paso 1 se realiza correctamente, no hay ninguna garantía de que el paso 2 se realice correctamente, incluso si se especificó FILE_RESERVE_OPFILTER para la solicitud de creación.

En la tabla siguiente se identifican las condiciones necesarias para conceder un interbloqueo.

Tipo de solicitud Condiciones

Nivel 1

Filtrar

Batch

Solo se concede si se cumplen todas las condiciones siguientes:

  • La solicitud es para una secuencia determinada de un archivo.
    • Si es un directorio, se devuelve STATUS_INVALID_PARAMETER.
  • La secuencia se abre para el acceso ASINCRÓNICO.
    • Si se abre para el acceso SINCRÓNICO, se devuelve STATUS_OPLOCK_NOT_GRANTED (los interbloqueos no se conceden para las solicitudes de E/S sincrónicas).
  • No hay transacciones TxF en ninguna secuencia del archivo.
    • De lo contrario, se devuelve STATUS_OPLOCK_NOT_GRANTED.
  • No hay ninguna otra apertura en la secuencia (incluso por el mismo subproceso).
    • De lo contrario, se devuelve STATUS_OPLOCK_NOT_GRANTED.

Si el estado de interbloqueo actual es:

  • Sin interbloqueo: se concede la solicitud.

  • Nivel 2: la solicitud original de Nivel 2 se interrumpe con FILE_OPLOCK_BROKEN_TO_NONE. A continuación, se concede el interbloqueo exclusivo solicitado.

  • Nivel 1, Batch, Filter, Read, Read-Handle, Read-Write o Read-Write-Handle: se devuelve STATUS_OPLOCK_NOT_GRANTED.

Nivel 2

Solo se concede si se cumplen todas las condiciones siguientes:

  • La solicitud es para una secuencia determinada de un archivo.
    • Si es un directorio, se devuelve STATUS_INVALID_PARAMETER.
  • La secuencia se abre para el acceso ASINCRÓNICO.
    • Si se abre para el acceso SINCRÓNICO, se devuelve STATUS_OPLOCK_NOT_GRANTED.
  • No hay transacciones TxF en el archivo.
    • De lo contrario, se devuelve STATUS_OPLOCK_NOT_GRANTED.
  • No hay bloqueos de intervalo de bytes actuales en la secuencia.
    • De lo contrario, se devuelve STATUS_OPLOCK_NOT_GRANTED.
    • Antes de Windows 7, el sistema operativo comprueba si alguna vez existía un bloqueo de intervalo de bytes en la secuencia desde la última vez que se abrió y produce un error en la solicitud si es así.

Si el estado de interbloqueo actual es:

  • Sin interbloqueo: se concede la solicitud.

  • Nivel 2 o Lectura: se concede la solicitud. Puede tener varios interbloqueos de nivel 2/lectura concedidos en la misma secuencia al mismo tiempo. Incluso pueden existir varios interbloqueos de nivel 2 (pero no de lectura) en el mismo identificador.
    • Si se solicita un interbloqueo de lectura en un identificador que ya tiene un interbloqueo de lectura concedido, el primer IRP de read oplock se completa con STATUS_OPLOCK_SWITCHED_TO_NEW_HANDLE antes de que se conceda el segundo interbloqueo de lectura.
  • Nivel 1, Batch, Filter, Read-Handle, Read-Write, Read-Write-Handle: se devuelve STATUS_OPLOCK_NOT_GRANTED.

Leer

Solo se concede si se cumplen todas las condiciones siguientes:

  • La solicitud es para una secuencia determinada de un archivo.
  • La secuencia se abre para el acceso ASINCRÓNICO.
    • Si se abre para el acceso SINCRÓNICO, se devuelve STATUS_OPLOCK_NOT_GRANTED.
  • No hay transacciones TxF en el archivo.
    • De lo contrario, se devuelve STATUS_OPLOCK_NOT_GRANTED.
  • No hay bloqueos de intervalo de bytes actuales en la secuencia.
    • De lo contrario, se devuelve STATUS_OPLOCK_NOT_GRANTED.

Tenga en cuenta que si el estado actual de oplock es:

  • Sin interbloqueo: se concede la solicitud.

  • Nivel 2 o Lectura: se concede la solicitud. Puede tener varios interbloqueos de nivel 2/lectura concedidos en la misma secuencia al mismo tiempo.
    • Además, si un interbloqueo existente tiene la misma clave de interbloqueo que la nueva solicitud, su IRP se completa con STATUS_OPLOCK_SWITCHED_TO_NEW_HANDLE.
  • Read-Handle y el interbloqueo existente tienen una clave de interbloqueo diferente de la nueva solicitud: se concede la solicitud. Varios interbloqueos de lectura y Read-Handle pueden coexistir en la misma secuencia (consulte la nota que sigue a esta tabla).
    • Else (las claves de interbloqueo son las mismas) se devuelve STATUS_OPLOCK_NOT_GRANTED.
  • Nivel 1, Batch, Filter, Read-Write, Read-Write-Handle: se devuelve STATUS_OPLOCK_NOT_GRANTED.

Read-Handle

Solo se concede si se cumplen todas las condiciones siguientes:

  • La solicitud es para una secuencia determinada de un archivo.
  • La secuencia se abre para el acceso ASINCRÓNICO.
    • Si se abre para el acceso SINCRÓNICO, se devuelve STATUS_OPLOCK_NOT_GRANTED.
  • No hay transacciones TxF en el archivo.
    • De lo contrario, se devuelve STATUS_OPLOCK_NOT_GRANTED.
  • No hay bloqueos de intervalo de bytes actuales en la secuencia.
    • De lo contrario, se devuelve STATUS_OPLOCK_NOT_GRANTED.

Si el estado de interbloqueo actual es:

  • Sin interbloqueo: se concede la solicitud.

  • Lectura: se concede la solicitud.
    • Si un interbloqueo de lectura existente tiene la misma clave de interbloqueo que la nueva solicitud, su IRP se completa con STATUS_OPLOCK_SWITCHED_TO_NEW_HANDLE. El resultado es que el interbloqueo se actualiza de Lectura a Identificador de lectura.
    • Cualquier interbloqueo de lectura existente que no tenga la misma clave de interbloqueo que la nueva solicitud permanece sin cambios.
  • Nivel 2, Nivel 1, Batch, Filter, Read-Write, Read-Write-Handle: se devuelve STATUS_OPLOCK_NOT_GRANTED.

Lectura-escritura

Solo se concede si se cumplen todas las condiciones siguientes:

  • La solicitud es para una secuencia determinada de un archivo.
    • Si es un directorio, se devuelve STATUS_INVALID_PARAMETER.
  • La secuencia se abre para el acceso ASINCRÓNICO.
    • Si se abre para el acceso SINCRÓNICO, se devuelve STATUS_OPLOCK_NOT_GRANTED.
  • No hay transacciones TxF en el archivo.
    • De lo contrario, se devuelve STATUS_OPLOCK_NOT_GRANTED.
  • Si hay otras aperturas en la secuencia (incluso por el mismo subproceso), deben tener la misma clave de interbloqueo.
    • De lo contrario, se devuelve STATUS_OPLOCK_NOT_GRANTED.

Si el estado de interbloqueo actual es:

  • Sin interbloqueo: se concede la solicitud.

  • Leer o Read-Write y el oplock existente tiene la misma clave de interbloqueo que la solicitud: el IRP del interbloqueo existente se completa con STATUS_OPLOCK_SWITCHED_TO_NEW_HANDLE, se concede la solicitud.
    • De lo contrario, se devuelve STATUS_OPLOCK_NOT_GRANTED.
  • Nivel 2, Nivel 1, Batch, Filter, Read-Handle, Read-Write-Handle: se devuelve STATUS_OPLOCK_NOT_GRANTED.

Identificador de lectura y escritura

Solo se concede si se cumplen todas las siguientes condiciones:

  • La solicitud es para una secuencia determinada de un archivo.
    • Si es un directorio, se devuelve STATUS_INVALID_PARAMETER.
  • La secuencia se abre para el acceso ASINCRÓNICO.
    • Si se abre para el acceso SINCRÓNICO, se devuelve STATUS_OPLOCK_NOT_GRANTED.
  • No hay transacciones TxF en el archivo.
    • De lo contrario, se devuelve STATUS_OPLOCK_NOT_GRANTED.
  • Si hay otras solicitudes abiertas en la secuencia (incluso por el mismo subproceso), deben tener la misma clave de interbloqueo.
    • De lo contrario, se devuelve STATUS_OPLOCK_NOT_GRANTED.

Si el estado de interbloqueo actual es:

  • Sin interbloqueo: se concede la solicitud.

  • Read, Read-Handle, Read-Write o Read-Write-Handle y el oplock existente tiene la misma clave de interbloqueo que la solicitud: el IRP de oplock existente se completa con STATUS_OPLOCK_SWITCHED_TO_NEW_HANDLE, se concede la solicitud.
    • De lo contrario, se devuelve STATUS_OPLOCK_NOT_GRANTED.
  • Nivel 2, Nivel 1, Lote, Filtro: STATUS_OPLOCK_NOT_GRANTED se devuelve.

Nota

Los interbloqueos de lectura y nivel 2 pueden coexistir en la misma secuencia y leer y Read-Handle los interbloqueos de operación pueden coexistir, pero los interbloqueos de nivel 2 y Read-Handle no pueden coexistir.