FSCTL_REQUEST_OPLOCK IOCTL (winioctl.h)
Запрашивает оппортунистическую блокировку (oplock) для файла и подтверждает, что произошел разрыв блокировки.
Для выполнения этой операции вызовите функцию DeviceIoControl , используя следующие параметры.
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
);
Комментарии
Эта операция используется только клиентскими приложениями, запрашивающими оппортунистическую блокировку (oplock) с локального сервера. Клиентские приложения, запрашивающие оппортунистические блокировки с удаленных серверов, не должны запрашивать их напрямую— перенаправитель сети прозрачно запрашивает оппортунистические блокировки для приложения. Попытка использовать эту операцию для запроса оппортунистических блокировок с удаленных серверов приведет к отклонению запроса.
Код элемента управления FSCTL_REQUEST_OPLOCK предоставляет более эффективные функции, чем следующие связанные коды элементов управления: FSCTL_REQUEST_OPLOCK_LEVEL_1, FSCTL_REQUEST_OPLOCK_LEVEL_2, FSCTL_REQUEST_FILTER_OPLOCK и FSCTL_REQUEST_BATCH_OPLOCK. Запрос различных уровней блокировки может выполняться несколько раз на одном дескриптоторе без закрытия и повторного открытия дескриптора при использовании FSCTL_REQUEST_OPLOCK; другие коды элементов управления требуют, чтобы дескриптор был закрыт, а затем снова открыт с помощью CreateFile , чтобы внести такое изменение. Это достигается путем управления элементом RequestedOplockLevel структуры REQUEST_OPLOCK_INPUT_BUFFER при повторной выдаче кода элемента управления FSCTL_REQUEST_OPLOCK .
В следующей таблице представлена сводка о том, как возможности кэширования типов операций, доступных из FSCTL_REQUEST_OPLOCK , соответствуют уровням 2, уровню 1 и пакетным блокировкам.
Альтернативный код элемента управления | Эквивалентное значение флагов RequestedOplockLevel | Тип oplock |
---|---|---|
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 |
При использовании кода элемента управления FSCTL_REQUEST_OPLOCK с элементом RequestedOplockLevel , заданным для OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE
получения блокировки типа RH. Операция RH похожа на блокировку фильтра, предоставляемую кодом элемента управления FSCTL_REQUEST_FILTER_OPLOCK . Однако обратите внимание, что блокировка фильтра позволяет только одному клиенту одновременно хранить блокировку в файле. FSCTL_REQUEST_OPLOCK позволяет нескольким клиентам одновременно использовать RH-блокировку файла. Другое отличие заключается в том, что FSCTL_REQUEST_FILTER_OPLOCK требует подтверждения прерывания блокировки перед записью, где FSCTL_REQUEST_OPLOCK нет, так как уведомление о разрыве блокировки является только рекомендацией, а операции записи разрешены без подтверждения. Дополнительные сведения см. в разделе Нарушение режима.
Код элемента управления FSCTL_REQUEST_OPLOCK завершается ошибкой, если файл открывается в неперекрывающемся (синхронном) режиме.
Сведения о последствиях перекрывающихся операций ввода-вывода для этой операции см. в разделе Примечания статьи DeviceIoControl .
В Windows 8 и Windows Server 2012 этот код поддерживается следующими технологиями.
Технология | Поддерживается |
---|---|
Протокол SMB 3.0 | Нет |
Прозрачная отработка отказа (TFO) SMB 3.0 | Нет |
SMB 3.0 с масштабируемыми общими папками (SO) | Нет |
Файловая система общего тома кластера (CSVFS) | Да |
Восстанавливаемая файловая система (ReFS) | Да |
Кроме того, начиная с Windows 8 и Windows Server 2012 код элемента управления FSCTL_REQUEST_OPLOCK можно использовать для запроса блокировки в каталоге и файле. Запрос на блокировку в каталоге может указывать или OPLOCK_LEVEL_CACHE_READ
OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE
в элементе RequestedOplockLevel.
Операция R или RH в каталоге разрывается на Нет, когда содержимое перечисления каталога изменится. Например, добавление или удаление файла в каталоге, изменение размера файла в каталоге, изменение метки времени файла в каталоге и т. д. — все это приведет к прерыванию блокировки каталога. Для этого разрыва блокировки не требуется подтверждение, прежде чем могут произойти изменения в каталоге; он доступен только для рекомендаций.
Блокировка RH в каталоге прерывается на R при переименовании или удалении самого каталога. Для этого разрыва блокировки требуется подтверждение, прежде чем может произойти изменение каталога.
Требования
Минимальная версия клиента | Windows 7 [только классические приложения] |
Минимальная версия сервера | Windows Server 2008 R2 [только классические приложения] |
Верхняя часть | winioctl.h (включая Windows.h) |