HvpApplyIncrementalLogFile

INT64 __fastcall HvpApplyIncrementalLogFile(
        INT64 a1,
        INT64 a2,
        UINT64 a3,
        INT64 a4,
        UINT64 *a5,
        INT64 a6,
        INT64 a7,
        INT64 a8,
        INT64 a9,
        _RTL_BITMAP *a10,
        _DWORD *a11,
        _DWORD *a12,
        UINT64 *a13){
  _HHIVE *v13; 
  int v14; 
  int v15; 
  unsigned int v17; 
  char v18; 
  INT64 result; 
  UINT64 v20; 
  _DWORD *v21; 
  bool v22; 
  UINT8 **v23; 
  INT64 v24; 
  unsigned int a3a; 
  unsigned int a3_4; 
  UINT64 DataSize; 
  ULONG_PTR BugCheckParameter2; 
  _RTL_BITMAP *v29; 
  UINT64 *v30; 
  _DWORD *v31; 
  _DWORD *v32; 
  _DWORD a1a[4]; 
  UINT64 a2a[2]; 
  __int64 v35; 
  __int64 v36; 
  v13 = (_HHIVE *)a5;
  v14 = 0;
  a3a = 0;
  v15 = a2;
  DataSize = 0i64;
  v17 = 512;
  BugCheckParameter2 = a7;
  v29 = a10;
  v31 = a11;
  v32 = a12;
  v35 = 0i64;
  v18 = 0;
  a3_4 = a3;
  v30 = a5;
  *(_OWORD *)a1a = 0i64;
  *(_OWORD *)a2a = 0i64;
  while( 1 )
  {
    result = HvpReadLogEntryHeader(
               v17,
               (__int64(__fastcall *)(__int64, _QWORD, __int64, _OWORD **))HvpRecoverDataReadRoutine,
               (__int64)v13,
               (__int64)a1a);
    if( (int)result < 0 )
      break;
    if( !HvpIsLogEntryHeaderCoherent(a1a, v17, a3_4) || a1a[3] != v15 )
      goto LABEL_17;
    result = HvpRecoverDataReadRoutine(v13, (VOID *)v17, a1a[1], (UINT64)&DataSize, v23);
    if( (int)result < 0 )
      break;
    v20 = DataSize;
    if( !HvpIsMetadataArrayCoherent(a1a, DataSize + 40, HIDWORD(a2a[0])) )
      goto LABEL_17;
    SymCryptMarvin32((int *)&HvSymcryptSeed, (unsigned __int16 *)(v20 + 40), (unsigned int)(a1a[1] - 40), &v36);
    if( a2a[1] != v36 )
      goto LABEL_17;
    v21 = (_DWORD *)(DataSize + 40);
    LODWORD(v24) = a1a[1] - (8 * HIDWORD(a2a[0]) + 40);
    HvpApplyLogEntryDataToFileBackedHive(
      BugCheckParameter2,
      (INT64)a1a,
      DataSize + 40,
      DataSize + 40 + 8i64 * HIDWORD(a2a[0]),
      v24,
      (INT64)&a3a);
    v22 = (a1a[2] & 1) == 0;
    *(_DWORD *)(a1 + 40) = a2a[0];
    if( !v22 )
      *(_DWORD *)(a1 + 144) |= 1u;
    v18 = 1;
    ++v14;
    CmpTraceHiveMountLogEntryApplied(a1a[1], a3a);
    if( v29 )
      HvpUpdateRecoveryVector(v21, HIDWORD(a2a[0]), v29);
    v13 = (_HHIVE *)v30;
    ++v15;
    v17 += a1a[1];
    if( !v17 )
    {
      result = 2147483674i64;
      break;
    }
  }
  if( (_DWORD)result == -1073741801 || (_DWORD)result == -1073741670 || (_DWORD)result == -1073741492 )
    return result;
LABEL_17:
  result = v18 != 0 ? 0x40000009 : 0;
  if( v31 )
    *v31 = v15;
  if( v32 )
    *v32 = v14;
  if( a13 )
  {
    if( v18 )
      *(_DWORD *)a13 = v17;
    else
      *(_DWORD *)a13 = 0;
  }
  return result;
}

Referenced by:

HvApplyLogFile