8

これは、ここにある別の質問への追加です。

要するに 、システム上で開いているすべてのファイルを一覧表示し、関連するファイル名を取得したいと思います。これが間違ったアプローチである場合、または別の方法がある場合は、正しい方向にプッシュしてください。または、詳細が不足している場合や不明な点がある場合は、怒鳴ってください。

他の質問 (上記のリンク) のように、私は言語を気にしません (C または C++ のソリューションは問題ありません) が、これが Windows XP で動作することを望みます。また、カーネル モード ドライバーを避ける必要があります。

この質問に対する元の解決策で私が抱えている問題は、ファイル ハンドルが特定の方法で開かれた場合、NtQueryObject呼び出しがハングする可能性があることです。これについては、こちらの SysInternals フォーラムで概説されています。

SysInternals フォーラムによると、タイムアウトで CreateThread を使用することは受け入れられた解決策ですが、それを行うと、毎回プロセスを適切に閉じることができないようです。これを Visual Studio でデバッグしているときでも、コンピューターの再起動を余儀なくされることがあります。これを実行するときに時々コンピューターを再起動する必要があるのは、最良の選択肢ではありません。

受け入れられている別の解決策は、特定の でハンドルをスキップすることGrantedAccessです。私が抱えている問題はGrantedAccess、上記のフォーラムの投稿で概説されているように、あまりにも多くのハンドルが役に立たないことです。

私の問題の解決策を教えてくれる人はいますか?

ありがとう!

編集:申し訳ありませんが、私の問題についてもっと具体的にすべきでした。NtQuerySystemInformation呼び出しはハンドルを取得し、呼び出さNtQueryObjectObjectNameInformationたものは同期パイプであるハンドルでハングします (少なくとも、人々はそう言っているようです)。ここに掲載されている例では、カーネル モード ドライバーを使用して FILE_OBJECT からファイル名を読み取りますが、ドライバーの使用は避けたいと考えています。そうです、SysInternals Handle ユーティリティによく似ていますが、ドライバーも使用していると思いますよね。

編集 2 : これは一種の学術的関心であるため、将来のバージョンで壊れる可能性のあるネイティブ API またはその他の文書化されていない手法の使用は問題ではありません。また、GrantedAccessぶら下がっているオブジェクトを回避するだけでも完璧です。

編集 3 : 私の最終目標は、システム上で現在開いているファイルを確認できるようにすることです。これが完全に間違ったアプローチである場合は、正しい方向への別のポイントをいただければ幸いです。

編集:Vista +にはより洗練されたソリューションがあるため、これはWindows XPで動作する必要があるだけなので、文書化されていない機能を使用しても問題ありません。

再度、感謝します!

4

1 に答える 1

6

禁止されている NtQuerySystemInformation() API を使用すると、どこかに到達できると思います。この API を使用するサンプル プロジェクトは、こちらから入手できます

これには多くの警告フラグを立てる必要があります。意図的に文書化されていない内部カーネル データ構造をいじっています。ファイル ハンドルを無意識に閉じることは、ランダムなファイル システムの破損を引き起こす優れた方法です

また、この種のコードを Windows の将来のバージョンと互換性を維持するのに苦労するでしょう。SysInternals の Handle ユーティリティを使用することは、おそらくより優れたソリューションですが、より洗練されたソリューションではありません。しばらくは維持できそうです。このプログラムをあなたのものから実行し、出力をリダイレクトします。テキストの解析は実行可能です。

于 2010-09-02T17:32:21.507 に答える