KiDisplayBlueScreen
VOID __stdcall KiDisplayBlueScreen(UINT64 DisplayBugCheckFlags){
int v1;
__int64 v2;
_UNICODE_STRING *v3;
UINT64 *v4;
INT64 v5;
__int64 v6;
char *v7;
_UNICODE_STRING *v8;
unsigned __int16 Length;
char *Buffer;
unsigned __int16 v11;
wchar_t *v12;
wchar_t *v13;
__int64 v14;
wchar_t v15;
unsigned int v16;
WCHAR **v17;
wchar_t *v18;
_UNICODE_STRING *v19;
__int64 v20;
wchar_t **p_Buffer;
UINT64 *OutputBufferSize;
char InputBuffer;
int InputBuffer_4;
INT8 *ReturnedString;
_STRING ReturnedString_8;
_UNICODE_STRING BugCheckContext_8[6];
CHAR pszDest[16];
char v29;
char v30;
v1 = DisplayBugCheckFlags;
memset(BugCheckContext_8, 0i64, sizeof(BugCheckContext_8));
ReturnedString = 0i64;
InputBuffer_4 = KiBugCheckData;
InputBuffer = 1;
ReturnedString_8 = 0i64;
HeadlessDispatch(HeadlessCmdStartBugCheck, 0i64, 0i64, 0i64, 0i64);
HeadlessDispatch(HeadlessCmdEnableTerminal, &InputBuffer, 1ui64, 0i64, 0i64);
v2 = 4i64;
HeadlessDispatch(HeadlessCmdSendBlueScreenData, &InputBuffer_4, 4ui64, 0i64, 0i64);
IoSaveBugCheckProgress(0x81ui64);
v3 = KiBugCheckDriver;
v4 = &KiBugCheckData + 1;
if( KiBugCheckDriver
|| (KiDumpParameterImages(0i64, &KiBugCheckData + 1, 4ui64, 0i64), (v3 = KiBugCheckDriver) != 0i64) )
{
v5 = 30i64;
if( v3->Length == 30 && !memcmp(v3->Buffer, L"VerifierExt.sys", 0x1Eui64) )
v3 = 0i64;
}
v6 = 4i64;
BugCheckContext_8[1].Buffer = (wchar_t *)&v30;
v7 = &v29;
BugCheckContext_8[1].MaximumLength = 256;
v8 = &BugCheckContext_8[2];
do
{
v8->Buffer = (wchar_t *)v7;
v7 += 38;
*(_DWORD *)&v8->Length = 2490404;
++v8;
--v6;
}
while( v6 );
if( KeGetBugMessageText((unsigned int)KiBugCheckData, &ReturnedString_8, v5) )
{
Buffer = ReturnedString_8.Buffer;
Length = ReturnedString_8.Length;
}
else
{
RtlStringCbPrintfExA(pszDest, 0xBui64, &ReturnedString, 0i64, 0i64, (INT8 *)"0x%08x");
Length = (_WORD)ReturnedString - (unsigned __int16)pszDest;
Buffer = pszDest;
}
v11 = 0;
v12 = BugCheckContext_8[1].Buffer;
if( Length >= (unsigned __int16)((BugCheckContext_8[1].MaximumLength >> 1) - 1) )
Length = (BugCheckContext_8[1].MaximumLength >> 1) - 1;
if( Length )
{
v13 = BugCheckContext_8[1].Buffer;
v14 = Length;
v11 = Length;
do
{
v15 = *Buffer++;
*v13++ = v15;
--v14;
}
while( v14 );
}
BugCheckContext_8[1].Length = 2 * v11;
v12[v11] = 0;
InbvAcquireDisplayOwnership();
IoSaveBugCheckProgress(0x82ui64);
v16 = KiBugCheckData;
BugCheckContext_8[0] = 0i64;
BgpFwAcquireLock();
if( (*(&SbiVmbusArrivalEvent + 368) & 2) != 0 )
{
LODWORD(OutputBufferSize) = v1;
BgpFwDisplayBugCheckScreen(v16, &KiBugCheckData + 1, v3, BugCheckContext_8, (UINT64)OutputBufferSize);
v12 = BugCheckContext_8[1].Buffer;
}
BgpFwReleaseLock();
IoSaveBugCheckProgress(0x80ui64);
v17 = *(WCHAR ***)&BugCheckContext_8[0].Length;
if( *(_QWORD *)&BugCheckContext_8[0].Length && (v18 = BugCheckContext_8[0].Buffer) != 0i64 )
{
KiHeadlessDisplayString((WCHAR *)L"\r\n", 6ui64);
KiHeadlessDisplayString(v17[1], *(unsigned __int16 *)v17);
KiHeadlessDisplayString((WCHAR *)L"\r\n", 6ui64);
KiHeadlessDisplayString(*((WCHAR **)v18 + 1), *v18);
}
else
{
v19 = &BugCheckContext_8[2];
v20 = 4i64;
do
{
KiBugCheckConvertParameterValueToUnicodeString(*v4++, (INT64)v19++);
--v20;
}
while( v20 );
v12 = BugCheckContext_8[1].Buffer;
}
KiHeadlessDisplayString((WCHAR *)L"\r\n", 6ui64);
KiHeadlessDisplayString(v12, BugCheckContext_8[1].Length);
if( KiBugCheckDriver )
{
KiHeadlessDisplayString((WCHAR *)L"\r\n", 6ui64);
KiHeadlessDisplayString(KiBugCheckDriver->Buffer, KiBugCheckDriver->Length);
}
KiHeadlessDisplayString((WCHAR *)L"\r\n", 6ui64);
KiHeadlessDisplayString((WCHAR *)L"\r\n", 6ui64);
p_Buffer = &BugCheckContext_8[2].Buffer;
do
{
KiHeadlessDisplayString(*p_Buffer, *((unsigned __int16 *)p_Buffer - 4));
KiHeadlessDisplayString((WCHAR *)L"\r\n", 6ui64);
p_Buffer += 2;
--v2;
}
while( v2 );
KiHeadlessDisplayString((WCHAR *)L"\r\n", 6ui64);
}Referenced by:
KeBugCheck2