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