12

私のプログラムが使用する外部 DLL (役立つ場合は SDL_Mixer) の一部の音楽再生コードの一部の機能が EPrivilege を上げているというバグ レポートを受け取っています。DLL は C で記述されているため、MadExcept を使用して有用なスタック トレース情報を得ることができず、問題を再現できません。さらに悪いことに、私は EPrivilege が何であるかさえ知りません

私自身のコードでそれが出てくるのを見たことがありません。オンラインで入手できる情報はほとんどなく、そこにあるものは矛盾しています。(ある説明では、利用できない特権を必要とする制限されたアカウントで何かを行おうとすると、OS によって発生するという説明があり、別の説明では、特権レベルを超える命令を実行しようとすると CPU によって発生するというものです。)

EPrivilege の原因について、信頼できる説明を持っている人はいますか? そして、管理者以外のアカウントで1つのWindows 7 64ビットマシンで音楽を再生するコードによって発生する可能性があるが、非管理者アカウントでWindows 7 64ビットマシンで同じコードを実行すると発生しない方法を知っている人はいますか? -管理者アカウント?

4

2 に答える 2

18

EPrivilegeユーザーモードで特権命令を実行しようとすると、ハードウェアオブジェクトが発生します。これらの特権命令は、リング 0とも呼ばれるスーパーバイザー モードに制限されています。

ハードウェアがエラーを発生させ、RTL がそれをキャッチして、すべてのEExternal例外と同様に RTL 例外にマップします。EAccessViolationEStackOverflow

ここでは、管理者権限は関係ありません。これは、OS ソフトウェアによって強制されるものです。命令特権は、ハードウェア レベルで制御されます。

たまたま特権命令を綴ったガベージ (つまり、破損した関数ポインタ) を実行しようとすると、このようなエラーが表示されます。メモリの破損は、唯一の正気の説明です。カーネル モード コードを対象とするコンパイラのみが特権命令を発行します。

于 2011-06-24T22:30:22.777 に答える
10

Delphi を使用して、多くのリアルタイム ハードウェア制御を行っています。これには、I/O ポートの読み取りと書き込みが含まれます。これを行う権限 (またはカーネル ドライバー) がない場合は、EPrivilege.

たとえば、このコードのビット:

procedure   WriteIOByte( AData : byte; AAddress : word); assembler;
asm
  out dx,al
end;

W98 では、PC パラレルポートなどの I/O アドレスにバイトを書き込むために何も必要ありませんでした。NT では、そのアドレスがgwiopmEPrivilegeを使用するなど、何らかの方法で「開かれている」場合を除き、生成されます。したがって、「ガベージ読み取り/書き込み」(Davidが示唆するように)または読み取り/書き込みが誤ってセットアップされたハードウェアの不完全なセットアップの指標になる可能性があります。EPrivilege

于 2011-06-24T23:03:03.547 に答える