具体是什么导致EPrivilege被提升?

问题描述 投票:0回答:3

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

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

有谁对EPrivilege的原因有权威的解释吗?有谁知道如何在非管理员帐户下的一台 Windows 7 64 位计算机上通过音乐播放代码来引发它,但在 my Windows 7 64 位计算机上运行相同的代码时却不会引发它非管理员帐户?

delphi exception sdl delphi-xe privilege
3个回答
18
投票
当硬件反对您尝试在用户模式下运行特权指令时,会引发

EPrivilege
。这些特权指令仅限于管理员模式,即 ring 0

硬件引发错误,然后 RTL 捕获它并将其映射到 RTL 异常,就像所有

EExternal
异常一样,例如
EAccessViolation
EStackOverflow

管理员权限与此处无关。这是由操作系统软件强制执行的。指令权限在硬件级别进行控制。

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


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
可能是“垃圾读/写”(正如大卫建议的那样)或不完整的设置(读/写错误设置硬件)的指示符。


0
投票

就我而言,我只是重新编译了主机,它就得到了修复。

© www.soinside.com 2019 - 2024. All rights reserved.