FSCTL_REQUEST_OPLOCK IOCTL (winioctl.h)
Solicita un bloqueo oportunista (oplock) en un archivo y confirma que se ha producido una interrupción del oplock.
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, // input buffer
(DWORD) nInBufferSize, // size of input buffer
(LPVOID) lpOutBuffer, // output buffer
(DWORD) nOutBufferSize, // size of output buffer
(LPDWORD) lpBytesReturned, // number of bytes returned
(LPOVERLAPPED) lpOverlapped // OVERLAPPED structure
);
Comentarios
Esta operación solo la usan las aplicaciones cliente que solicitan un bloqueo oportunista (oplock) desde un servidor local. Las aplicaciones cliente que solicitan bloqueos oportunistas desde servidores remotos no deben solicitarlos directamente: el redirector de red solicita de forma transparente bloqueos oportunistas para la aplicación. Un intento de usar esta operación para solicitar bloqueos oportunistas de servidores remotos provocará que se deniegue la solicitud.
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_OPLOCK y 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 miembro RequestedOplockLevel de la estructura de 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 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 interbloqueo de filtro solo permite que un cliente mantenga un interbloqueo en un archivo a la vez; FSCTL_REQUEST_OPLOCK permite que varios clientes a la vez tengan el bloqueo 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 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, consulte 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 | Compatible |
---|---|
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) | Sí |
Sistema de archivos resistente a errores (ReFS) | Sí |
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 en 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 de asesoramiento.
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
Cliente mínimo compatible | Windows 7 [solo aplicaciones de escritorio] |
Servidor mínimo compatible | Windows Server 2008 R2 [solo aplicaciones de escritorio] |
Encabezado | winioctl.h (incluya Windows.h) |