다음을 통해 공유


FSCTL_REQUEST_OPLOCK IOCTL(winioctl.h)

파일에 대한 기회 잠금(oplock)을 요청하고 oplock 중단이 발생했음을 인정합니다.

이 작업을 수행하려면 다음 매개 변수를 사용하여 DeviceIoControl 함수를 호출합니다.

BOOL DeviceIoControl(
  (HANDLE) hDevice,                 // handle to file
  FSCTL_REQUEST_OPLOCK,             // dwIoControlCode
  (LPVOID) lpInBuffer,              // pointer to REQUEST_OPLOCK_INPUT_BUFFER
  (DWORD) nInBufferSize,            // size of input buffer
  (LPVOID) lpOutBuffer,             // pointer to REQUEST_OPLOCK_OUTPUT_BUFFER
  (DWORD) nOutBufferSize,           // size of output buffer
  NULL,                             // number of bytes returned
  (LPOVERLAPPED) lpOverlapped       // OVERLAPPED structure
);

발언

이 작업은 클라이언트 애플리케이션에서 로컬 서버에서 기회 잠금(oplock)을 요청하는 데 사용됩니다. 클라이언트 애플리케이션은 원격 서버에서 직접 기회 잠금을 요청해서는 안 됩니다. 네트워크 리디렉션자는 애플리케이션에 대한 기회 잠금을 투명하게 요청합니다. 이 작업을 사용하여 원격 서버에서 기회 잠금을 요청하면 요청이 거부됩니다.

DeviceIoControl 작업이 오류 코드 ERROR_IO_PENDING반환하면 oplock 요청이 부여됩니다. 다른 오류 코드를 반환하는 경우 oplock이 부여되지 않았습니다. 오류 코드가 ERROR_CANNOT_GRANT_REQUESTED_OPLOCK 같은 경고 값인 경우 REQUEST_OPLOCK_OUTPUT_BUFFER 구조에서 확장 정보를 사용할 수 있습니다.

부여된 oplock이 중단되면 OVERLAPPED 구조체의 이벤트 개체에 신호가 전송되고 정보가 REQUEST_OPLOCK_OUTPUT_BUFFER 구조에 반환됩니다. OVERLAPPED 구조의 내부 멤버는 oplock이 어떻게 끊어졌는지에 대한 확장 정보를 제공하는 NTSTATUS 값으로 설정됩니다.

겹쳐진. 내부 값 의미
STATUS_SUCCESS
0x0
다른 파일 시스템 작업으로 인해 oplock이 손상되었습니다.
STATUS_OPLOCK_HANDLE_CLOSED
0x00000216
oplock을 요청하는 데 사용된 파일 핸들이 닫혔기 때문에 oplock이 더 이상 적용되지 않습니다. oplock을 요청하는 데 사용된 핸들이 닫혔기 때문에 oplock이 중단되는 경우 oplock 형식에 관계없이 중단을 승인할 필요가 없습니다.
STATUS_OPLOCK_SWITCHED_TO_NEW_HANDLE
0x00000215
oplock은 여전히 유효합니다. 그러나 더 이상 요청하는 데 사용된 파일 핸들과 연결되지 않습니다. 호출자는 파일에 다른 핸들을 사용하여 새 oplock을 요청했으며, 해당 핸들은 이제 oplock을 소유합니다.

FSCTL_REQUEST_OPLOCK 제어 코드는 FSCTL_REQUEST_OPLOCK_LEVEL_1, FSCTL_REQUEST_OPLOCK_LEVEL_2, FSCTL_REQUEST_FILTER_OPLOCKFSCTL_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

RequestedOplockLevel 멤버가 OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE 설정된 FSCTL_REQUEST_OPLOCK 제어 코드를 사용하면 RH 형식의 oplock이 부여됩니다. RH oplock은 FSCTL_REQUEST_FILTER_OPLOCK 제어 코드에서 부여한 필터 oplock과 유사합니다. 그러나 필터 oplock을 사용하면 한 번에 하나의 클라이언트만 파일에 oplock을 유지할 수 있습니다. FSCTL_REQUEST_OPLOCK 한 번에 여러 클라이언트가 파일에 대한 RH 잠금을 가질 수 있습니다. 또 다른 차이점은 쓰기가 발생하기 전에 FSCTL_REQUEST_FILTER_OPLOCK oplock 중단 승인이 필요하다는 점입니다. 여기서 FSCTL_REQUEST_OPLOCK oplock 중단 알림은 권고 전용이며 쓰기는 승인 없이 진행할 수 있기 때문입니다. 자세한 내용은 중단 Oplocks참조하세요.

파일이 겹치지 않는(동기) 모드로 열려 있으면 FSCTL_REQUEST_OPLOCK 제어 코드가 실패합니다.

이 작업에 겹치는 I/O의 의미는 DeviceIoControl 항목의 설명 섹션을 참조하세요.

Windows 8 및 Windows Server 2012에서 이 코드는 다음 기술에서 지원됩니다.

기술 지원
SMB(서버 메시지 블록) 3.0 프로토콜 아니요
SMB 3.0 TFO(투명한 장애 조치(failover) 아니요
SO(스케일 아웃 파일 공유)가 있는 SMB 3.0 아니요
CsvFS(클러스터 공유 볼륨 파일 시스템)
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 oplock이 None으로 바뀝니다. 예를 들어 디렉터리에서 파일을 추가/삭제하고, 디렉터리에 있는 파일의 크기를 변경하고, 디렉터리에 있는 파일의 타임스탬프를 수정하면 디렉터리의 oplock이 모두 중단됩니다. 이 oplock 중단은 디렉터리의 변경이 발생하기 전에 승인이 필요하지 않습니다. 권고 전용입니다.

디렉터리 자체의 이름을 바꾸거나 삭제하면 디렉터리의 RH oplock이 R로 중단됩니다. 이 oplock 중단은 디렉터리 변경이 발생하기 전에 승인이 필요합니다.

요구 사항

요구
지원되는 최소 클라이언트 Windows 7 [데스크톱 앱만 해당]
지원되는 최소 서버 Windows Server 2008 R2 [데스크톱 앱만 해당]
헤더 winioctl.h(Windows.h 포함)

참고 항목

  • CreateFile
  • DeviceIoControl
  • 겹치는
  • oplock 의미 체계
  • 기회 잠금