Что конкретно вызывает повышение EPrivilege?
Я получаю сообщение об ошибке, что некоторые функции в некотором коде воспроизведения музыки во внешней DLL (SDL_Mixer, в случае, если это помогает), которую использует моя программа, вызывают EPrivilege. DLL написана на C, поэтому я не могу получить из нее полезную информацию трассировки стека с помощью MadExcept, и проблема не воспроизводится с моей стороны. И, что еще хуже, я даже не знаю, что такое EPrivilege.
Я никогда не видел, чтобы это появилось в моем собственном коде, очень мало информации о нем доступно в Интернете, и то, что есть, противоречиво. (В одном объяснении говорится, что оно вызывается ОС, если вы пытаетесь сделать что-то с ограниченной учетной записью, для которой требуются привилегии, которые недоступны, в другом говорится, что оно вызывается процессором, если вы пытаетесь выполнить инструкцию, превышающую ваш уровень привилегий.)
У кого-нибудь есть авторитетное объяснение того, что вызывает EPrivilege? И есть ли у кого-нибудь представление о том, как он может быть вызван кодом воспроизведения музыки на одном 64-разрядном компьютере под управлением Windows 7 под учетной записью без прав администратора, но не может быть вызван при запуске того же кода на моем 64-разрядном компьютере под управлением Windows 7 под -админ аккаунт?
3 ответа
EPrivilege
Вызывается, когда аппаратные объекты пытаются запустить привилегированную инструкцию в пользовательском режиме. Эти привилегированные инструкции ограничены режимом супервизора, он же кольцо 0.
Аппаратное обеспечение выдает ошибку, а затем RTL перехватывает ее и сопоставляет с исключением RTL, как и все остальные. EExternal
исключения, например EAccessViolation
, EStackru
и т.п.
Права администратора здесь не актуальны. Это то, что обеспечивается программным обеспечением ОС. Привилегия инструкции контролируется на аппаратном уровне.
Вы увидите такую ошибку, если попытаетесь выполнить мусор (то есть указатель поврежденной функции), который, как правило, приводит к написанию привилегированной инструкции. Повреждение памяти - единственное вменяемое объяснение. Только компиляторы, предназначенные для кода режима ядра, будут генерировать привилегированные инструкции.
Мы делаем много аппаратного контроля в реальном времени, используя Delphi. Это включает чтение и запись портов ввода / вывода. Если у вас нет разрешения (или драйвера ядра) для этого, вы получите EPrivilege
,
Например, этот бит кода:
procedure WriteIOByte( AData : byte; AAddress : word); assembler;
asm
out dx,al
end;
под W98 ничего не нужно было, чтобы позволить записать байт в адрес ввода / вывода, например, параллельный порт ПК. Под NT и на нем будет генерировать EPrivilege
если этот адрес не был "открыт" каким-либо образом, например, с помощью gwiopm. таким образом EPrivilege
может быть индикатором "чтения / записи мусора" (как предлагает Дэвид) или неполной настройки, которая неправильно считывает / записывает настройку оборудования.
В моем случае я просто перекомпилировал основной модуль, и все было исправлено.