Compartir a través de


FSCTL_REQUEST_OPLOCK IOCTL (winioctl.h)

Solicita un bloqueo oportunista (oplock) en un archivo y reconoce que se ha producido una interrupción de interbloqueo.

Para realizar esta operación, llame a la función DeviceIoControl mediante los parámetros siguientes.

BOOL DeviceIoControl(
  (HANDLE) hDevice,                 // handle to file
  FSCTL_REQUEST_OPLOCK,             // dwIoControlCode
  (LPVOID) lpInBuffer,              // pointer to REQUEST_OPLOCK_INPUT_BUFFER
  (DWORD) nInBufferSize,            // size of input buffer
  (LPVOID) lpOutBuffer,             // pointer to REQUEST_OPLOCK_OUTPUT_BUFFER
  (DWORD) nOutBufferSize,           // size of output buffer
  NULL,                             // number of bytes returned
  (LPOVERLAPPED) lpOverlapped       // OVERLAPPED structure
);

Observaciones

Las aplicaciones cliente usan esta operación para solicitar un bloqueo oportunista (oplock) desde un servidor local. Las aplicaciones cliente no deben solicitar bloqueos oportunistas desde servidores remotos directamente: el redirector de red solicita de forma transparente bloqueos oportunistas para la aplicación. El uso de esta operación para solicitar bloqueos oportunistas desde servidores remotos hará que se deniegue la solicitud.

Si la operación deviceIoControl devuelve el código de error ERROR_IO_PENDING, se ha concedido la solicitud de interbloqueo. Si devuelve cualquier otro código de error, no se ha concedido el interbloqueo. Si el código de error es un valor de advertencia como ERROR_CANNOT_GRANT_REQUESTED_OPLOCK, la información extendida puede estar disponible en la estructura REQUEST_OPLOCK_OUTPUT_BUFFER.

Cuando se interrumpe un interbloqueo concedido, se indicará el objeto de evento de la estructuraSUPERPUESTA y se devolverá información en la estructura REQUEST_OPLOCK_OUTPUT_BUFFER. El miembro interno de la estructura superpuesta se establecerá en un valor NTSTATUS que proporciona información extendida sobre cómo se rompió el interbloqueo.

SUPERPUESTO. Valor interno Significado
STATUS_SUCCESS
0x0
El oplock se interrumpió mediante otra operación del sistema de archivos.
STATUS_OPLOCK_HANDLE_CLOSED
0x00000216
El interbloqueo ya no está en vigor porque el identificador de archivo usado para solicitarlo se cerró. Tenga en cuenta que si se interrumpe un interbloqueo porque se ha cerrado el identificador que se usó para solicitarlo, no es necesario confirmar la interrupción, independientemente del tipo de interbloqueo.
STATUS_OPLOCK_SWITCHED_TO_NEW_HANDLE
0x00000215
El interbloqueo todavía está en vigor, pero ya no está asociado al identificador de archivo que se usó para solicitarlo. Un autor de llamada usó un identificador diferente para el archivo para solicitar un nuevo interbloqueo y ese identificador posee ahora el oplock.

El código de control FSCTL_REQUEST_OPLOCK proporciona una funcionalidad más eficaz que los siguientes códigos de control relacionados: FSCTL_REQUEST_OPLOCK_LEVEL_1, FSCTL_REQUEST_OPLOCK_LEVEL_2, FSCTL_REQUEST_FILTER_OPLOCKy FSCTL_REQUEST_BATCH_OPLOCK. La solicitud de diferentes niveles de interbloqueo se puede realizar repetidamente en el mismo identificador sin cerrar y volver a abrir el identificador al usar FSCTL_REQUEST_OPLOCK; Los otros códigos de control requieren que se cierre el identificador y, a continuación, se vuelva a abrir con CreateFile para realizar este cambio. Esto se logra manipulando el requestedOplockLevel miembro de la estructura REQUEST_OPLOCK_INPUT_BUFFER al volver a emitir el código de control de FSCTL_REQUEST_OPLOCK.

En la tabla siguiente se resume cómo la capacidad de almacenamiento en caché de los tipos de interbloqueo disponibles en FSCTL_REQUEST_OPLOCK corresponde al nivel 2, el nivel 1 y los interbloqueos por lotes.

Código de control alternativo Valor equivalente de marcas RequestedOplockLevel Tipo de interbloqueo
FSCTL_REQUEST_BATCH_OPLOCK OPLOCK_LEVEL_CACHE_READ \| OPLOCK_LEVEL_CACHE_WRITE \| OPLOCK_LEVEL_CACHE_HANDLE RWH
FSCTL_REQUEST_OPLOCK_LEVEL_1 OPLOCK_LEVEL_CACHE_READ \| OPLOCK_LEVEL_CACHE_WRITE RW
FSCTL_REQUEST_OPLOCK_LEVEL_2 OPLOCK_LEVEL_CACHE_READ R

Con el código de control de FSCTL_REQUEST_OPLOCK con el miembro de RequestedOplockLevel establecido en OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE concede un interbloqueo de tipo RH. Un interbloqueo RH es similar al interbloqueo de filtro concedido por el código de control de FSCTL_REQUEST_FILTER_OPLOCK. Sin embargo, tenga en cuenta que el oplock de filtro solo permite que un cliente contenga un interbloqueo en un archivo a la vez; FSCTL_REQUEST_OPLOCK permite que varios clientes a la vez tengan el de RH en un archivo. Otra diferencia es que FSCTL_REQUEST_FILTER_OPLOCK requiere una confirmación de interrupción de interbloqueo antes de que se puedan producir escrituras, donde FSCTL_REQUEST_OPLOCK no porque la notificación de interrupción de interbloqueo es de solo aviso y las escrituras pueden continuar sin confirmación. Para obtener más información, vea Interbloqueos de interrupción.

Se produce un error en un código de control de FSCTL_REQUEST_OPLOCK si el archivo se abre en modo no superpuesto (sincrónico).

Para conocer las implicaciones de la E/S superpuesta en esta operación, vea la sección Comentarios del tema DeviceIoControl.

En Windows 8 y Windows Server 2012, este código es compatible con las siguientes tecnologías.

Tecnología Soportado
Protocolo bloque de mensajes del servidor (SMB) 3.0 No
Conmutación por error transparente (TFO) de SMB 3.0 No
SMB 3.0 con recursos compartidos de archivos de escalabilidad horizontal (SO) No
Sistema de archivos de volumen compartido de clúster (CsvFS)
Sistema de archivos resistente (ReFS)

Además, a partir de Windows 8 y Windows Server 2012, el código de control de FSCTL_REQUEST_OPLOCK se puede usar para solicitar un interbloqueo en un directorio, así como un archivo. Una solicitud de interbloqueo en un directorio puede especificar OPLOCK_LEVEL_CACHE_READ o OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE en el miembro RequestedOplockLevel.

Un interbloqueo R o RH en un directorio se interrumpe en Ninguno cuando cambiaría el contenido de una enumeración del directorio. Por ejemplo, agregar o eliminar un archivo en el directorio, cambiar el tamaño de un archivo en el directorio, modificar la marca de tiempo de un archivo en el directorio, etc., interrumpiría todo el interbloqueo en el directorio. Esta interrupción de interbloqueo no requiere una confirmación antes de que se produzcan los cambios en el directorio; es solo aviso.

Un interbloqueo RH en un directorio se interrumpe en R cuando se cambia el nombre o se elimina el propio directorio. Esta interrupción de interbloqueo requiere una confirmación antes de que se pueda producir el cambio en el directorio.

Requisitos

Requisito Valor
cliente mínimo admitido Windows 7 [solo aplicaciones de escritorio]
servidor mínimo admitido Windows Server 2008 R2 [solo aplicaciones de escritorio]
encabezado de winioctl.h (incluya Windows.h)

Consulte también