12

我收到一个错误报告,指出我的程序使用的外部 DLL(SDL_Mixer,以防万一)中的某些音乐播放代码中的某些功能正在提高 EPrivilege。DLL 是用 C 语言编写的,因此我无法使用 MadExcept 从中获取有用的堆栈跟踪信息,而且问题在我的最终无法重现。更糟糕的是,我什至不知道 EPrivilege 是什么

我从来没有在我自己的代码中看到过它,网上关于它的信息很少,而且有什么矛盾的。(一种解释说,如果您尝试使用需要不可用权限的受限帐户执行某些操作,则它是由操作系统引发的,另一种解释是,如果您尝试执行高于您的权限级别的指令,它是由 CPU 引发的。)

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

4

2 回答 2

18

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

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

管理员权限在这里不相关。这是操作系统软件强制执行的。指令特权在硬件级别进行控制。

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

于 2011-06-24T22:30:22.777 回答
10

我们使用 Delphi 做了很多实时硬件控制。这涉及读取和写入 I/O 端口。如果您没有权限(或内核驱动程序)执行此操作,您将获得EPrivilege.

例如这段代码:

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

在 W98 下不需要任何东西来允许它向 I/O 地址写入一个字节,例如 PC 并行端口。在 NT 和它上面将生成EPrivilege,除非该地址已以某种方式“打开”,例如使用gwiopm。因此EPrivilege,可能是“垃圾读/写”(正如大卫所建议的那样)或读/写错误设置硬件的不完整设置的指标。

于 2011-06-24T23:03:03.547 回答