.Net を介して、または .Net の Win32 API にドロップして、Windows グローバル ファイル ロック テーブルにアクセスする方法はありますか?
個々のファイルをチェックしてロックがかかっているかどうかを確認する以外に、ファイルのグループがロックされているかどうかを判断するためのより良い解決策を探しています。
.Net を介して、または .Net の Win32 API にドロップして、Windows グローバル ファイル ロック テーブルにアクセスする方法はありますか?
個々のファイルをチェックしてロックがかかっているかどうかを確認する以外に、ファイルのグループがロックされているかどうかを判断するためのより良い解決策を探しています。
いいえ、リング0コードに格納されています。カーネル コード。デバイス ドライバーだけがアクセスできます。たとえば、SysInternals の Handle ユーティリティによって動的にインストールされる種類。その作成者は、文書化されていないカーネル構造をリバース エンジニアリングしてそのテーブルを見つけ、以前および将来のすべての Windows バージョンでそのコードを維持する意思があります。うまくいけば。
これは、意図的にユーザー モード コードからは手の届かないところにあります。プログラムがその種の情報を取得しようとするとき、何も良いことはありません。あなたの計画のように、ファイルがロックされているかどうかを確認します。これは、マルチタスク オペレーティング システムでは確実に機能しません。
それが機能し、IsLocked() 関数を作成するとします。ファイルがロックされていないことがわかった場合は、falseを返します。IsLocked() が呼び出し元に戻っているときに、スレッドを中断するオペレーティング システムのコンテキスト スイッチによってプリエンプトされる。そして、ファイルをロックする別のプロセスの別のスレッドに譲ります。スレッドが再開すると、呼び出し元はfalseになりますが、ファイルはロックされています。完全に失敗したクジラ。このようなバグは、トラブルシューティングが非常に困難です。それは起こりますが、それが機能しない理由を発見するのに十分な頻度ではありません.
ロックはアトミックである必要があり、ロックが正しく機能するためには絶対に不可欠です。つまり、テスト アンド セット操作は中断できないものでなければなりません。これは、Windows で行うのは非常に簡単で、ファイルを開くだけです。ロックを取得できない場合、それは失敗します。そうでない場合は、ロックも取得しているため、他の誰もそれを開くことができません。