什么特别导致EPrivilege被提出?

时间:2011-06-24 22:10:07

标签: delphi exception sdl delphi-xe privilege

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

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

有没有人对导致EPrivilege的原因有权威解释?有没有人知道如何通过非管理员帐户下的一台Windows 7 64位计算机上的音乐播放代码引发它,但在我的 Windows 7上运行相同的代码时不会引发它非管理员帐户下的64位计算机?

2 个答案:

答案 0 :(得分:17)

当硬件对象试图在用户模式下运行特权指令时,会引发

EPrivilege。这些特权指令仅限于管理员模式,a.k.a。ring 0

硬件引发错误然后RTL捕获它并将其映射到RTL异常,就像所有EExternal例外一样,例如EAccessViolationEStackOverflow等。

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

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

答案 1 :(得分:9)

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

例如这段代码:

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

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