Bagikan melalui


FSCTL_REQUEST_OPLOCK IOCTL (winioctl.h)

Meminta kunci oportunistik (oplock) pada file dan mengakui bahwa pembobolan oplock telah terjadi.

Untuk melakukan operasi ini, panggil fungsi DeviceIoControl menggunakan parameter berikut.

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
);

Keterangan

Operasi ini hanya digunakan oleh aplikasi klien yang meminta kunci oportunistik (oplock) dari server lokal. Aplikasi klien yang meminta kunci oportunistik dari server jarak jauh tidak boleh memintanya secara langsung—pengalih jaringan secara transparan meminta kunci oportunistik untuk aplikasi. Upaya untuk menggunakan operasi ini untuk meminta kunci oportunistik dari server jarak jauh akan mengakibatkan permintaan ditolak.

Kode kontrol FSCTL_REQUEST_OPLOCK menyediakan fungsionalitas yang lebih efisien daripada kode kontrol terkait berikut: FSCTL_REQUEST_OPLOCK_LEVEL_1, FSCTL_REQUEST_OPLOCK_LEVEL_2, FSCTL_REQUEST_FILTER_OPLOCK, dan FSCTL_REQUEST_BATCH_OPLOCK. Meminta tingkat oplock yang berbeda dapat dilakukan berulang kali pada handel yang sama tanpa menutup dan membuka kembali handel saat menggunakan FSCTL_REQUEST_OPLOCK; kode kontrol lainnya mengharuskan handel ditutup dan kemudian dibuka kembali dengan CreateFile untuk membuat perubahan seperti itu. Ini dicapai dengan memanipulasi anggota RequestedOplockLevel dari struktur REQUEST_OPLOCK_INPUT_BUFFER saat menerbitkan kembali kode kontrol FSCTL_REQUEST_OPLOCK .

Tabel berikut ini meringkas bagaimana kemampuan penembolokan jenis oplock yang tersedia dari FSCTL_REQUEST_OPLOCK sesuai dengan tingkat 2, tingkat 1, dan oplock batch.

Kode kontrol alternatif Nilai bendera RequestedOplockLevel yang setara Jenis 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

Menggunakan kode kontrol FSCTL_REQUEST_OPLOCK dengan anggota RequestedOplockLevel yang diatur untuk OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE memberikan oplock jenis RH. RH oplock mirip dengan oplock filter yang diberikan oleh kode kontrol FSCTL_REQUEST_FILTER_OPLOCK . Namun, perhatikan bahwa oplock filter hanya memungkinkan satu klien untuk menahan oplock pada file pada satu waktu; FSCTL_REQUEST_OPLOCK memungkinkan beberapa klien pada satu waktu untuk mengunci RH pada file. Perbedaan lain adalah bahwa FSCTL_REQUEST_FILTER_OPLOCK memerlukan pengakuan putus oplock sebelum penulisan dapat terjadi, di mana FSCTL_REQUEST_OPLOCK tidak karena pemberitahuan oplock break hanya nasihat dan penulisan diizinkan untuk melanjutkan tanpa pengakuan. Untuk informasi selengkapnya, lihat Melanggar Oplocks.

Kode kontrol FSCTL_REQUEST_OPLOCK gagal jika file dibuka dalam mode tidak tumpang tindih (sinkron).

Untuk implikasi I/O yang tumpang tindih pada operasi ini, lihat bagian Keterangan dari topik DeviceIoControl .

Di Windows 8 dan Windows Server 2012, kode ini didukung oleh teknologi berikut.

Teknologi Didukung
Protokol Server Message Block (SMB) 3.0 Tidak
SMB 3.0 Transparent Failover (TFO) Tidak
SMB 3.0 dengan Scale-out File Shares (SO) Tidak
Sistem File Volume Bersama Kluster (CsvFS) Ya
Sistem File Tangguh (ReFS) Ya

Selain itu, mulai Windows 8 dan Windows Server 2012, kode kontrol FSCTL_REQUEST_OPLOCK dapat digunakan untuk meminta oplock pada direktori serta file. Permintaan oplock pada direktori dapat menentukan salah satu OPLOCK_LEVEL_CACHE_READ atau OPLOCK_LEVEL_CACHE_READ | OPLOCK_LEVEL_CACHE_HANDLE di anggota RequestedOplockLevel.

Oplock R atau RH pada direktori diputuskan ke Tidak Ada saat konten enumerasi direktori akan berubah. Misalnya, menambahkan/menghapus file di direktori, mengubah ukuran file di direktori, memodifikasi tanda waktu file di direktori, dll., semuanya akan merusak oplock pada direktori. Jeda oplock ini tidak memerlukan pengakuan sebelum perubahan direktori dapat terjadi; itu hanya saran.

RH oplock pada direktori diputuskan ke R saat direktori itu sendiri diganti namanya atau dihapus. Jeda oplock ini memang memerlukan pengakuan sebelum perubahan ke direktori dapat terjadi.

Persyaratan

   
Klien minimum yang didukung Windows 7 [hanya aplikasi desktop]
Server minimum yang didukung Windows Server 2008 R2 [hanya aplikasi desktop]
Header winioctl.h (termasuk Windows.h)

Lihat juga