是什么导致EPrivilege升高?

| 我收到一个错误报告,我的程序使用的外部DLL(SDL_Mixer,如果有帮助)中的某些音乐播放代码中的某些功能正在提高EPrivilege。 DLL是用C编写的,因此我无法使用MadExcept从中获取有用的堆栈跟踪信息,并且最终无法解决该问题。更糟糕的是,我什至不知道什么是EPrivilege。 我从未见过在我自己的代码中出现它,网上关于它的信息很少,而且存在矛盾。 (一种解释说,如果您尝试使用要求不可用特权的受限帐户来做某事,则由操作系统提出,另一种解释是,如果您尝试执行一条指令,则由CPU提出。高于您的特权级别。) 有人对导致EPrivilege产生原因有权威解释吗?并且没有人知道如何在非管理员帐户下在一台Windows 7 64位计算机上通过音乐播放代码来引发它,而在非Windows操作系统下在我的Windows 7 64位计算机上运行相同的代码时如何引发它吗? -admin帐户?     
已邀请:
        当硬件对象试图在用户模式下运行特权指令时,将引发“ 0”。这些特权指令仅限于超级用户模式,即环0。 硬件引发错误,然后RTL捕获该错误并将其映射到RTL异常,就像所有
EExternal
异常一样,例如
EAccessViolation
EStackOverflow
等 管理员权限与此处无关。这是由OS软件强制执行的。指令特权在硬件级别控制。 如果您尝试执行正好拼写特权指令的垃圾(即损坏的函数指针),则会看到这样的错误。内存损坏是唯一合理的解释。只有以内核模式代码为目标的编译器才会发出特权指令。     
        我们使用Delphi进行了大量的实时硬件控制。这涉及读取和写入I / O端口。如果您没有权限(或内核驱动程序)执行此操作,则会得到
EPrivilege
。 例如下面的代码:
procedure   WriteIOByte( AData : byte; AAddress : word); assembler;
asm
  out dx,al
end;
在W98下,不需要任何操作就可以将字节写入I / O地址,例如PC并行端口。在NT及其下,它将生成“ 0”,除非已以某种方式(例如,使用gwiopm)对该地址“打开”了该地址。因此,“ 0”可以指示“垃圾读取/写入”(如David所建议的)或不完整的设置,以读取/写入不正确的设置硬件。     

要回复问题请先登录注册