HdlspDispatch

__int64 __fastcall HdlspDispatch(signed int a1, __int64 a2, __int64 a3, __int64 a4, _QWORD *a5){
  unsigned int v5; 
  int v10; 
  char v11; 
  unsigned __int8 v12; 
  unsigned __int8 v13; 
  UINT64 *v14; 
  int v15; 
  INT8 *v17; 
  char *v18; 
  unsigned int v19; 
  UINT8 Line; 
  PKSPIN_LOCK v21; 
  unsigned int v22; 
  int v23; 
  PKSPIN_LOCK v24; 
  char DstBuf[80]; 
  v5 = 0;
  v10 = 1228800;
  v11 = 1;
  if( (unsigned int)a1 <= 0x14 && _bittest(&v10, a1) )
    goto LABEL_13;
  if( (HeadlessGlobals[6] & 2) != 0 )
  {
    v13 = -1;
  }
  else
  {
    KeAcquireSpinLockRaiseToDpc(HeadlessGlobals, a2);
    v13 = v12;
  }
  v14 = HeadlessGlobals;
  v15 = *((_DWORD *)HeadlessGlobals + 12);
  if( (v15 & 0x40) == 0 )
  {
    *((_DWORD *)HeadlessGlobals + 12) = v15 | 0x40;
    if( v13 != 0xFF )
    {
      KxReleaseSpinLock(v14);
      __writecr8(v13);
    }
    v10 = 1228800;
LABEL_13:
    if( a1 <= 16 )
    {
      if( a1 == 16 )
      {
        if( a4 && a5 && *a5 >= 0x20ui64 )
        {
          v21 = HeadlessGlobals;
          *(_DWORD *)a4 = 1;
          *(_BYTE *)(a4 + 8) = 1;
          *(_BYTE *)(a4 + 9) = (v21[6] & 8) != 0;
          *(_DWORD *)(a4 + 24) = *((_DWORD *)v21 + 13);
          v22 = *((_DWORD *)v21 + 12);
          v23 = (v22 >> 9) & 7;
          if( v23 || (v22 & 8) != 0 )
          {
            *(_DWORD *)(a4 + 12) = v23;
            *(_QWORD *)(a4 + 16) = v21[8];
          }
          else
          {
            *(_DWORD *)(a4 + 12) = 0;
            *(_QWORD *)(a4 + 16) = 0i64;
          }
          *(_BYTE *)(a4 + 28) = *((_BYTE *)v21 + 84);
          goto LABEL_131;
        }
        goto LABEL_33;
      }
      if( a1 > 11 )
      {
        if( a1 == 12 )
        {
          if( a4 && a5 && *a5 == 1i64 )
          {
            if( (HeadlessGlobals[6] & 1) != 0 && InbvPortPollOnly(*((unsigned int *)HeadlessGlobals + 14)) )
            {
              InbvPortGetByte(*((unsigned int *)HeadlessGlobals + 14), (UINT8 *)a4);
              goto LABEL_131;
            }
            goto LABEL_56;
          }
LABEL_33:
          v5 = -1073741811;
LABEL_131:
          *((_DWORD *)HeadlessGlobals + 12) &= ~0x40u;
          return v5;
        }
        if( a1 != 13 )
        {
          if( a1 == 14 )
          {
            *((_DWORD *)HeadlessGlobals + 12) = HeadlessGlobals[6] & 0xFFFFFFBD | 2;
          }
          else if( (HeadlessGlobals[6] & 1) != 0 )
          {
            HdlspBugCheckProcessing();
          }
          return v5;
        }
        if( !a4 || !a5 || *a5 < 2ui64 )
          goto LABEL_33;
        if( (HeadlessGlobals[6] & 1) != 0 )
        {
          Line = HdlspGetLine((UINT8 *)(a4 + 1), *a5 - 1i64);
          goto LABEL_67;
        }
      }
      else
      {
        if( a1 != 11 )
        {
          if( a1 != 1 )
          {
            if( a1 != 2 )
            {
              if( a1 == 3 )
              {
                if( a2 )
                {
                  if( (HeadlessGlobals[6] & 1) != 0 )
                    HdlspPutString((UINT8 *)a2);
                  goto LABEL_131;
                }
              }
              else
              {
                if( (unsigned int)(a1 - 4) > 6 )
                {
LABEL_29:
                  v5 = -1073741811;
                  goto LABEL_129;
                }
                if( (HeadlessGlobals[6] & 1) == 0 )
                {
LABEL_129:
                  if( (unsigned int)a1 <= 0x14 && _bittest(&v10, a1) )
                    return v5;
                  goto LABEL_131;
                }
                switch( a1 )
                {
                  case 4:
                    v18 = "\x1B[2J";
                    goto LABEL_43;
                  case 5:
                    v18 = "\x1B[0J";
                    goto LABEL_43;
                  case 6:
                    v18 = "\x1B[0K";
                    goto LABEL_43;
                  case 7:
                    v18 = "\x1B[0m";
                    goto LABEL_43;
                  case 8:
                    v18 = "\x1B[7m";
                    goto LABEL_43;
                  case 9:
                    if( a2 && a3 == 8 )
                    {
                      v17 = (INT8 *)"\x1B[%d;%dm";
                      goto LABEL_37;
                    }
                    break;
                  case 10:
                    if( a2 && a3 == 8 )
                    {
                      v17 = "\x1B[%d;%dH";
LABEL_37:
                      sprintf_s(DstBuf, 0x50ui64, v17);
                      v18 = DstBuf;
LABEL_43:
                      HdlspSendStringAtBaud((UINT8 *)v18);
                      goto LABEL_129;
                    }
                    break;
                  default:
                    goto LABEL_29;
                }
              }
              goto LABEL_33;
            }
            if( a4 && a5 && *a5 == 1i64 )
            {
              if( (HeadlessGlobals[6] & 1) != 0 )
              {
                if( HdlspGetLine((UINT8 *)DstBuf, 0x50ui64) )
                {
                  if( (unsigned int)strcmp(DstBuf, "reboot") && (unsigned int)strcmp(DstBuf, "shutdown") )
                    v11 = 0;
                  *(_BYTE *)a4 = v11;
                }
                goto LABEL_131;
              }
LABEL_56:
              *(_BYTE *)a4 = 0;
              goto LABEL_131;
            }
            goto LABEL_33;
          }
          if( !a2 || a3 != 1 )
            goto LABEL_33;
          v19 = HdlspEnableTerminal(*(_BYTE *)a2);
LABEL_60:
          v5 = v19;
          goto LABEL_131;
        }
        if( !a4 || !a5 || *a5 != 1i64 )
          goto LABEL_33;
        if( (HeadlessGlobals[6] & 1) != 0 )
        {
          Line = InbvPortPollOnly(*((unsigned int *)HeadlessGlobals + 14));
LABEL_67:
          *(_BYTE *)a4 = Line;
          goto LABEL_131;
        }
      }
      Line = 0;
      goto LABEL_67;
    }
    switch( a1 )
    {
      case 17:
        if( a2 )
        {
          HdlspAddLogEntry((WCHAR *)a2);
          goto LABEL_129;
        }
        return(unsigned int)-1073741811;
      case 18:
        if( a2 && a3 == 1 )
        {
          HdlspProcessDumpCommand(*(_BYTE *)a2);
          goto LABEL_131;
        }
        goto LABEL_33;
      case 19:
        if( a2 )
        {
          v19 = HdlspSetBlueScreenInformation((UINT64 *)a2, a3);
          goto LABEL_60;
        }
        return 3221225485i64;
      case 20:
        if( (HeadlessGlobals[6] & 3) == 3 )
        {
          if( a2 && a3 == 4 )
          {
            HdlspSendBlueScreenInfo(*(unsigned int *)a2);
            HdlspSendStringAtBaud((UINT8 *)"\n\r!SAC>");
            return v5;
          }
          return 3221225485i64;
        }
        break;
      default:
        switch( a1 )
        {
          case 21:
            if( a4 && a5 && *a5 >= 0x10ui64 )
            {
              *(_OWORD *)a4 = *(_OWORD *)((char *)HeadlessGlobals + 100);
              goto LABEL_131;
            }
            break;
          case 22:
            if( a2 && a3 )
            {
              if( (HeadlessGlobals[6] & 1) != 0 )
                HdlspPutData((UINT8 *)a2, a3);
              goto LABEL_131;
            }
            break;
          case 23:
            if( a2 )
            {
              if( (HeadlessGlobals[6] & 1) != 0 )
                HdlspPutWideString((WCHAR *)a2);
              goto LABEL_131;
            }
            break;
          case 24:
            if( a4 && a5 && *a5 >= 0xCui64 )
            {
              v24 = HeadlessGlobals;
              *(_QWORD *)a4 = *(PKSPIN_LOCK)((char *)HeadlessGlobals + 118);
              *(_DWORD *)(a4 + 8) = *(_DWORD *)((char *)v24 + 126);
              goto LABEL_131;
            }
            break;
          default:
            goto LABEL_29;
        }
        goto LABEL_33;
    }
    return v5;
  }
  if( v13 != 0xFF )
  {
    KxReleaseSpinLock(HeadlessGlobals);
    __writecr8(v13);
  }
  return 3221225473i64;
}

Referenced by:

HdlspKernelAddLogEntry
HeadlessDispatch