0

私は単純な Windows コンソール アプリケーションを実行しています:- コントロールがメインに来ると、スタックをダンプしました--

_ メインスレッドのスタック:

5840    0   Main Thread Main Thread Normal


console.exe!wmain(int argc=1, wchar_t * * argv=0x006831a0)

console.exe!__tmainCRTStartup()  

console.exe!wmainCRTStartup()

kernel32.dll!@BaseThreadInitThunk@12()

ntdll.dll!___RtlUserThreadStart@8()

ntdll.dll!__RtlUserThreadStart@8()  

__

起動時にこれが表示されるのはなぜですか??:

3740    0   Worker Thread   Win32 Thread Normal

スタック:

ntdll.dll!_KiFastSystemCallRet@0()  
ntdll.dll!_ZwDelayExecution@8()
ntdll.dll!__LdrpInitialize@8()
ntdll.dll!_LdrInitializeThunk@8()
4

1 に答える 1

1

LdrInitializeThunk は、新しいスレッドをセットアップするメソッドです。VS2008 でプレーンな Win32 コンソール アプリケーション (MFC、ATL なし) を作成し、スレッドを 1 つだけ取得しました。デバッガーがスレッドを挿入してプロセスのデバッグを有効にするため、デバッガーをアタッチした場合にのみ、2 つ目のデバッガーを取得します。プロセスの起動については、こちらの本で詳しく説明されていますが、2 番目のスレッドが必要であることは何も言及されていません。非同期プロシージャ コールAPCのせいでもありません。おそらく、すべてのシンボルがロードされていない状態でコール スタックが作成され、デバッガ ヘルパー スレッドがアプリケーション内の隠しスレッドであると誤って疑われる可能性があります。デバッガーを使用せずにプロセス エクスプローラーでプロセスを確認すると、スレッドが 1 つしか表示されないはずです。

ステージ 6: 新しいプロセスのコンテキストでプロセスの初期化を実行する

KeInitializeThread によって呼び出される KiInitializeContextThread は、スレッドの初期コンテキストとスレッドのカーネル スタックを構築します。新しいスレッドは、カーネル モードのスレッド スタートアップ ルーチン KiThreadStartup を実行して活動を開始します。(これにつながるスレッド起動手順の詳細については、「CreateThread のフロー」セクションを参照してください。) KiThreadStartup ルーチンは、次の手順を実行します。

  1. IRQL レベルを DPC/ディスパッチ レベルから APC (非同期プロシージャ コール) レベルに下げます。

  2. ワーキング セットの拡張を有効にします。

  3. ユーザー モード APC を新しいスレッドのキューに入れ、Ntdll.dll 内のユーザー モード スレッド スタートアップ ルーチン LdrInitializeThunk を実行します。

于 2011-02-13T14:24:38.477 に答える