我收到一个bug报告,说我的程序使用的外部DLL(SDL_Mixer,如果它有帮助的话)中的一些音乐播放代码中的某些功能正在引发Eccurge。DLL是用C编写的,所以我不能用MadExcept从中获得有用的堆栈跟踪信息,而且这个问题在我这边是不可重现的。更糟糕的是,* 我甚至不知道什么是埃奇奇 *。
我从来没有在我自己的代码中看到过它,网上关于它的信息很少,而且有什么是矛盾的。(一种解释说,如果你试图用一个有限的帐户做一些需要特权的事情,它会被操作系统引发,另一种解释说,如果你试图执行一个高于你特权级别的指令,它会被CPU引发。
有没有人能对什么原因导致肥胖做出权威的解释?有没有人知道它是如何在一台Windows 7 64位机器上以非管理员帐户通过音乐播放代码引发的,但在我的Windows 7 64位机器上以非管理员帐户运行相同代码时却不会引发?
3条答案
按热度按时间ltskdhd11#
EPrivilege
在硬件对象试图在用户模式下运行特权指令时引发。这些特权指令仅限于管理程序模式,即ring 0。硬件引发错误,然后RTL捕获它并将其Map到RTL异常,就像所有
EExternal
异常一样,例如。EAccessViolation
、EStackOverflow
等管理员权限与此无关。这是由操作系统软件强制执行的。指令特权是在硬件级别控制的。
如果您尝试执行垃圾(即,损坏的函数指针),这只是碰巧拼写一个特权指令。内存损坏是唯一合理的解释。只有针对内核模式代码的编译器才会发出特权指令。
unhi4e5o2#
我们用 Delphi 做了大量的实时硬件控制。这涉及阅读和写I/O端口。如果您没有权限(或内核驱动程序)这样做,您将得到
EPrivilege
。例如这段代码:
在W 98下不需要任何东西来允许它向I/O地址写入一个字节,例如PC并行端口。在NT下,它将生成
EPrivilege
,除非该地址已被以某种方式“打开”,例如使用gwiopm。因此,EPrivilege
可以是“垃圾读/写”(如大卫所建议的)或不完整的设置(读/写错误的设置硬件)的指示器。kr98yfug3#
在我的情况下,我只是重新编译了主要单位,它得到了修复。