Что конкретно вызывает повышение 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 может быть индикатором "чтения / записи мусора" (как предлагает Дэвид) или неполной настройки, которая неправильно считывает / записывает настройку оборудования.

В моем случае я просто перекомпилировал основной модуль, и все было исправлено.

Другие вопросы по тегам