BcpDisplayCriticalString

INT64 __fastcall BcpDisplayCriticalString(UINT16 *a1, INT64 a2, INT64 r8_0, INT64 a4){
  __int64 v5; 
  int v6; 
  unsigned int v7; 
  unsigned int v8; 
  unsigned int v9; 
  int v10; 
  __int64 v11; 
  int StringAdvanceWidth; 
  __int64 v13; 
  unsigned int v14; 
  UINT16 *v15; 
  unsigned int v16; 
  unsigned int v17; 
  __int64 v18; 
  __int64 v19; 
  unsigned int v20; 
  int v21; 
  unsigned int v22; 
  __int64 v23; 
  unsigned int v24; 
  int v25; 
  INT64 result; 
  UINT64 v27; 
  UINT64 v28; 
  unsigned __int64 v29; 
  unsigned int v30; 
  bool v31; 
  int v32; 
  unsigned int *v33; 
  int v35; 
  INT64 v36; 
  unsigned int a3; 
  v35 = 0;
  LODWORD(v36) = 0;
  a3 = 0;
  v5 = 9i64 * (int)a4;
  if( BcpTextBoxLeftEdgeOverride )
    v6 = *(_DWORD *)BcpTextBoxLeftEdgeOverride;
  else
    v6 = LODWORD(qword_140C10E80[9 * (int)a4 + 4]) + LODWORD(qword_140C10E80[9 * (int)a4 + 2]);
  if( BcpTextBoxRightEdgeOverride )
    v7 = *(_DWORD *)BcpTextBoxRightEdgeOverride;
  else
    v7 = LODWORD(qword_140C10E80[9 * (int)a4 + 4])
       + LODWORD(qword_140C10E80[9 * (int)a4 + 3])
       + LODWORD(qword_140C10E80[9 * (int)a4 + 2]);
  v8 = BcpCursor;
  v9 = HIDWORD(BcpCursor);
  v10 = dword_140C4C328;
  v11 = *(_QWORD *)(qword_140C53C30 + 24);
  v31 = 0;
  *(_DWORD *)(v11 + 56) = a2;
  *(_DWORD *)(qword_140C53C30 + 8) = a2;
  v33 = (unsigned int *)(v11 + 40);
  StringAdvanceWidth = BgpFoGetStringAdvanceWidth(v11 + 40, (INT64)a1, &a3, a4);
  if( StringAdvanceWidth >= 0 )
    v31 = v8 + a3 > v7;
  v13 = (__int64)v33;
  v14 = v10 - v9;
  v15 = a1;
  v16 = 0;
  v17 = 0;
  if( (int)v14 <= 0 )
    v14 = 0;
  a3 = 0;
  v30 = *v33;
  if( (*a1 & 0xFFFE) != 0 )
  {
    while( 1 )
    {
      if( v31 && v16 <= v17 )
      {
        v18 = *((_QWORD *)v15 + 1);
        v19 = v17;
        a3 = v17;
        v32 = 0;
        if( *(_WORD *)(v18 + 2i64 * v17) != 32 )
        {
          while( 1 )
          {
            v20 = *(unsigned __int16 *)(v18 + 2 * v19);
            if( v20 <= 0xD )
            {
              v21 = 9217;
              if( _bittest(&v21, v20) )
                break;
            }
            StringAdvanceWidth = BgpRasGetGlyphAdvanceWidth(v13, v20, &v35, v13, (__int128 *)&BcpWorkspace);
            if( StringAdvanceWidth < 0 )
              goto LABEL_40;
            v13 = a3 + 1;
            v32 += v35;
            ++a3;
            if( v7 < v32 + v8 && v14 )
            {
              if( v8 < v7 )
              {
                LODWORD(v27) = v30;
                StringAdvanceWidth = BcpPrintSpaces(qword_140C53C30, v8, v7, v9, v27, &v36);
                if( StringAdvanceWidth < 0 )
                  goto LABEL_40;
                if( v14 < (unsigned int)v36 )
                  v14 = v36;
              }
              v8 = v6;
              v22 = v14 + LODWORD(qword_140C10E80[v5 + 5]);
              v14 = 0;
              v9 += v22;
              break;
            }
            v19 = (unsigned int)v13;
            v18 = *((_QWORD *)a1 + 1);
            if( *(_WORD *)(v18 + 2 * v13) == 32 )
              break;
            v13 = (__int64)v33;
          }
        }
      }
      StringAdvanceWidth = BgpRasGetGlyphAdvanceWidth(
                             (__int64)v33,
                             *(_WORD *)(*((_QWORD *)a1 + 1) + 2i64 * v17),
                             &v35,
                             v13,
                             (__int128 *)&BcpWorkspace);
      if( StringAdvanceWidth < 0 )
        goto LABEL_40;
      if( v7 >= v8 + v35 )
        break;
      if( v8 < v7 )
      {
        LODWORD(v28) = v30;
        StringAdvanceWidth = BcpPrintSpaces(qword_140C53C30, v8, v7, v9, v28, &v36);
        if( StringAdvanceWidth < 0 )
          goto LABEL_40;
        if( v14 < (unsigned int)v36 )
          v14 = v36;
      }
      v23 = v17;
      v8 = v6;
      v24 = v14 + LODWORD(qword_140C10E80[v5 + 5]);
      v14 = 0;
      v9 += v24;
      if( *(_WORD *)(*((_QWORD *)a1 + 1) + 2i64 * v17) != 32 )
        goto LABEL_36;
LABEL_39:
      ++v17;
      v15 = a1;
      v16 = a3;
      v13 = (__int64)v33;
      if( v17 >= *a1 >> 1 )
        goto LABEL_40;
    }
    v23 = v17;
LABEL_36:
    BgpDisplayCharacterEx(
      *(_WORD *)(*((_QWORD *)a1 + 1) + 2 * v23),
      qword_140C53C30,
      v8,
      v9,
      v30,
      0xFFFFFFFF,
      &v35,
      &v36,
      v29,
      &BcpWorkspace);
    StringAdvanceWidth = v25;
    if( v25 < 0 )
      goto LABEL_40;
    v8 += v35;
    if( (unsigned int)v36 > v14 )
      v14 = v36;
    goto LABEL_39;
  }
LABEL_40:
  LODWORD(BcpCursor) = v8;
  dword_140C4C328 = v9 + v14;
  result = (unsigned int)StringAdvanceWidth;
  HIDWORD(BcpCursor) = v9;
  return result;
}

Referenced by:

BcpDisplayErrorInformation
BcpDisplayProgress
BgpDisplaySafeToPowerOffScreen
BgpFwDisplayBugCheckScreen