HdlspDispatch

NTSTATUS __stdcall HdlspDispatch(
        _HEADLESS_CMD Command,
        PVOID InputBuffer,
        UINT64 InputBufferSize,
        PVOID OutputBuffer,
        UINT64 *OutputBufferSize){
  NTSTATUS v5; 
  int v10; 
  char v11; 
  unsigned __int8 v12; 
  UINT64 *v13; 
  int v14; 
  INT8 *v16; 
  int v17; 
  __int64 v18; 
  INT8 *v19; 
  int v20; 
  int v21; 
  NTSTATUS v22; 
  UINT8 Line; 
  __int64 v24; 
  unsigned int v25; 
  int v26; 
  __int64 v27; 
  INT8 Dst[80]; 

  v5 = 0;
  v10 = 1228800;
  v11 = 1;
  if( (unsigned int)Command <= HeadlessCmdSendBlueScreenData && _bittest(&v10, Command) )
    goto LABEL_13;
  if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 2) != 0 )
    v12 = -1;
  else
    v12 = KeAcquireSpinLockRaiseToDpc(*(&stru_140CF2E80 + 920));
  v13 = (UINT64 *)*(&stru_140CF2E80 + 920);
  v14 = *(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64);
  if( (v14 & 0x40) == 0 )
  {
    *(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) = v14 | 0x40;
    if( v12 != 0xFF )
    {
      KxReleaseSpinLock(v13);
      __writecr8(v12);
    }
    v10 = 1228800;
LABEL_13:
    if( Command <= HeadlessCmdQueryInformation )
    {
      if( Command == HeadlessCmdQueryInformation )
      {
        if( OutputBuffer && OutputBufferSize && *OutputBufferSize >= 0x20 )
        {
          v24 = *(&stru_140CF2E80 + 920);
          *(_DWORD *)OutputBuffer = 1;
          *((_BYTE *)OutputBuffer + 8) = 1;
          *((_BYTE *)OutputBuffer + 9) = (*(_DWORD *)(v24 + 48) & 8) != 0;
          *((_DWORD *)OutputBuffer + 6) = *(_DWORD *)(v24 + 52);
          v25 = *(_DWORD *)(v24 + 48);
          v26 = (v25 >> 9) & 7;
          if( v26 || (v25 & 8) != 0 )
          {
            *((_DWORD *)OutputBuffer + 3) = v26;
            *((_QWORD *)OutputBuffer + 2) = *(_QWORD *)(v24 + 64);
          }
          else
          {
            *((_DWORD *)OutputBuffer + 3) = 0;
            *((_QWORD *)OutputBuffer + 2) = 0i64;
          }
          *((_BYTE *)OutputBuffer + 28) = *(_BYTE *)(v24 + 84);
          goto LABEL_131;
        }
        goto LABEL_33;
      }
      if( Command > HeadlessCmdTerminalPoll )
      {
        if( Command == HeadlessCmdGetByte )
        {
          if( OutputBuffer && OutputBufferSize && *OutputBufferSize == 1 )
          {
            if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 1) != 0
              && InbvPortPollOnly(*(unsigned int *)(*(&stru_140CF2E80 + 920) + 56i64)) )
            {
              InbvPortGetByte(*(unsigned int *)(*(&stru_140CF2E80 + 920) + 56i64), (UINT8 *)OutputBuffer);
              goto LABEL_131;
            }
            goto LABEL_56;
          }
LABEL_33:
          v5 = -1073741811;
LABEL_131:
          *(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) &= ~0x40u;
          return v5;
        }
        if( Command != HeadlessCmdGetLine )
        {
          if( Command == HeadlessCmdStartBugCheck )
          {
            *(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) = *(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 0xFFFFFFBD | 2;
          }
          else if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 1) != 0 )
          {
            HdlspBugCheckProcessing();
          }
          return v5;
        }
        if( !OutputBuffer || !OutputBufferSize || *OutputBufferSize < 2 )
          goto LABEL_33;
        if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 1) != 0 )
        {
          Line = HdlspGetLine((char *)OutputBuffer + 1, *OutputBufferSize - 1);
          goto LABEL_67;
        }
      }
      else
      {
        if( Command != HeadlessCmdTerminalPoll )
        {
          if( Command != HeadlessCmdEnableTerminal )
          {
            if( Command != HeadlessCmdCheckForReboot )
            {
              if( Command == HeadlessCmdPutString )
              {
                if( InputBuffer )
                {
                  if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 1) != 0 )
                    HdlspPutString((UINT8 *)InputBuffer);
                  goto LABEL_131;
                }
              }
              else
              {
                if( (unsigned int)(Command - 4) > 6 )
                {
LABEL_29:
                  v5 = -1073741811;
                  goto LABEL_129;
                }
                if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 1) == 0 )
                {
LABEL_129:
                  if( (unsigned int)Command <= HeadlessCmdSendBlueScreenData && _bittest(&v10, Command) )
                    return v5;
                  goto LABEL_131;
                }
                switch( Command )
                {
                  case HeadlessCmdClearDisplay:
                    v19 = (INT8 *)"\x1B[2J";
                    goto LABEL_43;
                  case HeadlessCmdClearToEndOfDisplay:
                    v19 = "\x1B[0J";
                    goto LABEL_43;
                  case HeadlessCmdClearToEndOfLine:
                    v19 = "\x1B[0K";
                    goto LABEL_43;
                  case HeadlessCmdDisplayAttributesOff:
                    v19 = "\x1B[0m";
                    goto LABEL_43;
                  case HeadlessCmdDisplayInverseVideo:
                    v19 = "\x1B[7m";
                    goto LABEL_43;
                  case HeadlessCmdSetColor:
                    if( InputBuffer && InputBufferSize == 8 )
                    {
                      v17 = *(_DWORD *)InputBuffer;
                      v16 = (INT8 *)"\x1B[%d;%dm";
                      v18 = *((unsigned int *)InputBuffer + 1);
                      goto LABEL_37;
                    }
                    break;
                  case HeadlessCmdPositionCursor:
                    if( InputBuffer && InputBufferSize == 8 )
                    {
                      v16 = "\x1B[%d;%dH";
                      v17 = *(_DWORD *)InputBuffer + 1;
                      v18 = (unsigned int)(*((_DWORD *)InputBuffer + 1) + 1);
LABEL_37:
                      sprintf_s(Dst, 0x50ui64, v16, v18, v17);
                      v19 = Dst;
LABEL_43:
                      HdlspSendStringAtBaud((UINT8 *)v19);
                      goto LABEL_129;
                    }
                    break;
                  default:
                    goto LABEL_29;
                }
              }
              goto LABEL_33;
            }
            if( OutputBuffer && OutputBufferSize && *OutputBufferSize == 1 )
            {
              if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 1) != 0 )
              {
                if( HdlspGetLine(Dst, 0x50u) )
                {
                  strcmp((UINT8 *)Dst, (UINT8 *)"reboot");
                  if( v20 )
                  {
                    strcmp((UINT8 *)Dst, (UINT8 *)"shutdown");
                    if( v21 )
                      v11 = 0;
                  }
                  *(_BYTE *)OutputBuffer = v11;
                }
                goto LABEL_131;
              }
LABEL_56:
              *(_BYTE *)OutputBuffer = 0;
              goto LABEL_131;
            }
            goto LABEL_33;
          }
          if( !InputBuffer || InputBufferSize != 1 )
            goto LABEL_33;
          v22 = HdlspEnableTerminal(*(_BYTE *)InputBuffer);
LABEL_60:
          v5 = v22;
          goto LABEL_131;
        }
        if( !OutputBuffer || !OutputBufferSize || *OutputBufferSize != 1 )
          goto LABEL_33;
        if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 1) != 0 )
        {
          Line = InbvPortPollOnly(*(unsigned int *)(*(&stru_140CF2E80 + 920) + 56i64));
LABEL_67:
          *(_BYTE *)OutputBuffer = Line;
          goto LABEL_131;
        }
      }
      Line = 0;
      goto LABEL_67;
    }
    switch( Command )
    {
      case HeadlessCmdAddLogEntry:
        if( InputBuffer )
        {
          HdlspAddLogEntry((WCHAR *)InputBuffer);
          goto LABEL_129;
        }
        return -1073741811;
      case HeadlessCmdDisplayLog:
        if( InputBuffer && InputBufferSize == 1 )
        {
          HdlspProcessDumpCommand(*(_BYTE *)InputBuffer);
          goto LABEL_131;
        }
        goto LABEL_33;
      case HeadlessCmdSetBlueScreenData:
        if( InputBuffer )
        {
          v22 = HdlspSetBlueScreenInformation((unsigned int *)InputBuffer, InputBufferSize);
          goto LABEL_60;
        }
        return -1073741811;
      case HeadlessCmdSendBlueScreenData:
        if( (*(_BYTE *)(*(&stru_140CF2E80 + 920) + 48i64) & 3) == 3 )
        {
          if( InputBuffer && InputBufferSize == 4 )
          {
            HdlspSendBlueScreenInfo(*(unsigned int *)InputBuffer);
            HdlspSendStringAtBaud((UINT8 *)"\n\r!SAC>");
            return v5;
          }
          return -1073741811;
        }
        break;
      default:
        switch( Command )
        {
          case HeadlessCmdQueryGUID:
            if( OutputBuffer && OutputBufferSize && *OutputBufferSize >= 0x10 )
            {
              *(_OWORD *)OutputBuffer = *(_OWORD *)(*(&stru_140CF2E80 + 920) + 100i64);
              goto LABEL_131;
            }
            break;
          case HeadlessCmdPutData:
            if( InputBuffer && InputBufferSize )
            {
              if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 1) != 0 )
                HdlspPutData((UINT8 *)InputBuffer, InputBufferSize);
              goto LABEL_131;
            }
            break;
          case HeadlessCmdPutWideString:
            if( InputBuffer )
            {
              if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 1) != 0 )
                HdlspPutWideString((WCHAR *)InputBuffer);
              goto LABEL_131;
            }
            break;
          case HeadlessCmdQueryPciInformation:
            if( OutputBuffer && OutputBufferSize && *OutputBufferSize >= 0xC )
            {
              v27 = *(&stru_140CF2E80 + 920);
              *(_QWORD *)OutputBuffer = *(_QWORD *)(*(&stru_140CF2E80 + 920) + 118i64);
              *((_DWORD *)OutputBuffer + 2) = *(_DWORD *)(v27 + 126);
              goto LABEL_131;
            }
            break;
          default:
            goto LABEL_29;
        }
        goto LABEL_33;
    }
    return v5;
  }
  if( v12 != 0xFF )
  {
    KxReleaseSpinLock(*(&stru_140CF2E80 + 920));
    __writecr8(v12);
  }
  return -1073741823;
}

Referenced by:

HdlspKernelAddLogEntry
HeadlessDispatch