В этом случае поток встретил исключение
C0000096: STATUS_PRIVILEGED_INSTRUCTION
Executing an instruction not allowed in current machine mode.
Эта ошибка была вызвана самим процессором. Какой-то код пытался выполнить инструкцию, которая ему не разрешена. Вероятно, это вызвано повреждением памяти; где код ядра пытался выполнить ненужные данные.
Такого рода ошибки действительно невозможно точно определить. В коде "ядра" произошла ошибка, которая не должна была произойти. Крайне маловероятно, что в каком-либо коде Microsoft есть программная ошибка; когда вы начинаете искать в другом месте.
- Сторонние драйверы. Диски режима ядра имеют полный доступ к физическому оборудованию. Любая случайная ошибка в любом стороннем драйвере (например, видео, звук, сеть, USB 3.0, SATA), и это может повредить код или данные чего-либо еще в системе. Следующие шаги: попробуйте удалить недавно добавленное оборудование (чтобы некоторые сторонние драйверы не загружались), попробуйте загрузку в безопасном режиме (чтобы некоторые сторонние драйверы не загружались) или переустановите Windows (чтобы не загружались некоторые сторонние драйверы)
- Плохая RAM. Если бит был перевернут, и он превратил совершенно безобидную инструкцию в другую, недействительную инструкцию, вы можете получить эту ошибку. Следующие шаги: извлеките флеш-память, переместите ее в другие слоты, разблокируйте ее, поменяйте источники питания
Разгон. Иногда при разгоне могут произойти необычайно странные вещи. Надеюсь, что все отправляют Microsoft свои аварийные дампы; потому что Microsoft расследует их. Распространенная ошибка, которую они получают, это когда процессор выполняет инструкцию:
xor eax, eax;
Это чрезвычайно простая операция, которую может выполнить процессор; это просто установка внутреннего регистра процессора EAX
на ноль. Нет никакого способа, которым это может потерпеть неудачу; кроме случаев, когда вы разгоняете - или другие физические проблемы.
tl; dr: Если вы удалили программное обеспечение, то это аппаратное обеспечение.
Обновление: методология устранения неполадок
я хотел упомянуть детали, которые я прошел, почти бездумно, глядя на эту ошибку.
Первым был сам код ошибки:
0x1000007E - SYSTEM_THREAD_EXCEPTION_NOT_HANDLED_M
Binging это на Google дает страницу документации Microsoft
Проверка на ошибку 0x1000007E: SYSTEM_THREAD_EXCEPTION_NOT_HANDLED_M
Это указывает на то, что системный поток сгенерировал исключение, которое обработчик ошибок не перехватил.
Из опыта работы в качестве разработчика я знаю, что если мое приложение (или один из его потоков) сталкивается с "исключением", а я не «обрабатываю » исключение, Windows в конечном итоге обработает его, убив приложение. Если в режиме ядра происходит необработанное исключение, у ОС нет иного выбора, кроме как обработать его, выключив ядро. Что меня интересовало, так это то, какое исключение было выброшено. я предположил (неправильно, оказывается), что это было "нарушение прав доступа".
я знаю, что все баг-чеки сопровождаются четырьмя параметрами, которые описывают то, что на самом деле произошло:
- Параметр 1: 0xFFFFFFFFC0000096
- Параметр 2: 0xFFFFF80003610698
- Параметр 3: 0xFFFFF8800614C7B8
- Параметр 4: 0xFFFFF8800614C010
Но что, черт возьми, это значит ?! Вот когда мы вернемся к странице документации, которая не описывает их. Но это не говорит:
Проверка на ошибку 0x1000007E имеет то же значение и параметры, что и проверка на ошибку 0x7E (SYSTEM_THREAD_EXCEPTION_NOT_HANDLED).
Отлично. И эта другая страница документирует параметры:
SYSTEM_THREAD_EXCEPTION_NOT_HANDLED Параметры
Следующие параметры отображаются на синем экране.
- Параметр 1: Код исключения, который не был обработан
- Параметр 2: адрес, где произошло исключение
- Параметр 3: адрес записи об исключении
- Параметр 4: адрес контекстной записи
Это то, что я хотел, код исключения, который не был обработан. В вашем случае это был код исключения:
0xFFFFFFFFC0000096
по своему опыту я знаю, что вы работаете в 64-битной Windows, потому что этот код имеет 64-битную длину. На самом деле я хочу только младшие 32 бита:
0xC0000096
Обычно я ожидал найти этот код ошибки в winerror.h
в моем каталоге разработки; но его там не было Это заняло немного Binging, но я обнаружил, что в поисках:
winerror C0000096
приведи меня на страницу на winehq, где объявлена константа:
STATUS_PRIVILEGED_INSTRUCTION = 0xC0000096
Чтение этой константы привело меня к канонической странице документации Microsoft:
Аппаратные исключения
STATUS_PRIVILEGED_INSTRUCTION
: Выполнение команды, запрещенной в текущем машинном режиме.
Я также знаю , что это исключение на самом процессоре. я знаю, что, поскольку "Привилегированная инструкция" означает, что вы пытались выполнить инструкцию ЦП, вам не разрешено. Я также могу знать это, потому что страница называется Аппаратные исключения.
Итак, мы подошли к моменту, когда выполнялся какой-то код, который пытался выполнить инструкцию процессора, которую он не должен был выполнять. Есть две возможности:
- память была повреждена; программное обеспечение не было написано, чтобы попытаться выполнить этот код, но это то, что только что оказалось в оперативной памяти
- это действительно глючная программа, и она пыталась сделать что-то, что не разрешено.
Учитывая, что код Microsoft постоянно тестируется в полевых условиях на миллионах машин каждый день, это более вероятно:
- быть проблема с вашим оборудованием
- ошибка в чужом коде, вызывающая проблемы
Во всяком случае, это было , как я работал над этой BugCheck. Может быть, зная, как я прошел через это, это может помочь вам в следующий раз, когда у вас будет баг-чек.