Как вызвать BSOD на Windows XP и более новых версиях?

14

Есть ли способ программно вызвать BSOD на Windows XP и более новых версиях? Как?

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

(Мне любопытно, какую часть "программно" делают те люди, которые не понимают, кто перенес это в Super User. Дух.)

Тамас Селеи
источник
18
Если вы найдете тот, который не требует написания драйвера, сообщите Microsoft, чтобы они могли это исправить.
Эрик
13
Um. По какой-то причине это происходит быстрее, чем обычная перезагрузка - она ​​не обязательно корректно завершается. Если у вас есть программа, которая очень медленно завершает работу, прервать ее может не быть проблемой. Если вы принудительно завершите работу или откажетесь от чего-либо, слишком близкого к оборудованию ввода-вывода, вы можете получить поврежденные файловые системы и т. Д. Считайте, что это эквивалентно сетевому средству циклического отключения питания (которое, я полагаю, доступно для продажи, и может решить проблему). Ваша проблема примерно так же ...)
12
Ваш клиент должен быть узаконен, а его психическое состояние более тщательно отслеживается медицинской командой.
Дарин Димитров
9
Машины скорой помощи также, как правило, быстрее, чем ехать на машине в больницу. Это не делает его предпочтительным способом путешествия.
FreeAsInBeer
8
Скажите вашему клиенту, чтобы нажать и удерживать кнопку питания в течение 6 секунд. Или просто дерните шнур питания, это быстрее.
Ганс Пассант

Ответы:

15

Можно сказать, что драйверы клавиатуры вызывают BSOD:

HKLM\SYSTEM\CurrentControlSet\Services\kbdhid\Parameters

или (для старых клавиатур PS / 2)

HKLM\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters

И там множество REG_DWORDимени CrashOnCtrlScrollв 1.

После следующей перезагрузки вы можете вызвать синий экран с помощью Ctrl+ ScrollLk+ ScrollLk. Код проверки ошибки в этом случае будет 0xE2 (MANUALLY_INITIATED_CRASH).

Если вы действительно хотите , программный метод, вам нужно найти дыру в каком - нибудь водителя на этой машине или записи и установить драйвер , который упрощенно вызовы либо KeBugCheckили KeBugCheckEx.

Веселиться ;)

Примечание: может быть очень полезно намеренно вызывать сбой, подобный этому, для авторов драйверов или даже при работе с вредоносными программами. Если вы сконфигурировали свою систему для создания полного дампа памяти, у вас будет образ работающей системы, который можно будет дополнительно проанализировать. Рассмотрим случаи, подобные тупику, когда отладчик не всегда помогает во всех случаях.

0xC0000022L
источник
4
Это правда? Это круто, если это так! (Нет, у меня нет настроения тестировать его на любом из моих компьютеров.)
Андреас Рейбранд,
3
Да, это не шутка. Это то, что авторы драйверов использовали в течение некоторого времени, хотя я не мог вспомнить, каково было расположение реестра. Пришлось посмотреть это в моих заметках.
0xC0000022L
Я испытал BSOD, набрав printscreen или слишком много памяти при использовании Ram или внутреннего Hardisk. Может быть, использовать систему тоже.
Tech-IO
1

Не уверен, как именно это вызывать, но я верю в Vista и 7, по умолчанию он отключается при сбое системы и не показывает BSOD.

FreeAsInBeer
источник
Это нормально, я хочу такое поведение.
Тамас Селей
1
@FreeAsInBeer: На самом деле это потому, что настройки вашей системы говорят о перезагрузке после сбоя. Это можно изменить на вкладке «Дополнительно» в свойствах вашего компьютера. Кроме того, создаваемые в настоящее время аварийные дампы обычно являются мини-дампами по умолчанию, поэтому перезагрузка происходит так быстро, что вы не видите синего экрана (буквально). Но это там, поверьте мне;)
0xC0000022L
1
@STATUS_ACCESS_DENIED: Я знаю, я просто дал ему понять, что по умолчанию для этой переменной задано не показывать значения BSOD, поэтому он знал, что нужно проверить это свойство, если он не получил его, как ожидалось.
FreeAsInBeer
@FreeAsInBeer: достаточно честно :)
0xC0000022L
1

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

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

Сион Шеевок
источник
1

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

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

В частности, BSOD - это (обычно) ошибка ядра (или драйвера), ядро ​​находится в плохом состоянии, поэтому плохо, что оно не может очиститься и скорее перезагрузится, потеряв любое хорошее состояние, которое у него есть, только потому, что оно не работает. знать, что хорошо, а что плохо. Любые буферы не могут быть сброшены на диск (и). Затем он попытается очистить при перезагрузке, но потерял много контекста при выключении / панике, так что это будет консервативная очистка, из которой придется выбирать как хорошие, так и плохие остатки от паники.

Таким образом, некоторые ваши преимущества при отключении исчезают при запуске, так как теперь ему нужно выяснить, где он получил его ноги, вырезанные из-под себя. Необходимо запустить chkdsk и очистить все блоки диска, которые находились в состоянии частичной записи. USB-диски кешируются много. Вы можете отключить кэширование, что уменьшит вероятность потери данных при сбое, но не кэширование отнимает некоторую скорость. Какие файлы вы готовы потерять?

Короче, это плохая идея. Любая производственная машина, которая имеет это, может быть в нестабильном состоянии даже после очистки. Это плохо.

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

Рич Гомолка
источник
Вы упускаете суть. Есть веские причины вызывать BSOD по требованию при отладке проблемы с драйвером, который вы пишете. Тем не менее, я думаю, что этот вопрос никогда не должен был быть перенесен с SO сюда из-за его природы.
0xC0000022L
@STATUS_ACCESS_DENIED Я согласен с вашим утверждением, но если вы помните исходный вопрос, это не имело ничего общего с отладкой, а с ярлыком для выключения системы. На мой взгляд, не очень хорошая причина.
Богатая Гомолка
0

Должен отметить, что процесс убийства csrss.exe сделает BSOD. Но не на самой новой Windows (8, 8.1).

pbies
источник
Это может быть сделано приложением. Любой может сделать такое приложение в Visual Studio Express (бесплатно).
pbies
Это код 0xC000021A ( STATUS_SYSTEM_PROCESS_TERMINATED), кстати.
0xC0000022L
0

Фрагмент кода из https://www.mpgh.net/forum/showthread.php?t=1100477 работает в Windows 10.17134.

#include <windows.h>
#pragma comment(lib, "ntdll.lib")

extern "C" NTSTATUS NTAPI RtlAdjustPrivilege(ULONG Privilege, BOOLEAN Enable, BOOLEAN CurrentThread, PBOOLEAN OldValue);
extern "C" NTSTATUS NTAPI NtRaiseHardError(LONG ErrorStatus, ULONG NumberOfParameters, ULONG UnicodeStringParameterMask,
PULONG_PTR Parameters, ULONG ValidResponseOptions, PULONG Response);

void BlueScreen()
{
    BOOLEAN bl;
    ULONG Response;
    RtlAdjustPrivilege(19, TRUE, FALSE, &bl); // Enable SeShutdownPrivilege
    NtRaiseHardError(STATUS_ASSERTION_FAILURE, 0, 0, NULL, 6, &Response); // Shutdown
}

Кажется, что нет никаких следов в журнале событий. Там наверняка будет след в минидампе, хотя?

birdwes
источник