ここで興味深いのは、Windows XP/Vista で .net マネージ コードを使用して Windows ブルー スクリーン オブ デスを呼び出すことは可能かということです。可能であれば、サンプルコードは何ですか?
念のために言っておきますが、これは悪意のある目的ではありません。指定されたオペレーティング システムを実際に強制終了するには、どのような種類のコードが必要なのかを知りたいだけです。
ここで興味深いのは、Windows XP/Vista で .net マネージ コードを使用して Windows ブルー スクリーン オブ デスを呼び出すことは可能かということです。可能であれば、サンプルコードは何ですか?
念のために言っておきますが、これは悪意のある目的ではありません。指定されたオペレーティング システムを実際に強制終了するには、どのような種類のコードが必要なのかを知りたいだけです。
キーボードはおそらく良いオプションですが、コードで行う必要がある場合は、読み続けてください...
Barf 自体には何も必要ありません。KeBugCheck(Ex) 関数を見つけて呼び出すだけです。
http://msdn.microsoft.com/en-us/library/ms801640.aspx http://msdn.microsoft.com/en-us/library/ms801645.aspx
手動で開始されたクラッシュの場合、バグ チェック コードとして 0xE2 (MANUALLY_INITIATED_CRASH) または 0xDEADDEAD (MANUALLY_INITIATED_CRASH1) を使用します。それらはその使用のために明示的に予約されています。
ただし、関数を見つけるのは少し難しいかもしれません。Windows DDK が役立つかもしれません (Ntddk.h を確認してください) - 現時点では利用できません。また、決定的な情報を見つけることができないようです - ntoskrnl.exe または ntkrnlpa.exe にあると思いますが、確信が持てず、現在それを確認するためのツールがありません。
単純な C++ アプリまたは関数を呼び出す何かを作成し、それを実行する方が簡単な場合があります。
Windows がユーザー空間からの関数へのアクセスをブロックしていないと仮定しています (.NET にはいくつかの特別な規定があるかもしれません)。私はそれを自分でテストしていません。
本当に機能するかどうかはわかりませんが、管理者権限が必要なのは確かですが、CrashOnCtrlScroll レジストリ キーを設定し、SendKeys を使用して CTRL+Scroll Lock+Scroll Lock を送信できます。
しかし、私はこれがキーボード ドライバーから来ていると信じているので、単純な SendKeys では十分ではなく、何らかの方法でキーボード ドライバーにフックする必要があると思います (非常に面倒です)、CrashDump に次のことができる API があることを確認します。 P/Invoke で呼び出されます。
http://support.microsoft.com/kb/244139
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters
名前: CrashOnCtrlScroll
データ型: REG_DWORD
値: 1
再起動
私はノーと言わざるを得ないでしょう。カーネル空間に存在するドライバーまたはその他のコードを p/invoke して対話する必要があります。.NET コードは、この分野とはかけ離れていますが、Windows の将来のバージョンでのマネージド ドライバーについての話がいくつかあります。あと数年待てば、私たちの管理されていない友人と同じようにクラッシュする可能性があります.
私の知る限り、実際の BSOD にはカーネル モード コードでの失敗が必要です。Vista にはまだ BSOD がありますが、新しいドライバー モデルではカーネル モードのドライバーが少ないため、BSOD の頻度は低くなります。ユーザー モードでエラーが発生すると、アプリケーションが強制終了されます。
カーネル モードでマネージ コードを実行することはできません。したがって、BSOD にしたい場合は、PInvoke を使用する必要があります。しかし、これでもなかなか難しい。カーネル モードで barf に何かを取得するには、非常に高度な PInvokes を実行する必要があります。
しかし、何千人ものSOユーザーの中には、おそらくこれを行った人がいます:-)
カーネル クラッシュをトリガーする OSR Online のツールを使用できます。私は自分で試したことはありませんが、標準の .net Process クラスを介して実行できると思います。
directx8またはdirectx9でdirectshowを使用してライブビデオ入力を試してください。ほとんどの呼び出しはカーネルモードのビデオドライバーに送られます。ライブビデオキャプチャソースからコールバックプロシージャを実行すると、特にコールバックに時間がかかる場合、カーネルドライバ全体が停止する可能性があるため、多くのブルースクリーンに成功しました。
.NET 1.1 の System.Net.Sockets を無責任に使用して、Windows XP で BSOD を生成したことがあります。かなり定期的に繰り返すことができましたが、残念ながらそれは数年前のことであり、どのようにトリガーしたか、またはソースコードをもう持っていないことを正確に覚えていません.
マネージ コードが障害のあるカーネル ドライバーにアクセスすると、バグチェックが発生する可能性があります。ただし、BSOD を直接引き起こすのはカーネル ドライバーです (たとえば、uffe の DirectShow BSOD、Terence Lewis のソケット BSOD、特定のネットワーク アダプターで BitTorrent を使用したときに見られる BSOD)。
特権のある低レベル リソースへの直接ユーザー モード アクセスは、バグチェックを引き起こす可能性があります (たとえば、Device\PhysicalMemory
最初にハード ディスクが破損しない場合は、.Vista では物理メモリへのユーザー モード アクセスは許可されません)。
ダンプ ファイルだけが必要な場合は、WinDbg を使用するという Mendelt の提案は、カーネル ドライバーのバグを悪用するよりもはるかに優れたアイデアです。残念ながら、この.dump
コマンドはローカル カーネル デバッグではサポートされていないため、シリアルまたは 1394 経由で接続された 2 台目の PC、または仮想シリアル ポート経由で接続された VM が必要になります。LiveKdは、メモリ ダンプの状態が完全に自己整合的である必要がない場合、単一の PC のオプションである可能性があります。
残念ながら、私たちのサーバーの .NET サービスがブルー スクリーンを引き起こしたので、これを行う方法を知っています。(注: XP/Vista ではなく、Windows Server 2008 R2)。
.NET プログラムが原因だとはとても信じられませんでしたが、本当でした。さらに、BSOD を仮想マシンに複製しました。
問題のあるコードにより、0x00000f4 が発生します。
string name = string.Empty; // This is the cause of the problem, should check for IsNullOrWhiteSpace
foreach (Process process in Process.GetProcesses().Where(p => p.ProcessName.StartsWith(name, StringComparison.OrdinalIgnoreCase)))
{
Check.Logging.Write("FindAndKillProcess THIS SHOULD BLUE SCREEN " + process.ProcessName);
process.Kill();
r = true;
}
なぜ私がブルー スクリーンを再現したいのか疑問に思っている人がいるかもしれませんが、それは悪意のあるものではありません。.Flush() が呼び出されたにもかかわらず、BSOD の前のアクションがログに表示されなかったため、ディスクに直接書き込むように指示する引数を取るようにログ クラスを変更しました。サーバーのクラッシュを再現して、ログの変更をテストしました。VM は正常にクラッシュしましたが、ログは機能しました。
編集: csrss.exeを強制終了すると、ブルー スクリーンが発生するようです。コメントによると、これはカーネル コードで発生している可能性があります。
taskkill /F /IM svchost.exe
管理者として実行すると、ほぼすべてのサービス ホストを一度に強制終了しようとすることがわかりました。