ファイルに対して日和見ロック (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 構造体の Internal メンバーは NTSTATUS 値に設定され、oplock がどのように壊れたかについての拡張情報を提供します。
オーバー ラップ。内部値 | 意味 |
---|---|
STATUS_SUCCESS 0x0 |
oplock が別のファイル システム操作によって破損しました。 |
STATUS_OPLOCK_HANDLE_CLOSED 0x00000216 |
要求に使用されたファイル ハンドルが閉じられたため、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_OPLOCK、FSCTL_REQUEST_BATCH_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 コントロール コードによって付与されるフィルター 操作ロックに似ています。 ただし、フィルター 操作ロックでは、一度に 1 つのファイルに対して 1 つの oplock を保持できるクライアントは 1 つだけであることに注意してください。FSCTL_REQUEST_OPLOCK を使用すると、一度に複数のクライアントが RH ファイルをロックできます。 もう 1 つの違いは、FSCTL_REQUEST_FILTER_OPLOCK は書き込みを行う前に oplock ブレーク受信確認を必要とすることです。この場合、oplock ブレーク通知はアドバイザリ専用であり、書き込みは受信確認なしで先に進むことができるため、FSCTL_REQUEST_OPLOCK は行われません。 詳細については、「破壊的オプロックを参照してください。
ファイルが重複しない (同期) モードで開かれている場合、FSCTL_REQUEST_OPLOCK コントロール コードは失敗します。
この操作での重複した I/O の影響については、「DeviceIoControl」トピックの「解説」セクションを参照してください。
Windows 8 および Windows Server 2012 では、このコードは次のテクノロジでサポートされています。
テクノロジー | サポート |
---|---|
サーバー メッセージ ブロック (SMB) 3.0 プロトコル | いいえ |
SMB 3.0 透過的フェールオーバー (TFO) | いいえ |
SMB 3.0 とスケールアウト ファイル共有 (SO) | いいえ |
クラスター共有ボリューム ファイル システム (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 セマンティクス
- 日和見ロック