質問

正常にコンパイルされるコードを追加しましたが、次の Windows エラーが発生しました。

---------------------------
(MonTel Administrator) 2.12.7: MtAdmin.exe - Application Error
---------------------------
The exception Privileged instruction.

 (0xc0000096) occurred in the application at location 0x00486752.

私はバグ探しに行こうとしているのですが、それがたまたまこのメッセージを生成するばかげた行為であることを期待しています。コードはエラーや警告なしで正常にコンパイルされます。EXE ファイルのサイズは 1,454,132 バイトに増加し、次のリンクが含まれています。 ODCS.lib, ですが、それ以外は Win32 API に対する純粋な C であり、DEBUG がオンになっています(Windows 2000 上の P4 で実行されます)。

役に立ちましたか?

解決

質問に答えると、特権命令は「スーパーバイザ」(またはリング 0) モードでのみ実行できるプロセッサのオペコード (アセンブラ命令) です。これらの種類の命令は、Windows カーネルから I/O デバイスや保護されたデータ構造にアクセスするために使用される傾向があります。

通常のプログラムは、I/O デバイスなどへの直接アクセスを許可しない「ユーザー モード」(リング 3) で実行されます。

他の人が述べたように、原因はおそらくスタックの破損または関数ポインタ呼び出しの失敗です。

他のヒント

この種のことは通常、無効なデータを指す関数ポインターを使用するときに発生します。また、戻りスタックを破棄するコードがある場合にも発生する可能性があります。この種のバグは通常再現が難しいため、追跡するのが非常に難しい場合があります。

特権命令は、リング 0 でのみ実行が許可される IA-32 命令です (つまり、カーネルモード)。ユーザー空間でこれが発生した場合は、非常に古い EXE を使用しているか、バイナリが破損しています。

私が考えられる最初の可能性は、ローカル配列を使用していて、それが関数宣言の先頭近くにある可能性があるということです。境界チェックが狂って戻りアドレスが上書きされ、カーネルのみが実行を許可されている命令を指しています。

私がやったのは愚かなことだと思っていました。上記のメッセージのコメントにヒントがあったため、2 倍の速さで解決できたと思います。特にアプリの初期段階でスタックを上書きしていることを指摘してくれた方々に感謝します。実際、ここでいくつかの回答が役に立ったと思いますが、どこを見るべきかについてヒントを与えてキューに入れてくれたので、質問への回答としてマークした投稿よりも役に立ちました。ただし、それが答えを最もよく要約していると思います。

結局のところ、ツール バー ボタンの情報 (スタック上にあった) を保持する配列の最大サイズを超えるボタンを追加しただけだったことがわかりました。それを忘れていました

#define MAX_NUM_TOOBAR_BUTTONS  (24)

存在さえした!

エラーの場所 0x00486752 は、実行可能コードが通常存在する場所よりも前にあるため、私には非常に小さいように思えます。私もダニエルの意見に同意します。私にとって、それは乱暴な指摘のように思えます。

私は 2000 年に Visual C++ 6.0 でこれを見ました。

デバッグ C++ ライブラリには、例外ハンドラー内で物理 I/O 命令への呼び出しがありました。私の記憶が正しければ、DMA ベース レジスタ用に使用されていた I/O ポートにステータスをダンプしていました。これは Microsoft の誰かがデバッガ カードに使用していたと思います。

診断コードの実行を引き起こす潜在的なエラー状態を探します。

私はデバッグをしていて、遡って逆アセンブリを読みました。処理中に例外が発生しました std::string, 、おそらく最後からインデックスを作成します。

過去 15 年間に製造されたほとんどのプロセッサの CPU には、非常に強力な特別な命令がいくつか組み込まれています。これらの特権命令はオペレーティング システムのカーネル アプリケーション用に保持されており、ユーザーが作成したプログラムでは使用できません。

これにより、ユーザーが作成したプログラムがシステムに与える可能性のあるダメージが制限され、システムが実際にクラッシュする回数が削減されます。

カーネル モードで実行すると、オペレーティング システムはカーネルとユーザー プログラムのメモリの両方に無制限にアクセスできます。

ベースレジスタとリミットレジスタのロード命令は特権命令です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top