BgpFwDisplayBugCheckProgressUpdate

INT64 __fastcall BgpFwDisplayBugCheckProgressUpdate(UINT64 a1, INT64 a2, CHAR a3){
  unsigned int v3; 
  unsigned int v6; 
  LARGE_INTEGER v7; 
  union _LARGE_INTEGER v8; 
  LARGE_INTEGER v9; 
  LONGLONG v10; 
  LONGLONG v11; 
  LONGLONG v12; 
  LONGLONG v13; 
  __int64 v14; 
  unsigned int DisplayType; 
  INT64 v16; 
  LONGLONG v17; 
  struct _UNICODE_STRING *v18; 
  struct _UNICODE_STRING *v19; 
  struct _UNICODE_STRING *v20; 
  int v22[14]; 
  union _LARGE_INTEGER v23; 
  v3 = 0;
  v23.QuadPart = 0i64;
  v6 = a1;
  if( (dword_140C13310 & 0x400000) != 0 || (dword_140C13310 & 0x10) == 0 )
    return 0i64;
  v7 = KeQueryPerformanceCounter(&v23);
  v8 = v23;
  v9 = v7;
  v10 = v7.QuadPart - BcpStartTicks;
  v11 = v9.QuadPart - *(_QWORD *)BcpLastProgressUpdateTicks;
  v12 = 10 * v23.QuadPart;
  v13 = 2 * v23.QuadPart;
  if( a3 && v10 < v12 )
    v14 = 100 * v10 / v12;
  else
    LODWORD(v14) = 100;
  if( v6 <= (unsigned int)v14 )
    LODWORD(v14) = v6;
  if( v11 < v13 || (unsigned int)v14 < BcpLastProgressDisplayed )
  {
    LODWORD(v14) = BcpLastProgressDisplayed;
  }
  else
  {
    v22[0] = *((_DWORD *)BgInternal + 2);
    v22[1] = *((_DWORD *)BgInternal + 1);
    v22[2] = *((_DWORD *)BgInternal + 3);
    DisplayType = BcpGetDisplayType(v22);
    dword_140C4C328 = dword_140C13238;
    BcpCursor = *(_QWORD *)BcpProgressOffset;
    BcpDisplayProgress((unsigned int)v14, DisplayType, v16);
    *(LARGE_INTEGER *)BcpLastProgressUpdateTicks = KeQueryPerformanceCounter(0i64);
    BcpLastProgressDisplayed = v14;
  }
  if( v6 != 100 || (_DWORD)v14 == 100 )
  {
    v18 = &stru_140C53B30;
    if( !a3 )
      v18 = (struct _UNICODE_STRING *)&stru_140C53B40;
    *(_QWORD *)a2 = v18;
    BcpConvertProgressToString((unsigned int)v14, (UNICODE_STRING *)(a2 + 24));
    v19 = &stru_140C53B80;
    if( v6 != 1 )
      v19 = (struct _UNICODE_STRING *)&stru_140C53BA0;
    v20 = &stru_140C53B70;
    if( v6 != 1 )
      v20 = (struct _UNICODE_STRING *)&stru_140C53B90;
    *(_QWORD *)(a2 + 8) = v20;
    *(_QWORD *)(a2 + 16) = v19;
  }
  else
  {
    v17 = *(_QWORD *)&KeQueryPerformanceCounter(0i64) - *(_QWORD *)BcpLastProgressUpdateTicks;
    if( v17 < v13 )
      KeStallExecutionProcessor(1000000 * (v13 - v17) / v8.QuadPart);
    return(unsigned int)BgpFwDisplayBugCheckProgressUpdate(0x64ui64, a2, a3);
  }
  return v3;
}

Referenced by:

BgpFwDisplayBugCheckProgressUpdate
KiBugCheckProgress