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

Вот выборка от полное решение использование NSolver, отправленный в Загадка Einstein’s в C#:

// The green house's owner drinks coffee
Post(greenHouse.Eq(coffee));
// The person who smokes Pall Mall rears birds 
Post(pallMall.Eq(birds));
// The owner of the yellow house smokes Dunhill 
Post(yellowHouse.Eq(dunhill));

5
задан philant 17 August 2009 в 08:17
поделиться

2 ответа

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

2
ответ дан 14 December 2019 в 08:56
поделиться

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 (интенсивность красный зеленый синий).

5
ответ дан 14 December 2019 в 08:56
поделиться