CmpCreateEmptyHiveClone

INT64 __fastcall CmpCreateEmptyHiveClone(INT64 *a1, INT64 a2){
  CMHIVE *v4; 
  CMHIVE *v5; 
  NTSTATUS v6; 
  UINT64 *v7; 
  unsigned int v8; 
  __int64 v9; 
  _LARGE_INTEGER *LogFileSizes; 
  __int64 v11; 
  int v12; 
  INT64 v14; 
  INT64 v15; 
  INT64 v16; 

  v4 = (CMHIVE *)CmpAllocate(0x12E8ui64, 0, 0x30314D43ui64);
  v5 = v4;
  if( v4 )
  {
    CmpHiveInitialize(v4);
    v7 = (UINT64 *)(a2 + 1536);
    v8 = 0;
    v5->Flags = *(_DWORD *)(a2 + 4152);
    v9 = 2i64;
    while( 1 )
    {
      if( *v7 )
      {
        LODWORD(v16) = 2;
        LODWORD(v15) = 512;
        LODWORD(v14) = 0;
        v6 = ObDuplicateObject(
               (INT64)PsInitialSystemProcess,
               *v7,
               0i64,
               (UINT64 *)&v5->FileHandles[v8],
               v14,
               v15,
               v16,
               0);
        if( v6 < 0 )
          break;
      }
      ++v8;
      ++v7;
      if( v8 >= 6 )
      {
        LogFileSizes = v5->LogFileSizes;
        v5->LastShrinkHiveSize = *(_DWORD *)(a2 + 1784);
        v5->ActualFileSize.QuadPart = *(_QWORD *)(a2 + 1792);
        do
        {
          *LogFileSizes = *(_LARGE_INTEGER *)((char *)LogFileSizes + a2 - (_QWORD)v5);
          ++LogFileSizes;
          --v9;
        }
        while( v9 );
        v5->DirtyTime = *(_QWORD *)(a2 + 4176);
        v5->UnreconciledTime = *(_QWORD *)(a2 + 4184);
        v5->LastWriteTime.QuadPart = *(_QWORD *)(a2 + 4224);
        v11 = *(_QWORD *)(a2 + 4832);
        if( v11 )
        {
          if( _InterlockedIncrement64((volatile signed __int64 *)(v11 + 24)) <= 1 )
            __fastfail(0xEu);
          v5->VolumeContext = *(_CMP_VOLUME_CONTEXT **)(a2 + 4832);
        }
        HvHiveStartEmptyClone((INT64)v5, a2);
        v6 = v12;
        if( v12 >= 0 )
        {
          *a1 = (INT64)v5;
          v5 = 0i64;
          v6 = 0;
        }
        break;
      }
    }
    if( v5 )
      CmpDestroyHive(v5);
  }
  else
  {
    return(unsigned int)-1073741670;
  }
  return(unsigned int)v6;
}

Referenced by:

CmpReorganizeHive