Как запустить KeBugCheck в VB6?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
серверянин
Новичок
Новичок
 
Сообщения: 32
Зарегистрирован: 19.09.2023 (Вт) 8:00
Откуда: РФ

Как запустить KeBugCheck в VB6?

Сообщение серверянин » 20.09.2023 (Ср) 16:34

Опишу на всякий случай дело подробно - может выскажут решение поумнее моего. Итак.
Я пишу (на VB6) утилиту - такой самописный watchdog, который проверяет состояние другого софта, и в случае обнаружения критической или аварийной ситуации он обязан рестартовать Windows.
Для рестарта я использую простейшую команду
Shell "shutdown -r -t 2"

В целом всё работает, но обнаружилось, что в редких случаях Винда в процессе рестарта может зависнуть. Это очень плохо. Нужно что-то сделать, чтобы выкинуть ее на перезагрузку во что бы то ни стало.

Чтобы решить эту проблему, я попробовал использовать вместо shutdown функцию API ExitWindows (ExitWindowsEx). Принципиального отличия не заметил - зависания также оставались возможны. Тогда я попробовал через функцию InitiateSystemShutdown.
(Ну это вообще страх, как ее подключать... глазки на лоб(((( на счастье нашел в Нете рабочий модуль.) Короче, запустил эту функцию - и никакого выигрыша, увы(((( По одинаковости работы имею ощущение, что все они в итоге запускают один и тот же механизи рестарта (который иногда зависает).

Но делать-то что-то надо!.. В итоге не увидел другого решения, как в случае вот такого висяка запустить функцию KeBugCheck, которая, как пишет Микрософт, обязана гарантированно выкинуть систему в BSOD.

Подскажите, как запустить эту функцию в приложении VB6? Ну, там, сначала получение привилегий и всё такое... Само собой, программа запущена под админской учеткой.

Другие варианты решения приветствуются.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как запустить KeBugCheck в VB6?

Сообщение Хакер » 28.09.2023 (Чт) 22:47

По-моему мы имеем попытку решить проблему не на том уровне, на котором она возникла.

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

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

Возможно нужно вручную убивать процессе в дереве процессов? Возможно нужно вручную завершать сервисы перед попыткой инициировать перезагрузку? Возможно нужно просто отключить проблемные сервисы? Возможно проблема в каких-то драйверах или каком-то железе?

В общем, нужно решать проблему с системой.

Подскажите, как запустить эту функцию в приложении VB6? Ну, там, сначала получение привилегий и всё такое... Само собой, программа запущена под админской учеткой.

Вызвать её можно только из режима ядра. Придётся написать драйвер устройства, скомпилировать, установить его в систему, а затем с помощью CreateFile/DeviceIoControl отдать драйверу команду на вызов KeBugCheckEx или выполнение любого другого способа самоубийства системы.

Но ведь нужно понимать, что инициирование BSOD это критически плохой способ: некорректное завершение приложений, повреждение файлов при сохранении файловой системы или повреждение файловой системы — это то, что рано или поздно наступит.

К тому же, BSOD тоже не обязательно вызывает перезагрузку: это настраиваемое поведение. И если кто-то изменит эту настройку, Watchdog погрузит машину в такое состояние, из которой её только физическое вмешательство вернёт.

Может стоит, если важен такой контроль за состоянием инфраструктуры, держать инфраструктуру в виртуальной машины и перезапускать не физическую, а виртуальную машину с помощью API виртуальной машины?

Другие варианты решения приветствуются.

Ну тогда уж совсем убойное: сделать физическое устройство на базе реле, которое, получив сигнал от watchdog-приложения, на некоторое время замкнёт reset-линию с помощью реле.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

The trick
Постоялец
Постоялец
 
Сообщения: 781
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: Как запустить KeBugCheck в VB6?

Сообщение The trick » 28.09.2023 (Чт) 23:17

Странно, захожу сюда почти каждый день и не видел этого сообщения.
UA6527P

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как запустить KeBugCheck в VB6?

Сообщение Хакер » 29.09.2023 (Пт) 1:39

The trick писал(а):Странно, захожу сюда почти каждый день и не видел этого сообщения.

Висело в очереди на премодерацию.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Teranas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: Как запустить KeBugCheck в VB6?

Сообщение Teranas » 29.09.2023 (Пт) 21:29

1. Надо читать внимательней для shutdown.exe
/t xxx Указание времени ожидания в xxx секунд до завершения работы компьютера.
Допустимый диапазон: 0–315360000 (10 лет); значение по умолчанию: 30.
Если задержка больше 0, подразумевается использование
параметра /f.
/c "комментарий" Комментарий с причиной перезагрузки или завершения работы.
Длина не должна превышать 512 знаков.
/f Принудительное закрытие запущенных приложений без предупреждения пользователей.
Подразумевается использование параметра /f, если
для параметра /t задано значение больше 0.
Код: Выделить всё
  shutdown.exe -r -t 00


2. для ExitWindowsEx
Код: Выделить всё
  ExitWindowsEx EWX_REBOOT or EWX_FORCE, 0


3. Проверить комп AVZ

И конечно, прислушаться к совету выше.
С уважением, Андрей.

Vova_2581
Постоялец
Постоялец
 
Сообщения: 376
Зарегистрирован: 10.01.2010 (Вс) 18:08

Re: Как запустить KeBugCheck в VB6?

Сообщение Vova_2581 » 30.09.2023 (Сб) 21:06

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

серверянин
Новичок
Новичок
 
Сообщения: 32
Зарегистрирован: 19.09.2023 (Вт) 8:00
Откуда: РФ

Re: Как запустить KeBugCheck в VB6?

Сообщение серверянин » 06.10.2023 (Пт) 8:55

Во-первых, большое спасибо всем ответившим!
Извиняюсь за молчание - так долго ожидал премодерацию, что разочаровался и не заглядывал на форум. (А зря)

Хакер писал(а):Возможно нужно вручную убивать процессе в дереве процессов? Возможно нужно вручную завершать сервисы перед попыткой инициировать перезагрузку?

Утилита затем и пишется, чтоб не делать в ручную. Но мысль правильная. Я тоже независимо пришел к ней, и попробовал перед командой рестарта запустить
Shell "taskkill.exe /F /FI " + Chr$(34) + "status eq NOT RESPONDING" + Chr$(34)
Похоже, это решило проблему. Во всяком случае, пока зависаний больше не наблюдалось. (Может потом еще будут)

Хакер писал(а): сделать физическое устройство на базе реле, которое, получив сигнал от watchdog-приложения, на некоторое время замкнёт reset-линию с помощью реле.
Физическое ничего сделать нельзя: это софт на удаленном виртуальном сервере в Нете.

Teranas писал(а): /f Принудительное закрытие запущенных приложений без предупреждения пользователей.
Подразумевается использование параметра /f, если
для параметра /t задано значение больше 0.
Это упущенный мною параметр. Но вряд ли он устранил бы зависания, потому что в пробах с рестартом через API я задавал force, но это проблему не решило.

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

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Как запустить KeBugCheck в VB6?

Сообщение Хакер » 06.10.2023 (Пт) 9:51

серверянин писал(а):Утилита затем и пишется, чтоб не делать в ручную.

Вручную в данном случае значит «не отдавая на отпуп системе», а не «силами пользователя».

Физическое ничего сделать нельзя: это софт на удаленном виртуальном сервере в Нете.

Тем проще, у хостингов виртуальных серверов как правило есть API для управления серверами. Можно инициировать перезагрузку через API провайдера.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Teranas
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 224
Зарегистрирован: 13.12.2008 (Сб) 4:26
Откуда: Новосибирск

Re: Как запустить KeBugCheck в VB6?

Сообщение Teranas » 06.10.2023 (Пт) 11:32

Фильтры "WINDOWTITLE" и "STATUS" не принимаются во внимание, когда компьютер является удаленным.
С уважением, Андрей.

серверянин
Новичок
Новичок
 
Сообщения: 32
Зарегистрирован: 19.09.2023 (Вт) 8:00
Откуда: РФ

Re: Как запустить KeBugCheck в VB6?

Сообщение серверянин » 07.10.2023 (Сб) 7:47

Teranas писал(а):Фильтры "WINDOWTITLE" и "STATUS" не принимаются во внимание, когда компьютер является удаленным.
Утилита, код которой выше обсуждался, закинута туда же, на сервер, так что для нее всё является локальным.

Хакер писал(а): у хостингов виртуальных серверов как правило есть API для управления серверами. Можно инициировать перезагрузку через API провайдера.
Да. В чрезвычайных случаях приходилось так и поступать, когда больше средств не оставалось.
Но эти API уже не локальны, к ним приходится обращаться по сети, причем через аккаунт - то есть уникальный тег, пароли и всё такое... - ооочень большой гимор, если бы вставлять в утилиту.

UPD:
Пожалуй добавлю еще, для тех, кто захочет воспользоваться тем трюком с taskkill, о котором я сообщал выше.
Обратите внимание, что эти две команды - taskkill и shutdown вслед за ней, - находятся в подпрограмме таймера, который через некоторое время периодически запускает их снова, пока рестарт не произойдет.
Я не знаю, с какого именно раза он происходит; возможно, что не с первого.


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: AhrefsBot, Yandex-бот и гости: 39

    TopList  
cron