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_READOPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE в элементе RequestedOplockLevel.

Операция R или RH в каталоге разрывается на Нет, когда содержимое перечисления каталога изменится. Например, добавление или удаление файла в каталоге, изменение размера файла в каталоге, изменение метки времени файла в каталоге и т. д. — все это приведет к прерыванию блокировки каталога. Для этого разрыва блокировки не требуется подтверждение, прежде чем могут произойти изменения в каталоге; он доступен только для рекомендаций.

Блокировка RH в каталоге прерывается на R при переименовании или удалении самого каталога. Для этого разрыва блокировки требуется подтверждение, прежде чем может произойти изменение каталога.

Требования

   
Минимальная версия клиента Windows 7 [только классические приложения]
Минимальная версия сервера Windows Server 2008 R2 [только классические приложения]
Верхняя часть winioctl.h (включая Windows.h)

См. также раздел