Функция FsRtlOplockFsctrl (ntifs.h)
FsRtlOplockFsctrl выполняет различные операции оппортунистической блокировки (oplock) от имени файловой системы или драйвера фильтра.
Синтаксис
NTSTATUS FsRtlOplockFsctrl(
[in] POPLOCK Oplock,
[in] PIRP Irp,
[in] ULONG OpenCount
);
Параметры
[in] Oplock
Непрозрачный указатель oplock для файла. Этот указатель должен быть инициализирован предыдущим вызовом FsRtlInitializeOplock.
[in] Irp
Указатель на IRP для операции ввода-вывода. Этот параметр является обязательным и не может быть null.
[in] OpenCount
Количество пользовательских дескрипторов для файла, если запрашивается монопольная блокировка. Задание ненулевого значения для запроса oplock уровня 2, R или RH указывает на наличие блокировок диапазона байтов в файле. Сведения о типах oplock см. в обзоре Oplock.
Возвращаемое значение
FsRtlOplockFsctrl возвращает одно из следующих значений NTSTATUS:
Возвращаемый код | Описание |
---|---|
STATUS_SUCCESS | Для запроса IRP_MJ_CREATE STATUS_SUCCESS указывает, что запрошенная блокировка фильтра была предоставлена. Для операции FSCTL значение STATUS_SUCCESS зависит от кода FSCTL. Дополнительные сведения см. на справочных страницах для кодов FSCTL, перечисленных в следующем разделе "Примечания". |
STATUS_CANCELLED | Операция ввода-вывода отменена. STATUS_CANCELLED — это код ошибки. |
STATUS_INVALID_PARAMETER | Код FSCTL для операции ввода-вывода не был одним из допустимых значений, перечисленных в следующем разделе примечания. STATUS_INVALID_PARAMETER — это код ошибки. |
STATUS_OPLOCK_NOT_GRANTED | Не удалось предоставить оплок. STATUS_OPLOCK_NOT_GRANTED — это код ошибки. |
STATUS_PENDING | Используется только для операций FSCTL. Значение STATUS_PENDING зависит от кода FSCTL. Дополнительные сведения см. на справочных страницах для кодов FSCTL, перечисленных в следующем разделе "Примечания". STATUS_PENDING — это код успешного выполнения. |
STATUS_CANNOT_BREAK_OPLOCK | Новое оплок не может быть предоставлено. IRP — это запрос IRP_MJ_CREATE и FILE_OPEN_REQUIRING_OPLOCK был указан в параметре параметров создания для операции. STATUS_CANNOT_BREAK_OPLOCK — это код успешного выполнения. |
Замечания
Файловые системы и устаревшие драйверы фильтров вызывают FsRtlOplockFsctrl для выполнения различных операций управления операцией ввода-вывода или управления файловой системой. Минифильтры должны вызывать FltOplockFsctrl вместо FsRtlOplockFsctrl.
IRP, на который указывает параметр Irp, должен быть допустимым IRP для операции IRP_MJ_FILE_SYSTEM_CONTROL или IRP_MJ_CREATE.
Если IRP является запросом IRP_MJ_FILE_SYSTEM_CONTROL, FsRtlOplockFsctrl можно использовать с одним из следующих кодов FSCTL, который устанавливается в IrpSp->Parameters.FileSystemControl.FsControl.FsControlCode:
- FSCTL_OPBATCH_ACK_CLOSE_PENDING
- FSCTL_OPLOCK_BREAK_ACK_NO_2
- FSCTL_OPLOCK_BREAK_ACKNOWLEDGE
- FSCTL_OPLOCK_BREAK_NOTIFY
- FSCTL_REQUEST_BATCH_OPLOCK
- FSCTL_REQUEST_FILTER_OPLOCK
- FSCTL_REQUEST_OPLOCK_LEVEL_1
- FSCTL_REQUEST_OPLOCK_LEVEL_2
Подробные сведения об этих FSCTLs и о оппортунистических блокировках см. в документации по пакету SDK для Microsoft Windows.
Если IRP является запросом IRP_MJ_CREATE, FsRtlOplockFsctrl можно использовать для запроса ожидающей блокировки фильтра, если все из следующих условий имеют значение true:
- Значение параметра OpenCount должно иметь значение 1.
- Значение параметра DesiredAccess для запроса IRP_MJ_CREATE должно быть FILE_READ_ATTRIBUTES.
- Значение параметра ShareAccess
для запроса IRP_MJ_CREATE должно быть FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE.
Если запрос для ожидающего блокировки фильтра предоставлен, FsRtlOplockFsctrl возвращает STATUS_SUCCESS. Дополнительные сведения о создании параметров см. в справочной записи для IRP_MJ_CREATE.
Фильтры и файловые системы, вызывающие эту функцию, должны синхронизировать вызовы в пакет oplock, предоставленный системой. Дополнительные сведения см. в синхронизации Oplock.
Требования
Требование | Ценность |
---|---|
целевая платформа | Всеобщий |
заголовка | ntifs.h (include Ntifs.h) |
библиотеки |
NtosKrnl.lib |
DLL | NtosKrnl.exe |
IRQL | <= APC_LEVEL |
См. также
FSCTL_OPBATCH_ACK_CLOSE_PENDING