delphi 具体是什么原因导致Escherge升高?

gywdnpxw  于 2023-10-18  发布在  其他
关注(0)|答案(3)|浏览(166)

我收到一个bug报告,说我的程序使用的外部DLL(SDL_Mixer,如果它有帮助的话)中的一些音乐播放代码中的某些功能正在引发Eccurge。DLL是用C编写的,所以我不能用MadExcept从中获得有用的堆栈跟踪信息,而且这个问题在我这边是不可重现的。更糟糕的是,* 我甚至不知道什么是埃奇奇 *。
我从来没有在我自己的代码中看到过它,网上关于它的信息很少,而且有什么是矛盾的。(一种解释说,如果你试图用一个有限的帐户做一些需要特权的事情,它会被操作系统引发,另一种解释说,如果你试图执行一个高于你特权级别的指令,它会被CPU引发。
有没有人能对什么原因导致肥胖做出权威的解释?有没有人知道它是如何在一台Windows 7 64位机器上以非管理员帐户通过音乐播放代码引发的,但在我的Windows 7 64位机器上以非管理员帐户运行相同代码时却不会引发?

ltskdhd1

ltskdhd11#

EPrivilege在硬件对象试图在用户模式下运行特权指令时引发。这些特权指令仅限于管理程序模式,即ring 0
硬件引发错误,然后RTL捕获它并将其Map到RTL异常,就像所有EExternal异常一样,例如。EAccessViolationEStackOverflow
管理员权限与此无关。这是由操作系统软件强制执行的。指令特权是在硬件级别控制的。
如果您尝试执行垃圾(即,损坏的函数指针),这只是碰巧拼写一个特权指令。内存损坏是唯一合理的解释。只有针对内核模式代码的编译器才会发出特权指令。

unhi4e5o

unhi4e5o2#

我们用 Delphi 做了大量的实时硬件控制。这涉及阅读和写I/O端口。如果您没有权限(或内核驱动程序)这样做,您将得到EPrivilege
例如这段代码:

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

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

kr98yfug

kr98yfug3#

在我的情况下,我只是重新编译了主要单位,它得到了修复。

相关问题