Вопрос

Я добавил код, который компилируется без ошибок, и только что получил эту ошибку Windows:

---------------------------
(MonTel Administrator) 2.12.7: MtAdmin.exe - Application Error
---------------------------
The exception Privileged instruction.

 (0xc0000096) occurred in the application at location 0x00486752.

Я собираюсь заняться поиском ошибок и ожидаю, что это будет что-то глупое, что приведет к появлению этого сообщения.Код компилируется чисто, без ошибок и предупреждений.Размер EXE-файла увеличился до 1 454 132 байт и включает ссылки на ODCS.lib, но в остальном это чистый C для Win32 API с включенной DEBUG (работает на P4 в Windows 2000).

Это было полезно?

Решение

Чтобы ответить на вопрос, привилегированная инструкция — это код операции процессора (инструкция ассемблера), который может выполняться только в режиме «супервизора» (или Ring-0).Инструкции такого типа обычно используются для доступа к устройствам ввода-вывода и защищенным структурам данных из ядра Windows.

Обычные программы выполняются в «пользовательском режиме» (Ring-3), который запрещает прямой доступ к устройствам ввода-вывода и т. д.

Как уже упоминалось, причиной, вероятно, является поврежденный стек или неправильный вызов указателя функции.

Другие советы

Подобные вещи обычно случаются при использовании указателей на функции, указывающих на недопустимые данные.Это также может произойти, если у вас есть код, который уничтожает ваш стек возврата.Иногда бывает довольно сложно отследить подобные ошибки, поскольку их обычно трудно воспроизвести.

Привилегированная инструкция — это инструкция IA-32, выполнение которой разрешено только в кольце-0 (т.режим ядра).Если вы нажимаете на это в пользовательском пространстве, у вас либо очень старый EXE-файл, либо поврежденный двоичный файл.

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

Как я и подозревал, я сделал что-то глупое.Думаю, я решил эту проблему вдвое быстрее из-за некоторых подсказок в комментариях к сообщениям выше.Спасибо тем, особенно тем, кто указал на что-то в начале приложения, перезаписывающее стек.На самом деле я нашел несколько ответов здесь более полезными, чем сообщение, которое я пометил как ответ на вопрос, поскольку они подсказали и поставили меня в очередь, где искать, хотя я думаю, что это лучше всего суммирует ответ.

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

#define MAX_NUM_TOOBAR_BUTTONS  (24)

даже существовал!

Местоположение ошибки 0x00486752 кажется мне очень маленьким, до того, как обычно находится исполняемый код.Я согласен с Дэниелом, мне это кажется диким указателем.

Я видел это в Visual C++ 6.0 в 2000 году.

Библиотека отладки C++ содержала вызовы физических инструкций ввода-вывода в обработчике исключений.Если я правильно помню, это был сброс состояния на порт ввода-вывода, который раньше использовался для базовых регистров DMA, который, как я предполагаю, кто-то в Microsoft использовал для карты отладчика.

Найдите какое-либо состояние ошибки, которое может быть скрытым, вызывающим запуск диагностического кода.

Я отлаживал, вернулся и прочитал дизассемблирование.Это было исключение при обработке std::string, возможно, индексирование с конца.

ЦП большинства процессоров, выпущенных за последние 15 лет, содержат специальные очень мощные инструкции.Эти привилегированные инструкции сохраняются для приложений ядра операционной системы и не могут использоваться программами, написанными пользователем.

Это ограничивает ущерб, который написанная пользователем программа может нанести системе, и сокращает количество фактических сбоев системы.

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

Инструкции загрузки базового и предельного регистров являются привилегированными.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top