我收到一个错误报告,我的程序使用的外部DLL(SDL_Mixer,如果它有帮助)中的某些音乐播放代码中的某些功能正在提升EPrivilege。 DLL是用C语言编写的,因此我无法通过MadExcept从中获取有用的堆栈跟踪信息,并且问题在我的最终无法重现。只是为了让事情变得更糟,我甚至不知道EPrivilege是什么。
我从未见过它出现在我自己的代码中,在网上提供的信息很少,而且有什么是矛盾的。 (一种解释说,如果你试图用一个有限的帐户做一些需要不可用的权限的东西,操作系统会提出它,另一个解释说,如果你试图执行一个高于你的权限级别的指令,它会由CPU引发。)
有没有人对导致EPrivilege的原因有权威解释?有没有人知道如何通过非管理员帐户下的一台Windows 7 64位计算机上的音乐播放代码引发它,但在我的 Windows 7上运行相同的代码时不会引发它非管理员帐户下的64位计算机?
答案 0 :(得分:17)
EPrivilege
。这些特权指令仅限于管理员模式,a.k.a。ring 0。
硬件引发错误然后RTL捕获它并将其映射到RTL异常,就像所有EExternal
例外一样,例如EAccessViolation
,EStackOverflow
等。
管理员权限与此无关。这是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
可以是“垃圾读/写”的指示符(正如大卫建议的那样),也可以是读取/写入错误设置硬件的不完整设置的指示符。