HdlspGetLine

UINT8 __stdcall HdlspGetLine(VOID *InputBuffer, size_t InputBufferLength){
  unsigned __int64 v3; 
  unsigned __int8 v4; 
  UINT64 *v5; 
  int v6; 
  UINT8 v8; 
  __int64 v9; 
  _QWORD *v10; 
  INT8 *v11; 
  __int64 v12; 
  __int64 v13; 
  __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  char v17; 
  __int64 v18; 
  __int64 v19; 
  char *v20; 
  char v21; 
  __int64 v22; 
  unsigned __int64 v23; 
  const VOID *v24; 
  _DWORD *v25; 
  __int64 v26; 
  UINT8 Input; 

  Input = 0;
  v3 = *(_QWORD *)&InputBufferLength;
  if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 2) != 0 )
    v4 = -1;
  else
    v4 = KeAcquireSpinLockRaiseToDpc(*(&stru_140CF2E80 + 920));
  v5 = (UINT64 *)*(&stru_140CF2E80 + 920);
  v6 = *(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64);
  if( (v6 & 0x10) != 0 )
  {
    if( v4 != 0xFF )
    {
      KxReleaseSpinLock(*(&stru_140CF2E80 + 920));
      __writecr8(v4);
    }
    return 0;
  }
  else
  {
    *(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) = v6 | 0x10;
    if( v4 != 0xFF )
    {
      KxReleaseSpinLock(v5);
      __writecr8(v4);
    }
    if( (*(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) & 0x20) == 0 )
    {
      while( 1 )
      {
        while( 1 )
        {
          if( InbvPortPollOnly(*(unsigned int *)(*(&stru_140CF2E80 + 920) + 56i64))
            && InbvPortGetByte(*(unsigned int *)(*(&stru_140CF2E80 + 920) + 56i64), &Input) )
          {
            v8 = Input;
          }
          else
          {
            v8 = 0;
            Input = 0;
          }
          v9 = *(&stru_140CF2E80 + 920);
          if( !v8 )
            goto LABEL_32;
          *(_BYTE *)(*(_QWORD *)(*(&stru_140CF2E80 + 920) + 88i64) + *(_QWORD *)(*(&stru_140CF2E80 + 920) + 32i64)) = v8;
          v10 = (_QWORD *)*(&stru_140CF2E80 + 920);
          if( !*(_BYTE *)(*(&stru_140CF2E80 + 920) + 117i64) || Input != 10 )
            break;
          *(_BYTE *)(*(&stru_140CF2E80 + 920) + 117i64) = 0;
        }
        *(_BYTE *)(*(&stru_140CF2E80 + 920) + 117i64) = Input == 13;
        if( Input == 10 || Input == 13 )
          break;
        switch( Input )
        {
          case 8u:
          case 0x7Fu:
            if( v10[11] )
            {
              HdlspSendStringAtBaud((UINT8 *)"\b \b");
              --*(_QWORD *)(*(&stru_140CF2E80 + 920) + 88i64);
            }
            break;
          case 3u:
            v12 = ++v10[11];
            v13 = v10[4];
            goto LABEL_35;
          case 9u:
          case 0x1Bu:
            HdlspSendStringAtBaud((UINT8 *)"\a");
            v9 = *(&stru_140CF2E80 + 920);
LABEL_32:
            *(_DWORD *)(v9 + 48) &= ~0x10u;
            return 0;
          default:
            v11 = (INT8 *)v10[3];
            if( v10[11] == 78i64 )
            {
              sprintf_s(v11, 0x50ui64, (INT8 *)"\b%c", Input);
              HdlspSendStringAtBaud(*(UINT8 **)(*(&stru_140CF2E80 + 920) + 24i64));
            }
            else
            {
              sprintf_s(v11, 0x50ui64, (INT8 *)"%c", Input);
              HdlspSendStringAtBaud(*(UINT8 **)(*(&stru_140CF2E80 + 920) + 24i64));
              ++*(_QWORD *)(*(&stru_140CF2E80 + 920) + 88i64);
            }
            break;
        }
      }
      HdlspSendStringAtBaud((UINT8 *)"\r\n");
      v12 = *(_QWORD *)(*(&stru_140CF2E80 + 920) + 88i64);
      v13 = *(_QWORD *)(*(&stru_140CF2E80 + 920) + 32i64);
LABEL_35:
      *(_BYTE *)(v12 + v13) = 0;
      v14 = *(&stru_140CF2E80 + 920);
      ++*(_QWORD *)(*(&stru_140CF2E80 + 920) + 88i64);
      v15 = *(_QWORD *)(v14 + 88) - 1i64;
      if( *(_QWORD *)(v14 + 88) != 1i64 )
      {
        v16 = *(_QWORD *)(v14 + 32);
        do
        {
          v17 = *(_BYTE *)(v16 + v15);
          if( v17 && v17 != 32 && v17 != 9 )
            break;
          --v15;
        }
        while( v15 );
      }
      v18 = *(_QWORD *)(*(&stru_140CF2E80 + 920) + 32i64);
      if( *(_BYTE *)(v18 + v15) )
        *(_BYTE *)(v18 + v15 + 1) = 0;
      v19 = 0i64;
      v20 = *(char **)(*(&stru_140CF2E80 + 920) + 32i64);
      if( *v20 )
      {
        do
        {
          v21 = v20[v19];
          if( v21 != 9 && v21 != 32 )
            break;
          ++v19;
        }
        while( v20[v19] );
        if( v19 )
          strcpy_s(v20, 0x50ui64, &v20[v19]);
      }
    }
    v22 = *(&stru_140CF2E80 + 920);
    v23 = *(_QWORD *)(*(&stru_140CF2E80 + 920) + 88i64);
    v24 = *(const VOID **)(*(&stru_140CF2E80 + 920) + 32i64);
    if( v3 < v23 )
    {
      memmove(InputBuffer, v24, v3);
      memmove(*(VOID **)(v22 + 32), (const VOID *)(*(_QWORD *)(v22 + 32) + v3), *(_QWORD *)(v22 + 88) - v3);
      v26 = *(&stru_140CF2E80 + 920);
      v25 = (_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64);
      *(_DWORD *)(*(&stru_140CF2E80 + 920) + 48i64) |= 0x20u;
      *(_QWORD *)(v26 + 88) -= v3;
    }
    else
    {
      memmove(InputBuffer, v24, v23);
      *(_QWORD *)(v22 + 88) = 0i64;
      v25 = (_DWORD *)(v22 + 48);
      *(_DWORD *)(v22 + 48) &= ~0x20u;
    }
    *v25 &= ~0x10u;
    return 1;
  }
}

Referenced by:

HdlspBugCheckProcessing
HdlspDispatch
HdlspPutMore