Windows エラー報告 (WER) ダイアログを表示せずに、Windows-7 で通常のユーザー モード プロセスをクラッシュさせることはできますか? (WER が通常有効で、特定のフラグが適用されていない場合。)
注: WER を無効にすることには興味がありません。WER が起動されるべきなのに起動されず、Windows がアプリを "サイレントに" 終了するというクラッシュ シナリオに興味があります。
Windows XP では、アクセス違反 (またはその他の未処理の Win32 例外) が最終的に発生したときに Windows XP がユーザーにまったく通知せずに、プロセスを黙って終了します。
...
void stackbreaker() {
printf("%s\n", __FUNCTION__);
// global/static buffer
static char buf[128] = "In a hole in the ground there lived a hobbit. And it burrowed through your stack. It even built a round door into you function.";
// Get address on the stack
char local;
char* stack = &local;
// nuke the stack:
memcpy(stack - 64, buf, sizeof(buf));
// Kaboom. No user defined unhandled exception filter will be called. Stack nuked.
// Process will terminate silently on Windows XP.
// But on Windows-7 you still get the WER dialog.
}
...
単純な C++ プロジェクトで上記の関数を呼び出すと (リリース モードで -- テスト時にコンパイラの最適化に注意してください -- デバッガの下で実行しないでください)、次のようになります。
- XP では、プロセスをサイレントに終了します。
- Windows-7 で WER クラッシュ ダイアログを表示します。
- 余談ですが、どのような状況でも、独自の未処理の例外フィルターを呼び出すことはありません。
SetUnhandledExceptionFilter
私が今疑問に思っているのは、Windows 7 では、アプリケーションのクラッシュ[a]に対して常にエラー ダイアログが表示されるように WER メカニズムが実装されているのか、それとも Windows 7 でもプロセス破損のシナリオが存在するのかということです。 WERダイアログがポップアップしないようにしますか?
私が行った読み上げを少し追加します。
本のWindows via C/C++ (Richter、Nasarre による第 5 版)では、「フォールティング プロセス」(p 711) で何が起こるかを説明しています。
- 例外フィルター。
- ...
- ...
- カーネルが未処理の例外を検出
- Wer サービスへの ALPC 呼び出しのブロック
- WER レポートが開始されます。
- ...
ここで彼らは、Win7 が Windows XP とは異なる方法でこれを行うことを指摘しています (この本の p. 710 を引用すると:)
... Windows Vista 以降、この
UnhandledExceptionFilter
機能は MS のサーバーにエラー レポートを送信しなくなりました。その代わり。カーネルは、例外がユーザーモード スレッドによって処理されていないことを検出します (ステップ 4)...
したがって、これは、プロセスが「クラッシュ」する方法がまったくないことを意味します-Vista以降では、WERの開始を妨げる方法で.私はこれを確認または反論しようとしています.
*exit
[a]: 明らかに、さまざまな関数または関数のいずれかを呼び出すことで、プロセスを跡形もなく簡単に「強制終了」できterminate*
ます。問題は、そのような終了理由を除外できる場合、WER ダイアログが表示されないようにする方法で Win7 のユーザー モード プロセスを (どのように) "クラッシュ" させることができるかということです。