什么特别导致EPrivilege被提出?

Mas*_*ler 11 delphi sdl exception privilege delphi-xe

我收到一个错误报告,我的程序使用的外部DLL(SDL_Mixer,如果它有帮助)中的某些音乐播放代码中的某些功能正在提升EPrivilege.DLL是用C语言编写的,因此我无法通过MadExcept从中获取有用的堆栈跟踪信息,并且问题在我的最终无法重现.只是为了让事情变得更糟,我甚至不知道EPrivilege是什么.

我从来没有看到它出现在我自己的代码中,在网上提供的信息很少,而且有什么是矛盾的.(一种解释说,如果你试图用一个有限的帐户做一些需要不可用的权限的东西,操作系统会提出它,另一个解释说如果你试图执行一个高于你的权限级别的指令,它会由CPU引发.)

有没有人对导致EPrivilege的原因有权威的解释?并没有任何人有任何想法如何能够通过音乐播放代码,一台Windows 7 64位机器上的下一个非管理员帐户提出,但没有运行相同的代码时,可以提出我的下一个非Windows 7的64位计算机-admin帐号?

Dav*_*nan 17

EPrivilege当硬件对象试图在用户模式下运行特权指令时引发.这些特权指令仅限于管理员模式,即ring 0.

硬件引发错误,然后RTL捕获它,并将其映射到RTL例外,就像所有的EExternal例外,例如EAccessViolation,EStackOverflow等等.

管理员权限与此无关.这是OS软件强制执行的操作.指令权限由硬件级别控制.

如果您尝试执行拼写特权指令的垃圾(即损坏的函数指针),您会看到这样的错误.内存损坏是唯一合理的解释.只有针对内核模式代码的编译器才会发出特权指令.


Bri*_*ost 9

我们使用Delphi进行了大量的实时硬件控制.这涉及读写I/O端口.如果您没有权限(或内核驱动程序)来执行此操作,则可以获得EPrivilege.

比如这段代码:

procedure   WriteIOByte( AData : byte; AAddress : word); assembler;
asm
  out dx,al
end;
Run Code Online (Sandbox Code Playgroud)

在W98下,它不需要允许它向I/O地址写入一个字节,例如PC并行端口.在NT和它之下它将生成,EPrivilege除非该地址已经以某种方式"打开",例如使用gwiopm.因此EPrivilege可以是"垃圾读/写"的指示符(如David建议的那样),也可以是读取/写入错误设置硬件的不完整设置的指示符.