2008-09-18 15 views
22

Я добавил код, который компилируется и только что получил эту ошибку 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).

ответ

29

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

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

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

2

Я видел это с помощью Visual C++ 6.0 в 2000 году

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

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

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

+0

Это фактически VC6. Но не C++, хотя множество строк с нулевым завершением. (Я мог бы использовать новые компиляторы, но слышал слухи, что VC6 на самом деле быстрее для C, а не C++). Я сомневаюсь, что это ошибка компилятора, хотя ... (я всегда обнаруживаю, что это один из тех - «что я думал»). – 2008-09-18 03:08:13

7

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

4

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

6

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

+0

Exe Я скомпилировал VC6 около 10 секунд назад .... но есть ли ссылки на ODBC.LIB и другие библиотеки, которые могут быть довольно старыми. Это приложение не является драйвером или услугой. – 2008-09-18 03:10:27

2

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

3

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

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

 
#define MAX_NUM_TOOBAR_BUTTONS (24) 

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

2

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

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

2

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

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