28

クリーンにコンパイルされるコードをいくつか追加したところ、次の 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 で実行)。

4

9 に答える 9

38

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

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

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

于 2008-09-18T03:23:03.027 に答える
7

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

于 2008-09-18T03:03:46.973 に答える
7

特権命令は、Ring-0 (カーネル モード) でのみ実行できる IA-32 命令です。ユーザー空間でこれを実行している場合は、非常に古い EXE か、バイナリが破損しています。

于 2008-09-18T03:04:22.340 に答える
5

私が疑ったように、私がしたことはばかげたことでした。上記のメッセージのコメントにいくつかの手がかりがあるため、これを 2 倍の速さで解決したと思います。彼ら、特にアプリの早い段階でスタックを上書きしていることを指摘してくれた人々に感謝します。実際には、ここでいくつかの回答が、質問に回答するものとしてマークした投稿よりも有用であることがわかりました。

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

#define MAX_NUM_TOOBAR_BUTTONS (24)

さえ存在しました!

于 2008-09-18T03:54:30.173 に答える
4

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

于 2008-09-18T03:04:03.557 に答える
2

2000 年に Visual c++ 6.0 でこれを見ました。

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

診断コードを実行する原因となる潜在的なエラー状態を探します。

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

于 2008-09-18T03:01:57.603 に答える
2

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

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

于 2010-12-12T19:18:54.273 に答える
2

エラーの場所 0x00486752 は、実行可能コードが通常存在する前に、私には非常に小さいようです。私はダニエルに同意します、それは私への野生のポインタのように見えます.

于 2008-09-18T03:10:28.860 に答える
2

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

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

于 2009-11-02T12:32:25.357 に答える