2016-04-14 11 views
3

すべてのプロセスのすべてのファイルハンドルの一覧が表示されているので、どのハンドルが実際にファイルをロックしているかをどのように確認できますか?ファイルがプロセスファイルハンドルによってロックされているかどうかを確認します

私が理解しているところでは、単にファイルを開いてすべてのアクセス許可を取得しようとすると、何か問題が生じた場合はロックされていることがわかります。しかし、それは非常に非効率的です。私は既にハンドルがあることを意味ハンドルがどのアクセス許可を確認する方法はありますか?

好ましくは、Windows XP以上で動作するソリューションをご覧ください。

私はすでにGetFileInformationByHandleEx機能で検索しましたが、アクセス許可については何も見つかりませんでした。 :/

編集: ファイルのロックに関するリアルタイム情報は必要ありません。私が作業しようとしているファイルは、特定のアプリケーションが閉じられるか、全くロックされなくなるまでロックされます。

+3

許可よりも許してもらうほうがいい –

+0

読み取り/書き込みはハンドルの所有者だけであるので、ハンドルに書き込むことによってファイルの「ロック」を読むことができます。 – Joel

+7

これを行う方法はありません。どのような種類のIsFileLocked()関数も、マルチタスクオペレーティングシステムでは決して確実に動作しません。返される値は即座に失効し、ファイルにアクセスしようとするとまだロックされていないという保証はありません。あなたはアトミックなファイルにアクセスすることで見つけます。それは非効率的ではなく、ロックされているときだけあなたがすることがあります。仮説的なIsFileLocked()関数がTRUEを返した場合とまったく同じことです。ファイルを開くときに別のプロセスがファイルをロックしないようにして、これを避けてください。 –

答えて

0

この質問はWin32 files locked for reading: how to find out who's locking themの複製です。

また、Hans Passantの解説は正しいです:Win32ファイルのロック状態を照会すると古い情報が返されます。この警告を無視すると、見つけにくいバグが発生します。

ファイルにアクセスすると思われるコードをすべて制御する場合は、ロックされたファイルを照会するのではなく、プロセス間通信にnamed pipeを使用することをお勧めします。

+0

実際には重複していません。私は読み込みロックに興味があるだけではありません。私はどんな種類のロックにも興味があります。ファイル内の特定の領域だけをロックする、ロック、削除、書き込み、読み取り、およびロック。また、情報がどれほど古くても問題はありません。そして、私はパイピング機能とそれ以外のものを注入するプロセスをリバースエンジニアリングするつもりはない。 – Forivin

0

あなたは、次のようなハンドルに関する情報を取得するためにNtQueryObject APIを使用することができます。

ULONG Attributes; 
ACCESS_MASK GrantedAccess; 

それとも、FileInformationClassパラメータのFileModeInformationFileAccessInformation値を使用してNtQueryInformationFileを使用して同じ情報にアクセスできます。

+0

私は多くのテストファイルを作成し、読み込み/書き込み/削除と書き込みロックアクセスのすべての組み合わせでそれらのハンドルを作成しました。次に、SeDebugPrivilegeなどで昇格された別のアプリケーションでは、GrantedAccess、Attributes、Flagsなどを確認しました。結果は次のとおりです。http://i.snag.gy/uHOMr.jpgどちらもロック状態に関する有用な情報。 – Forivin

関連する問題