FSCTL_REQUEST_OPLOCK IOCTL (winioctl.h)
请求对文件使用机会锁 (oplock),并确认已发生 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。 可以在同一句柄上重复执行不同的 oplock 级别请求,而无需在使用 FSCTL_REQUEST_OPLOCK 时关闭并重新打开 句柄;其他控制代码要求关闭句柄,然后使用 CreateFile 重新打开才能进行此类更改。 这是通过在重新发出FSCTL_REQUEST_OPLOCK控件代码时操作 REQUEST_OPLOCK_INPUT_BUFFER 结构的 RequestedOplockLevel 成员来实现的。
下表总结了 FSCTL_REQUEST_OPLOCK 中可用的 oplock 类型的缓存功能如何对应于级别 2、级别 1 和批处理 oplock。
替代控制代码 | 等效 的 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 类型的 oplock 的控制代码。 RH oplock 类似于 FSCTL_REQUEST_FILTER_OPLOCK 控制代码授予的筛选器 oplock。 但请注意,筛选器 oplock 一次只允许一个客户端对文件保留 oplock; FSCTL_REQUEST_OPLOCK 允许多个客户端一次对一个文件进行 RH 锁定。 另一个区别是 ,FSCTL_REQUEST_FILTER_OPLOCK 在写入之前需要 oplock 中断确认,其中 ,FSCTL_REQUEST_OPLOCK 不会,因为 oplock 中断通知是仅公告性的,并且允许在没有确认的情况下继续写入。 有关详细信息,请参阅 中断 Oplock。
如果在非重叠 (同步) 模式下打开文件,FSCTL_REQUEST_OPLOCK控制代码将失败。
有关重叠 I/O 对此操作的影响,请参阅 DeviceIoControl 主题的“备注”部分。
在 Windows 8 和 Windows Server 2012 中,以下技术支持此代码。
技术 | 支持 |
---|---|
服务器消息块 (SMB) 3.0 协议 | 否 |
SMB 3.0 透明故障转移 (TFO) | 否 |
具有横向扩展文件共享的 SMB 3.0 (SO) | 否 |
群集共享卷文件系统 (CSV) | 是 |
弹性文件系统 (ReFS) | 是 |
此外,从 Windows 8 和 Windows Server 2012 开始, FSCTL_REQUEST_OPLOCK 控制代码可用于请求目录和文件的 oplock。 目录上的 oplock 请求可以在 RequestedOplockLevel 成员中指定 OPLOCK_LEVEL_CACHE_READ
或 OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE
。
当目录的枚举的内容发生更改时,目录上的 R 或 RH 操作锁将中断为 None。 例如,在目录中添加/删除文件、更改目录中文件的大小、修改目录中文件的时间戳等,都会中断目录中的 oplock。 在目录中可能发生更改之前,此 oplock 中断不需要确认;它是仅限咨询的。
重命名或删除目录本身时,目录上的 RH 操作锁将中断到 R。 此 oplock 中断确实需要确认,然后才能更改目录。
要求
最低受支持的客户端 | Windows 7 [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2008 R2 [仅限桌面应用] |
标头 | winioctl.h (包括 Windows.h) |