Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Ağ yeniden yönlendiricisi uzak sunuculardaki dosyalara eriştiğinde, uzak sunucudan oplock'u istemektedir. İstemci uygulamaları, yalnızca kilit yerel sunucudaki bir dosyaya yönelik olduğunda doğrudan oplock isteğinde bulunur.
OplocksFSCTLs aracılığıylaistenir. Aşağıdaki FSCTL'ler, farklı oplock türleri için kullanılmaktadır ve hem kullanıcı modu uygulamaları hem de çekirdek modu sürücüleri tarafından kullanılabilir.
- Windows 7 oplocks talep etmek için:
- Eski oplock'ları istemek için:
Kullanıcı modunda oplock isteme
Kullanıcı modunda Bir Windows 7 oplock istemek için DeviceIoControlçağrısı yapın:
- dwIoControlCode değerini FSCTL_REQUEST_OPLOCKolarak ayarlayın.
-
lpInBuffer parametresindeki bir REQUEST_OPLOCK_INPUT_BUFFER yapısına işaretçi geçirin.
- Oplock isteğini biçimlendirme hakkında bilgi için bu yapının belgelerine bakın.
- lpOutBuffer parametresinde bir işaretçiyi REQUEST_OPLOCK_OUTPUT_BUFFER yapısına geçirin.
Daha fazla bilgi için bkz. FSCTL_REQUEST_OPLOCK.
İstenen oplock verilebilirse, DeviceIoControl FALSE döndürür ve GetLastError ERROR_IO_PENDING döndürür. Bu nedenle, eşzamanlı G/Ç için oplock'a hiçbir zaman izin verilmez. Çakışan işlem, oplok bozulana kadar tamamlanmaz. İşlem tamamlandıktan sonra, REQUEST_OPLOCK_OUTPUT_BUFFER oplock kesintisi hakkında bilgi içerir.
Oplock verilemiyorsa, dosya sistemi uygun bir hata kodu döndürür. En sık döndürülen hata kodları ERROR_OPLOCK_NOT_GRANTED ve ERROR_INVALID_PARAMETER.
Çekirdek modunda oplock isteme
Windows 7 oplock'larını çekirdek modda istemek için:
Dosya sistemi mini filtreleri
Dosya sistemi mini filtresinin FltAllocateCallbackData kullanması ve ayrılan FLT_CALLBACK_DATA şu şekilde doldurması gerekir:
- Iopb->MajorFunction alanını IRP_MJ_FILE_SYSETM_CONTROLolarak ayarlayın.
- Iopb->MinorFunction alanını IRP_MN_USER_FS_REQUEST olarak ayarlayın.
- Iopb->Parametrelerini FileSystemControl.Buffered.FsControlCode üyesini FSCTL_REQUEST_OPLOCK olarak ayarlayın.
- Boyutu, REQUEST_OPLOCK_INPUT_BUFFER veya REQUEST_OPLOCK_OUTPUT_BUFFERdeğerlerinden daha büyük olana eşit olan bir arabellek ayırın.
- Ayrılan FLT_CALLBACK_DATA'ın Iopb->Parameters.FileSystemControl.Buffered.SystemBuffer üyesini, bu arabelleği gösterecek şekilde ayarlayın.
- Ayrılan FLT_CALLBACK_DATA'nin Iopb->Parameters.FileSystemControl.Buffered.InputBufferLength ve Iopb->Parameters.FileSystemControl.Buffered.OutputBufferLength alanlarını, bu arabelleğin boyutuyla eşleşecek şekilde ayarlayın.
oplock isteğini biçimlendirme hakkında bilgi için REQUEST_OPLOCK_INPUT_BUFFER yapısının belgelerine bakın.
Ardından, dosya sistemi minifiltresi, ayrılmış FLT_CALLBACK_DATA parametresini CallbackData olarak geçirerek FltPerformAsynchronousIoçağrısını gerçekleştirmelidir.
İstenen oplock verilebilirse, FltPerformAsynchronousIo çağrısı STATUS_PENDING döndürür. Bu nedenle, eşzamanlı G/Ç için oplock'a hiçbir zaman izin verilmez. İşlem, oplock bozulana kadar tamamlanmaz. İşlem tamamlandıktan sonra, REQUEST_OPLOCK_OUTPUT_BUFFER oplock kesintisi hakkında bilgi içerir.
Oplock verilemiyorsa, dosya sistemi uygun bir hata kodu döndürür. En sık döndürülen hata kodları STATUS_OPLOCK_NOT_GRANTED ve STATUS_INVALID_PARAMETER.
Diğer Sürücü Türleri
Diğer sürücü türleri ZwFsControlFileçağırabilir:
- FSCTL_REQUEST_OPLOCK 'ü FsControlCode olarakayarlayın.
- Bir işaretçiyi, REQUEST_OPLOCK_INPUT_BUFFER yapısı içinde InputBuffer parametresine geçirin ve InputBufferLength parametresini bu arabelleğin boyutuna ayarlayın.
- OutputBuffer parametresine REQUEST_OPLOCK_OUTPUT_BUFFER yapısına işaret eden bir işaretçi geçirin ve OutputBufferLength parametresini bu arabelleğin boyutuna ayarlayın.
oplock isteğini biçimlendirme hakkında bilgi için REQUEST_OPLOCK_INPUT_BUFFER yapısının belgelerine bakın.
İstenen oplock verilebilirse, ZwFsControlFile çağrısı STATUS_PENDING döndürür. Bu nedenle, eşzamanlı G/Ç için oplock'a hiçbir zaman izin verilmez. İşlem, oplock bozulana kadar tamamlanmaz. İşlem tamamlandıktan sonra, REQUEST_OPLOCK_OUTPUT_BUFFER oplock kesintisi hakkında bilgi içerir.
Oplock verilemiyorsa, dosya sistemi uygun bir hata kodu döndürür. En sık döndürülen hata kodları STATUS_OPLOCK_NOT_GRANTED ve STATUS_INVALID_PARAMETER.
Oplock İsterken Paylaşım İhlallerini Önleme
Atomic Create-With-Oplock Yöntemini Kullanma
Atomik create-with-oplock bir oplock türü değildir. Bunun yerine, açık işlemlerin dosya açma ile oplock alma arasındaki zaman aralığında paylaşım modu ihlallerine neden olmaktan kaçınmasına olanak tanıyan bir yordamdır. Eski tip oplock'larla, oplock filtrelemesi yapmak ve iki tutamacı açmak gerekir. Windows 7'deki oplock'larla, bir uygulama veya sürücü bu prosedürü kullanarak her tür oplock isteyebilir ve yalnızca bir tanıtıcı açması gerekir.
Atomik oplock ile oluşturma işlemini gerçekleştirmek için yapmanız gerekenler:
- Dosyayı açmak için FltCreateFileEx2 veya ZwCreateFilekullanın. CreateOptions parametresine FILE_OPEN_REQUIRING_OPLOCKbayrağını geçirin. Parametreleri istediğiniz gibi DesiredAccess ve ShareAccess olarak ayarlayabilirsiniz. Örneğin, dosyayı okuyabilmeniz için DesiredAccess parametre kümesinde GENERIC_READ ayarlayın ve dosyayı açıkken başkalarının onu okumasına, yeniden adlandırmasına ve/veya silme için işaretlemesine izin vermek için ShareAccess parametresinde FILE_SHARE_READ | FILE_SHARE_DELETE bayraklarını ayarlayın.
- Bir dosya nesnesi veya tanıtıcısında bir oplock istemek için FSCTL_REQUEST_OPLOCK denetim kodunu kullanın, çekirdek modunda oplock istemeyle ilgili bölümünde açıklandığı gibi.
1. ve 2. adımlar arasında dosya üzerinde herhangi bir dosya sistemi işlemi gerçekleştirmeyin. Bunu yapmak kilitlenmelere neden olabilir.
Bu yordamı kullanarak istekte bulunulacak en yaygın oplock, Read-Handle türüdür. Bu, diğer arayanlara mümkün olduğunca çok eş zamanlı erişim izni verirken, çakışan bir açıkta paylaşım ihlaline neden olmamak için tanıtıcıyı kapatmanız gerektiğinde size bildirim yapılmasını sağlar.
Eski Filtre Oplock'unu kullanma
Eski Filter oplock ayrıca diğer uygulamalar/istemciler aynı akışa erişmeye çalıştığında uygulamanın "geri çekmesine" olanak tanır, ancak atomik create-with-oplock yönteminden daha az esnektir. Bu mekanizma, bir uygulamanın akışı açmaya çalışırken akışın diğer erişimcilerinin paylaşım ihlalleri almasına neden olmadan bir akışa erişmesine olanak tanır. Paylaşım ihlallerini önlemek için, bir Filter oplock istemek üzere aşağıdaki üç adımlı prosedür kullanılmalıdır:
Gerekli erişim FILE_READ_ATTRIBUTES ve bir paylaşım modu olarak FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE ile dosyayı aç. Bu adımda açılan tanıtıcı, veri erişimi (FILE_READ_DATA) değil yalnızca öznitelik erişimi (FILE_READ_ATTRIBUTES) için açık olduğundan diğer uygulamaların paylaşım ihlalleri almasına neden olmaz. Bu kulp, Filtre işlem kilidini istemek için uygundur, ancak veri akışında gerçek G/Ç işlemlerini gerçekleştirmeye uygun değildir.
1. adımda elde edilen tanıtıcı üzerinde bir Filtre işlem kilidi (FSCTL_REQUEST_FILTER_OPLOCK) isteyin. Bu adımda verilen oplock, oplock sahibinin akışa erişmeye çalışan başka bir uygulamada paylaşım ihlaline neden olmadan "yoldan çıkmasını" sağlar.
Dosyayı okuma erişimi için yeniden açın. Bu adımda açılan kol, oplok sahibinin veri akışında G/Ç yapmasına olanak tanır.
NTFS dosya sistemi, FILE_RESERVE_OPFILTER oluşturma seçeneği bayrağı aracılığıyla bu yordam için bir iyileştirme sağlar. Önceki prosedürün 1. adımında bu bayrak belirtilirse ve dosya sistemi 2. adımın başarısız olacağını saptayabiliyorsa, dosya sistemi oluşturma isteğini STATUS_OPLOCK_NOT_GRANTED ile başarısız olarak sonuçlandırabilir. 1. adım başarılı olursa, oluşturma isteği için FILE_RESERVE_OPFILTER belirtilmiş olsa bile 2. adımın başarılı olacağı garanti edilmez.
Oplock verme koşulları
Aşağıdaki tabloda bir oplock vermek için gereken koşullar tanımlanmıştır.
| İstek türü | Koşul -ları |
|---|---|
Düzey 1 Filtre Toplu iş |
Yalnızca aşağıdaki koşulların tümü doğruysa verilir:
Geçerli oplock durumu ise:
|
Düzey 2 |
Yalnızca aşağıdaki koşulların tümü doğruysa verilir:
Geçerli oplock durumu ise:
|
Okumak |
Yalnızca aşağıdaki koşulların tümü doğruysa verilir:
Geçerli oplock durumu ise:
|
Read-Handle |
Yalnızca aşağıdaki koşulların tümü doğruysa verilir:
Geçerli oplock durumu ise:
|
Okuma-Yazma |
Yalnızca aşağıdaki koşulların tümü doğruysa verilir:
Geçerli oplock durumu ise:
|
Okuma-Yazma-Kullanım |
Yalnızca aşağıdakilerin tümü doğruysa verilir:
Geçerli oplock durumu ise:
|
Not
Okuma ve Düzey 2 oplock'ları aynı akışta birlikte var olabilir ve Okuma ile Okuma-Kolu (Read-Handle) oplock'ları bir arada bulunabilir, ancak Düzey 2 ve Okuma-Kolu oplock'ları birlikte olamaz.