Что именно вызывает EPrivilege? - PullRequest
11 голосов
/ 25 июня 2011

Я получаю сообщение об ошибке, что некоторые функции в некотором коде воспроизведения музыки во внешней DLL (SDL_Mixer, в случае, если это помогает), которую использует моя программа, вызывают EPrivilege.DLL написана на C, поэтому я не могу получить из нее полезную информацию трассировки стека с помощью MadExcept, и проблема не воспроизводится с моей стороны.И, что еще хуже, Я даже не знаю, что такое EPrivilege .

Я никогда не видел, чтобы это появлялось в моем собственном коде, очень мало информации о нем доступно в Интернетеи то, что есть, противоречиво.(В одном объяснении говорится, что оно вызывается ОС, если вы пытаетесь сделать что-то с ограниченной учетной записью, для которой требуются привилегии, которые недоступны, в другом говорится, что оно вызывается процессором, если вы пытаетесь выполнить инструкцию, превышающую ваш уровень привилегий.)

У кого-нибудь есть авторитетное объяснение того, что вызывает EPrivilege?И знает ли кто-нибудь, как он может быть вызван кодом воспроизведения музыки на одном 64-разрядном компьютере с Windows 7 под учетной записью без прав администратора, но не может быть вызван при запуске того же кода на my Windows 7 64машина под учетной записью без прав администратора?

Ответы [ 2 ]

17 голосов
/ 25 июня 2011

EPrivilege вызывается, когда аппаратные объекты вам пытаются запустить привилегированную инструкцию в пользовательском режиме.Эти привилегированные инструкции ограничены режимом супервизора, он же ring 0 .

Аппаратное обеспечение выдает ошибку, а затем RTL перехватывает ее и сопоставляет с исключением RTL, как и все * 1006.* исключения, например EAccessViolation, EStackOverflow и т. д.

Права администратора здесь не актуальны.Это то, что обеспечивается программным обеспечением ОС.Привилегия инструкций контролируется на аппаратном уровне.

Вы видите такую ​​ошибку, если вы пытаетесь выполнить мусор (то есть указатель поврежденной функции), который просто произнесет написание привилегированной инструкции.Повреждение памяти - единственное вменяемое объяснение.Только компиляторы, предназначенные для кода режима ядра, будут генерировать привилегированные инструкции.

9 голосов
/ 25 июня 2011

Мы делаем много аппаратного контроля в реальном времени, используя Delphi. Это включает чтение и запись портов ввода / вывода. Если у вас нет разрешения (или драйвера ядра) для этого, вы получите EPrivilege.

Например, этот бит кода:

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

в W98 ничего не требовалось, чтобы позволить записать байт в адрес ввода-вывода, например, параллельный порт ПК. Под NT и далее он будет генерировать EPrivilege, если только этот адрес не был «открыт» каким-либо образом, например, с использованием gwiopm . Таким образом, EPrivilege может быть индикатором «чтения / записи мусора» (как предлагает Дэвид) или неполной установки, которая считывает / записывает неправильно настроенное оборудование.

...