6

/SUBSYSTEM:NATIVEクラッシュした場合に備えてミニダンプを生成したいネイティブ (のような) Windows プログラムがいくつかあります。通常は を使用dbghelp.dllしますが、ネイティブ プロセスは からエクスポートされた関数しか使用できないため、使用ntdll.dllできません。

だから私はダンパーを自分で実装しました。ほとんど完了していますが、残念ながら、クラッシュしたプロセスでアンロードされたモジュールのリストを見つけることができませんでした (WinDbg が表示できるため、リストは確かにどこかに保存されています)。

Windows プロセスでアンロードされたモジュールのリストはどこにありますか?

編集: リストは確かにプロセス メモリのどこかに保存されます。モジュールがアンロードされた後にリストをアタッチしても、WinDbg はリストを表示できます。WinDbg のドキュメントにもメモがあります。

Microsoft Windows Server 2003 以降のバージョンの Windows では、ユーザー モード プロセスのアンロードされたモジュール リストが維持されます。[...]

4

4 に答える 4

4

RtlGetUnloadEventTraceおよびRtlGetUnloadEventTraceExを参照してください。

それがどのように機能するかは完全にはわかりませんが、実際のリストはローダー コードの ntdll.dll によって格納されていると思います。特定のプロセスで最後にアンロードされた 16 個 (MSDN によると 64 個) の DLL を追跡します。この情報は、PEB または PEB_LDR_DATA からリンクされていません。

于 2009-08-17T21:19:27.197 に答える
1

ネイティブ プロセスでのみ必要な場合は、リストを見つける必要はありません。ネイティブ プロセスは dll をロードできないため、アンロードされたものはありません。しかし、技術的な観点からは、アンロードされたデータが処理中の場所にあることに興味があります。

于 2009-08-17T21:05:50.827 に答える
0

WinDbg はリスト自体を作成するだけかもしれません。Windows のデバッガーは、プログラムの実行時にモジュールのロード イベントとアンロード イベントを取得します。したがって、デバッガーはこれらのイベントを監視し、リストを更新するだけで済みます。

参照: http://msdn.microsoft.com/en-us/library/ms679308%28VS.85%29.aspx

具体的にはUNLOAD_DLL_DEBUG_INFOとについての部分LOAD_DLL_DEBUG_INFOです。

そのようにすることをお勧めします。アンロードされたモジュールを追跡する内部リストは知りません。結局のところ、OS自体はそのタイプのデータをほとんど必要としません。

于 2009-08-17T14:21:53.897 に答える
0

exeのインポートテーブルにリストされているモジュールと現在ロードされているモジュールの違いであると推測する危険があります。

于 2009-08-17T16:10:19.597 に答える