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