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

我从未见过在我自己的代码中出现它,网上几乎没有关于它的信息,有什么矛盾。 (一种解释说,如果您尝试使用需要不可用特权的受限帐户来做某事,则由操作系统提出,另一种解释是,如果您尝试执行高于特权级别的指令,则由CPU提出。)

有人对造成Erivilege的原因有权威解释吗?并且没有人知道如何在非管理员帐户下在一台Windows 7 64位计算机上的音乐播放代码来引发它,而在我的 Windows 7 64位计算机下以相同的代码运行相同的代码时如何引发该问题。非管理员帐户?

最佳答案

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

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

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

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

09-17 20:29