2009-08-12 7 views
5

Hace un tiempo estaba leyendo en algún sitio en línea que podría hacer un BSOD personalizado. No recuerdo dónde, pero sé que tenía algo que ver con llamar a HalDisplayString, que cambiaría a la pantalla azul e imprimiría un mensaje. Traté de llamar a HalDisplayString desde un controlador simple, pero no pasa nada. Me preguntaba si alguien podría señalarme en la dirección correcta. Aquí está el código para el controlador.Uso de HalDisplayString para la pantalla azul personalizada de la muerte

#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; 
} 

¡Gracias de antemano!

Respuesta

2

No puede mostrar un BSOD con esa función, solo muestra texto durante el arranque antes de que aparezca la pantalla de inicio de sesión. Este link debería darle cierta información.

5

ZippyV, tenías razón, y también está equivocado. Llamar a HalDisplayString no hará que la computadora cambie a una pantalla azul e imprima el texto, pero imprimirá texto después de la pantalla azul inicial en una pantalla azul personalizada. Aquí hay un código que una vez compilado por ddk y ejecutado como un controlador creará una pantalla azul e imprimirá texto usando 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; 
} 

Todas estas funciones que se utilizan aquí son indocumentados y tuve que descifrarlos a mí mismo (y mirar 2 de ellos en el código fuente de ReactOS) así que tenga cuidado llamarlos. Puede compilar este código con el DDK de Windows y cargar el controlador con cualquier cargador de controladores anterior. Puede cambiar el fondo y el color del texto cambiando los parámetros de la función de color (¿Alguna pantalla verde de muerte?). Creo que usan un sistema IRBG (Intensity Red Green Blue). También recuerda que esto es como una verdadera pantalla azul y la única forma en que sé cómo deshacerme de ella es reiniciando la computadora, ¡así que ten cuidado y diviértete!

+0

¿Estas son las mismas funciones que Microsoft usa para crear un BSOD? – ZippyV

+0

Sí, pero esta es solo la parte visual de la pantalla azul. – user37875

Cuestiones relacionadas