8

おそらくWin32APIを使用して、C#でファイルハンドルを列挙できるかどうかを知りたいですか?これは、ウィンドウ ハンドルとプロセス ハンドルの場合は簡単に実行できますが、ファイル ハンドルの場合はできないようです。

一部の機能は によって提供されますがNtQuerySystemInformation、これは段階的に廃止されるため、このような方法を使用することはお勧めしません。

4

4 に答える 4

8

それが可能であることはご存知のとおり、SysInternals の Handle ユーティリティがそれを行います。NtQueryInformation は段階的に廃止される予定はありません。これは、Win32 と「実際の」オペレーティング システムとの間の重要な低レベル インターフェイスです。

ただし、ハンドルの反復を可能にする NtQueryInformation 引数が文書化されることは決してありません。それだけで終わらないため、一部のマペットはそれを使用して、ロックしたくないファイルで CloseHandle() を呼び出します。これは、ハードディスクの内容を破壊する非常に良い方法です。

ハンドルを所有していたプロセスは、ハンドルが閉じられていることを知りません。おそらく、WriteFile() からの「動作しませんでした」というリターン コードを完全に無視して、書き込みを続行します。プログラムが別のハンドルを開き、以前に閉じられたものと同じ値を取得するまで、これは無害です。ここで、ガベージ (前のハンドル用) と新しいデータの混合をハンドルに書き込み始めます。書き込み先のコンテンツを完全に破壊します。ミッション クリティカルなデータベースのような場合は、バックアップ テープをスピンアップします。

于 2010-04-10T01:25:59.370 に答える
1

これはC#の準備が整ったクラスですhttp://sourceforge.net/projects/processhacker/

于 2010-04-10T19:59:59.993 に答える
0

sysinternal のハンドルを呼び出して結果を解析するか、ファイル システム ドライバーを作成することができます (数年かかる可能性があり、C# では実行できません) 。

于 2010-04-10T00:00:45.840 に答える
-1

ここで、C# で名前を使用してファイル ハンドルを一覧表示する実際の例を見つけました...

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/ac990847-6d04-4ae0-aafe-8355bbc3f769

最後のスレッドまでスクロールして、そこにあるリンクをたどってください。コードをダウンロードすると、コメントはフランス語になります。たまたまフランス語を取っているので、ほとんどのことは理解できます。

于 2010-06-11T17:14:27.497 に答える