Использование HalDisplayString для пользовательского синего экрана смерти

Некоторое время назад я читал где-то в Интернете, что вы можете создать собственный BSOD. Я не помню где, но я знаю, что это было связано с вызовом HalDisplayString, который переключался на синий экран и печатал сообщение. Я попытался вызвать HalDisplayString из простого драйвера, но ничего не происходит. Мне было интересно, может ли кто-нибудь указать мне правильное направление. Вот код драйвера.

#include "ntddk.h"
#include "wdm.h"
NTSYSAPI VOID NTAPI HalDisplayString( PCHAR String );
NTSYSAPI VOID NTAPI NtDisplayString( PCHAR String );
DRIVER_INITIALIZE DriverEntry;
NTSTATUS DriverEntry( 
    __in struct _DRIVER_OBJECT  *DriverObject,
    __in PUNICODE_STRING  RegistryPath 
    )
  {

   HalDisplayString("Hello world!");
return 0;  
}

Заранее спасибо!


person user37875    schedule 12.08.2009    source источник


Ответы (2)


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

person ZippyV    schedule 12.08.2009

ZippyV, ты был прав, но и не прав. Вызов HalDisplayString не заставит компьютер переключиться на синий экран и распечатать текст, но он будет печатать текст после начального синего экрана на пользовательском синем экране. Вот некоторый код, который после компиляции с помощью ddk и запуска в качестве драйвера создаст синий экран и напечатает текст с помощью HalDisplayString.

#include "ntddk.h"
#include "wdm.h"
VOID HalDisplayString(PSZ text); 
VOID InbvAcquireDisplayOwnership(VOID);
VOID InbvResetDisplay(VOID);
INT InbvSetTextColor(INT color); //IRBG
VOID InbvDisplayString(PSZ text);
VOID InbvSolidColorFill(ULONG left,ULONG top,ULONG width,ULONG height,ULONG color);
VOID InbvSetScrollRegion(ULONG left,ULONG top,ULONG width,ULONG height);
VOID InbvInstallDisplayStringFilter(ULONG b);
VOID InbvEnableDisplayString(ULONG b);
DRIVER_INITIALIZE DriverEntry;
NTSTATUS DriverEntry( 
    __in struct _DRIVER_OBJECT  *DriverObject,
    __in PUNICODE_STRING  RegistryPath 
    )
  {

InbvAcquireDisplayOwnership(); //Takes control of screen
InbvResetDisplay(); //Clears screen
InbvSolidColorFill(0,0,639,479,4); //Colors the screen blue
InbvSetTextColor(15); //Sets text color to white
InbvInstallDisplayStringFilter(0); //Not sure but nessecary
InbvEnableDisplayString(1); //Enables printing text to screen
InbvSetScrollRegion(0,0,639,475); //Not sure, would recommend keeping
InbvDisplayString("I print text!\n"); //Prints text
HalDisplayString("And so do I!!!"); //Prints text

return 0;  
}

Все эти функции, используемые здесь, недокументированы, и мне пришлось разбираться с ними самостоятельно (и искать 2 из них в исходном коде reactos), так что будьте осторожны при их вызове. Вы можете скомпилировать этот код с помощью Windows DDK и загрузить драйвер с помощью любого старого загрузчика драйверов. Вы можете изменить цвет фона и текста, изменив параметры функции цвета (у кого-нибудь появился зеленый экран смерти?). Я думаю, что они используют систему IRBG (Intensity Red Green Blue). Также помните, что это похоже на настоящий синий экран, и единственный известный мне способ избавиться от него — перезагрузить компьютер, так что будьте осторожны и получайте удовольствие!

person user37875    schedule 13.08.2009
comment
Так это те же самые функции, которые Microsoft использует для создания BSOD? - person ZippyV; 14.08.2009
comment
Да, но это только визуальная часть синего экрана. - person user37875; 16.08.2009