Poznámka
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Když přesměrovač sítě přistupuje k souborům na vzdálených serverech, požádá o oplock ze vzdáleného serveru. Klientské aplikace přímo požadují oplocks pouze v případě, že zámek je určený pro soubor na místním serveru.
oplocks se vyžadují prostřednictvím FSCTLs. Následující FSCTLs se používají pro různé typy oplock, které mohou být vydávány jak aplikacemi v uživatelském režimu, tak i ovladači v režimu jádra.
- Žádost o oplocks systému Windows 7:
- Požadavek na starší oplocky:
Žádost o oplock v uživatelském režimu
Pokud chcete požádat o oplock systému Windows 7 v uživatelském režimu, zavolejte DeviceIoControl:
- Nastavte dwIoControlCode na FSCTL_REQUEST_OPLOCK.
- Předejte ukazatel na REQUEST_OPLOCK_INPUT_BUFFER strukturu v parametru lpInBuffer.
- Informace o formátování požadavku oplock najdete v dokumentaci této struktury.
- Předejte ukazatel na REQUEST_OPLOCK_OUTPUT_BUFFER strukturu v parametru lpOutBuffer.
Pro další informace viz FSCTL_REQUEST_OPLOCK.
Pokud lze požadované oplock udělit, DeviceIoControl vrátí hodnotu FALSE a GetLastError vrátí ERROR_IO_PENDING. Z tohoto důvodu nejsou zámky oplock nikdy poskytovány pro synchronní vstupně-výstupní operace. Překrývající se operace se nedokončí, dokud nedojde k přerušení oplocku. Po dokončení operace bude REQUEST_OPLOCK_OUTPUT_BUFFER obsahovat informace o přerušení oplocku.
Pokud oplock nelze udělit, systém souborů vrátí odpovídající kód chyby. Nejčastěji vrácené kódy chyb jsou ERROR_OPLOCK_NOT_GRANTED a ERROR_INVALID_PARAMETER.
Vyžádání oplocku v režimu jádra
Pokud chcete požádat o oplocky Windows 7 v režimu jádra:
Minifiltry systému souborů
Minifiltr systému souborů musí používat FltAllocateCallbackData a vyplnit přidělené FLT_CALLBACK_DATA takto:
- Nastavte ->MajorFunction pole na IRP_MJ_FILE_SYSTEM_CONTROL.
- Nastavte pole Iopb->MinorFunction na IRP_MN_USER_FS_REQUEST.
- Nastavte proměnnou člena Iopb->Parametry.FileSystemControl.Buffered.FsControlCode na FSCTL_REQUEST_OPLOCK.
- Přidělit vyrovnávací paměť, jejíž velikost je rovna většímu z čísel mezi REQUEST_OPLOCK_INPUT_BUFFER a REQUEST_OPLOCK_OUTPUT_BUFFER.
- Nastavte přidělený FLT_CALLBACK_DATAIopb->Parameters.FileSystemControl.Buffered.SystemBuffer člen tak, aby odkazoval na danou vyrovnávací paměť.
- Nastavte přidělené FLT_CALLBACK_DATAIopb->Parameters.FileSystemControl.Buffered.InputBufferLength a Iopb->Parameters.FileSystemControl.Buffered.OutputBufferLength pole na velikost této vyrovnávací paměti.
Informace o tom, jak formátovat požadavek oplock, najdete v dokumentaci struktury REQUEST_OPLOCK_INPUT_BUFFER.
Poté musí minifiltr souborového systému zavolat FltPerformAsynchronousIoa předat jako parametr CallbackData přidělené FLT_CALLBACK_DATA.
Pokud je možné udělit požadovaný oplock, vrátí volání FltPerformAsynchronousIo STATUS_PENDING. Z tohoto důvodu nejsou zámky oplock nikdy poskytovány pro synchronní vstupně-výstupní operace. Operace se nedokončí, dokud nedojde k přerušení oplocku. Po dokončení operace bude REQUEST_OPLOCK_OUTPUT_BUFFER obsahovat informace o přerušení oplocku.
Pokud oplock nelze udělit, systém souborů vrátí odpovídající kód chyby. Nejčastěji vrácené kódy chyb jsou STATUS_OPLOCK_NOT_GRANTED a STATUS_INVALID_PARAMETER.
Další druhy ovladačů
Jiné druhy ovladačů mohou volat ZwFsControlFile:
- Nastavte FsControlCode na FSCTL_REQUEST_OPLOCK.
- Předejte ukazatel na strukturu REQUEST_OPLOCK_INPUT_BUFFER v parametru InputBuffer a nastavte parametr InputBufferLength na rozměr tohoto bufferu.
- Předejte ukazatel na REQUEST_OPLOCK_OUTPUT_BUFFER strukturu v parametru OutputBuffer a nastavte parametr OutputBufferLength na velikost této struktury.
Informace o tom, jak formátovat požadavek oplock, najdete v dokumentaci struktury REQUEST_OPLOCK_INPUT_BUFFER.
Pokud lze požadované oplock udělit, volání ZwFsControlFile vrátí STATUS_PENDING. Z tohoto důvodu nejsou zámky oplock nikdy poskytovány pro synchronní vstupně-výstupní operace. Operace se nedokončí, dokud není oplock zrušen. Po dokončení operace bude REQUEST_OPLOCK_OUTPUT_BUFFER obsahovat informace o přerušení oplocku.
Pokud oplock nelze udělit, systém souborů vrátí odpovídající kód chyby. Nejčastěji vrácené kódy chyb jsou STATUS_OPLOCK_NOT_GRANTED a STATUS_INVALID_PARAMETER.
Zabránění porušení sdílení při vyžádání oplocků
Použití metody Atomic Create-With-Oplock
Atomic create-with-oplock není typ oplocku. Jedná se spíše o postup, který umožňuje otevřeným operacím zabránit porušení režimu sdílení v časovém intervalu mezi otevřením souboru a příjmem oplocku. U starších oplocků jsou vyžadovány filtrační oplocky a otevření dvou popisovačů. V případě oplocků ve Windows 7 může aplikace nebo ovladač požádat o libovolný typ oplock pomocí tohoto postupu a stačí otevřít pouze jeden popisovač.
Pokud chcete provést atomickou proceduru create-with-oplock, měli byste:
- K otevření souboru použijte FltCreateFileEx2 nebo ZwCreateFile. V parametru CreateOptions předejte příznak FILE_OPEN_REQUIRING_OPLOCK. Podle potřeby můžete nastavit parametry DesiredAccess a ShareAccess. Například v sadě parametrů DesiredAccessGENERIC_READ, abyste mohli soubor číst, a v parametru ShareAccess nastavte FILE_SHARE_READ | FILE_SHARE_DELETE příznaky, které ostatním umožní číst, přejmenovat nebo označit soubor pro odstranění, když ho máte otevřený.
- Pomocí řídicího kódu FSCTL_REQUEST_OPLOCK požádejte o zámek (oplock) u výsledného objektu nebo popisovače souboru, jak je popsáno v Žádost o zámek (oplock) v režimu jádra.
Neprovádějte žádné operace se systémem souborů v souboru mezi kroky 1 a 2. To může způsobit zablokování.
Nejběžnější oplock pro vyžádání pomocí tohoto postupu je typ Read-Handle. To vám umožní poskytnout ostatním volajícím co nejvíce souběžného přístupu, zatímco stále můžete být upozorněni, pokud potřebujete zavřít svůj popisovač, abyste zabránili narušení sdílení při konfliktním otevření.
Použití starší verze filtrového oplocku
Starší oplock filtru také umožňuje aplikaci "back out", když se ostatní aplikace nebo klienti pokusí o přístup ke stejnému streamu, ale je méně flexibilní než atomická metoda create-with-oplock. Tento mechanismus umožňuje aplikaci přistupovat k datovému proudu, aniž by způsoboval, že ostatní uživatelé datového proudu při pokusu o jeho otevření obdrží porušení sdílení. Abyste se vyhnuli porušení sdílení, měli byste použít následující třístupňový postup k vyžádání oplocku filtrů:
Otevřete soubor s požadovaným přístupem FILE_READ_ATTRIBUTES v režimu sdílení FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE. Popisovač otevřený v tomto kroku nezpůsobí, že ostatní aplikace obdrží porušení sdílení, protože je otevřený jenom pro přístup k atributům (FILE_READ_ATTRIBUTES) a ne pro přístup k datům (FILE_READ_DATA). Tento popisovač je vhodný pro vyžádání oplocku filtru, ale ne pro provádění skutečných vstupně-výstupních operací datového streamu.
Na popisovači z kroku 1 požádejte o oplock filtru (FSCTL_REQUEST_FILTER_OPLOCK). Oplock udělený v tomto kroku umožňuje držiteli oplocku "vyjít z cesty", aniž by způsobil porušení sdílení jiné aplikace, která se pokusí o přístup ke streamu.
Znovu otevřete soubor pro čtení. Popisovač otevřený v tomto kroku umožňuje držiteli oplocku provádět vstupně-výstupní operace ve streamu.
Systém souborů NTFS poskytuje optimalizaci pro tento postup prostřednictvím příznaku FILE_RESERVE_OPFILTER vytvořit možnost. Pokud je tento příznak zadán v kroku 1 předchozího postupu, umožní systému souborů zamítnout žádost o vytvoření se STATUS_OPLOCK_NOT_GRANTED, pokud systém souborů může určit, že krok 2 selže. Pokud krok 1 proběhne úspěšně, neexistuje žádná záruka, že krok 2 bude úspěšný, i když FILE_RESERVE_OPFILTER byl zadán pro požadavek vytvoření.
Podmínky pro udělení oplocků
Následující tabulka uvádí požadované podmínky nezbytné k udělení oplocku.
Typ požadavku | Podmínky |
---|---|
Úroveň 1 Filtr Várka |
Uděleno pouze v případě, že jsou splněny všechny následující podmínky:
Pokud je aktuální stav oplocku:
|
Úroveň 2 |
Uděleno pouze v případě, že jsou splněny všechny následující podmínky:
Pokud je aktuální stav oplocku:
|
Číst |
Uděleno pouze v případě, že jsou splněny všechny následující podmínky:
Pokud je aktuální stav oplocku:
|
Read-Handle |
Uděleno pouze v případě, že jsou splněny všechny následující podmínky:
Pokud je aktuální stav oplocku:
|
Read-Write |
Uděleno pouze v případě, že jsou splněny všechny následující podmínky:
Pokud je aktuální stav oplocku:
|
Čtení –Write-Handle |
Uděleno pouze v případě, že jsou splněny všechny následující podmínky:
Pokud je aktuální stav oplocku:
|
Poznámka
Operace čtení a spolupráce úrovně 2 mohou existovat ve stejném datovém proudu a operace čtení a Read-Handle můžou existovat společně, ale spolupráce úrovně 2 a Read-Handle nemůže existovat.