Oplock은 FSCTL을 통해 요청됩니다. 다음 목록에서는 다양한 oplock 유형(사용자 모드 애플리케이션 및 커널 모드 드라이버에서 발급할 수 있는)에 대한 FSCTL을 보여 줍니다.
FSCTL_REQUEST_OPLOCK_LEVEL_1
FSCTL_REQUEST_OPLOCK_LEVEL_2
FSCTL_REQUEST_BATCH_OPLOCK
FSCTL_REQUEST_FILTER_OPLOCK
FSCTL_REQUEST_OPLOCK
목록의 처음 4개 FSCTL은 레거시 oplock을 요청하는 데 사용됩니다. 마지막 FSCTL은 deviceIoControl의 lpInBuffer 매개 변수로 전달된 REQUEST_OPLOCK_INPUT_BUFFER 구조체의 Flags 멤버에 지정된 REQUEST_OPLOCK_INPUT_FLAG_REQUEST 플래그를 사용하여 Windows 7개의 oplock을 요청하는 데 사용됩니다. 비슷한 방식으로 ZwFsControlFile을 사용하여 커널 모드에서 Windows 7개의 oplock을 요청할 수 있습니다. 파일 시스템 미니 필터는 FltAllocateCallbackData 및 FltPerformAsynchronousIo를 사용하여 Windows 7 oplock을 요청해야 합니다. 필요한 4개의 Windows 7개의 oplock 중 하나 이상의 플래그가 OPLOCK_LEVEL_CACHE_READ, OPLOCK_LEVEL_CACHE_HANDLE 또는 OPLOCK_LEVEL_CACHE_WRITE REQUEST_OPLOCK_INPUT_BUFFER 구조체의 RequestedOplockLevel 멤버에 설정됩니다. 자세한 내용은 FSCTL_REQUEST_OPLOCK 참조하세요.
oplock에 대한 요청이 수행되고 oplock을 부여할 수 있는 경우 파일 시스템은 STATUS_PENDING 반환합니다(이 때문에 동기 I/O에 대해 oplock이 부여되지 않음). FSCTL IRP는 oplock이 손상될 때까지 완료되지 않습니다. oplock을 부여할 수 없는 경우 적절한 오류 코드가 반환됩니다. 가장 일반적으로 반환되는 오류 코드는 STATUS_OPLOCK_NOT_GRANTED 및 STATUS_INVALID_PARAMETER(및 이와 동등한 사용자 모드 아날로그)입니다.
앞에서 설명한 것처럼 Filter oplock을 사용하면 다른 애플리케이션/클라이언트가 동일한 스트림에 액세스하려고 할 때 애플리케이션이 "백아웃"할 수 있습니다. 이 메커니즘을 사용하면 스트림을 열려고 할 때 다른 스트림 접근자가 공유 위반을 수신하지 않고도 애플리케이션이 스트림에 액세스할 수 있습니다. 위반을 공유하지 않도록 하려면 특수한 3단계 프로시저를 사용하여 필터 oplock(FSCTL_REQUEST_FILTER_OPLOCK)을 요청해야 합니다.
FILE_READ_ATTRIBUTES 필요한 액세스 권한과 공유 모드의 FILE_SHARE_READ | 파일을 엽니다. FILE_SHARE_WRITE | FILE_SHARE_DELETE.
1단계에서 핸들에 필터 oplock을 요청합니다.
읽기 액세스를 위해 파일을 다시 엽니다.
1단계에서 열린 핸들은 데이터 액세스(FILE_READ_DATA)가 아닌 특성 액세스(FILE_READ_ATTRIBUTES)에 대해서만 열려 있으므로 다른 애플리케이션에서 공유 위반을 수신하지 않습니다. 이 핸들은 필터 oplock을 요청하는 데 적합하지만 데이터 스트림에서 실제 I/O를 수행하는 데는 적합하지 않습니다. 3단계에서 열린 핸들을 사용하면 oplock의 소유자가 스트림에서 I/O를 수행할 수 있으며, 2단계에서 부여된 oplock을 사용하면 oplock 소유자가 스트림에 액세스하려는 다른 애플리케이션에 대한 공유 위반을 일으키지 않고도 "방해가 될 수 있습니다".
NTFS 파일 시스템은 FILE_RESERVE_OPFILTER 만들기 옵션 플래그를 통해 이 절차에 대한 최적화를 제공합니다. 이전 절차의 1단계에서 이 플래그를 지정하면 파일 시스템에서 2단계가 실패할 것이라고 판단할 수 있는 경우 파일 시스템에서 STATUS_OPLOCK_NOT_GRANTED 사용하여 만들기 요청에 실패할 수 있습니다. 1단계가 성공하면 만들기 요청에 대해 FILE_RESERVE_OPFILTER 지정되었더라도 2단계가 성공한다는 보장은 없습니다.
다음 표에서는 oplock을 부여하는 데 필요한 조건을 식별합니다.
요청 유형
조건
수준 1
Assert
Batch
다음 조건이 모두 충족되는 경우에만 허용됩니다.
요청은 지정된 파일 스트림에 대한 것입니다.
디렉터리인 경우 STATUS_INVALID_PARAMETER 반환됩니다.
ASYNCHRONOUS 액세스를 위해 스트림이 열립니다.
SYNCHRONOUS 액세스를 위해 열린 경우 STATUS_OPLOCK_NOT_GRANTED 반환됩니다(동기 I/O 요청에 대해 oplock이 부여되지 않음).