HvHiveStartFileBacked

INT64 __fastcall HvHiveStartFileBacked(
        PVOID BugCheckParameter2,
        INT64 a2,
        EVENT_DESCRIPTOR *a3,
        UINT64 a4,
        INT64 a5,
        INT64 a6,
        INT64 a7,
        UNICODE_STRING *FileName,
        INT64 a9,
        INT64 a10,
        INT64 a11,
        INT64 a12,
        INT64 a13){
  unsigned int v14; 
  int v15; 
  __int64 v16; 
  unsigned int Hive; 
  _HBASE_BLOCK *v18; 
  INT64 v20; 
  INT64 v21; 
  int v22; 
  int v23; 
  INT64 v24; 
  if( *(_DWORD *)BugCheckParameter2 != -1092567328
    || ((unsigned int)a3 & 0xFF617CEC) != 0
    || (unsigned int)a4 > 2
    || (unsigned int)(a6 - 1) > 7 )
  {
    __fastfail(5u);
  }
  v14 = (unsigned int)a3 & 0xFFFDFFFF;
  if( !(_BYTE)a2 )
    v14 = (unsigned int)a3;
  *((_DWORD *)BugCheckParameter2 + 40) = v14;
  if( a5 )
  {
    *((_QWORD *)BugCheckParameter2 + 3) = *(_QWORD *)a5;
    *((_QWORD *)BugCheckParameter2 + 4) = *(_QWORD *)(a5 + 8);
    *((_QWORD *)BugCheckParameter2 + 5) = *(_QWORD *)(a5 + 24);
    *((_QWORD *)BugCheckParameter2 + 6) = *(_QWORD *)(a5 + 32);
  }
  if( (_DWORD)a4 )
  {
    v15 = 4;
    if( (_DWORD)a4 == 1 )
      v15 = 1;
    *((_DWORD *)BugCheckParameter2 + 41) = v15;
  }
  else
  {
    *((_DWORD *)BugCheckParameter2 + 41) = 0;
  }
  *((_DWORD *)BugCheckParameter2 + 33) = 4096;
  *((_QWORD *)BugCheckParameter2 + 1) = HvpGetCellPaged;
  *((_DWORD *)BugCheckParameter2 + 34) = a6;
  *((_QWORD *)BugCheckParameter2 + 2) = HvpReleaseCellPaged;
  *((_DWORD *)BugCheckParameter2 + 52) = 2;
  v16 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
  if( (_BYTE)a2 )
  {
    LOBYTE(a2) = 1;
    v20 = (*((__int64(__fastcall **)(_QWORD, INT64, __int64))BugCheckParameter2 + 3))(
            *((unsigned int *)BugCheckParameter2 + 33),
            a2,
            825314627i64);
    v21 = v20;
    if( v20 )
    {
      memset(v20, 0i64);
      *(_DWORD *)(v21 + 28) = 0;
      *(_DWORD *)(v21 + 36) = -1;
      *(_DWORD *)(v21 + 40) = 0;
      *(_DWORD *)v21 = 1718052210;
      *(_DWORD *)(v21 + 4) = 1;
      *(_DWORD *)(v21 + 8) = 1;
      *(_DWORD *)(v21 + 32) = 1;
      *(_DWORD *)(v21 + 44) = 1;
      HvpFillFileName((_HBASE_BLOCK *)v21, FileName);
      *(_DWORD *)(v21 + 144) = 0;
      v22 = v14 & 0x80000;
      if( v22 )
        *(_DWORD *)(v21 + 144) = 2;
      *(_DWORD *)(v21 + 20) = 1;
      v23 = v22 != 0 ? 6 : 3;
      *(_DWORD *)(v21 + 24) = v23;
      *((_DWORD *)BugCheckParameter2 + 53) = v23;
      *(_DWORD *)(v21 + 164) = 1836346738;
      *(_QWORD *)(v21 + 12) = v16;
      if( a9 )
      {
        *(_OWORD *)(v21 + 112) = *(_OWORD *)a9;
        *(_OWORD *)(v21 + 128) = *(_OWORD *)a9;
      }
      if( a10 )
        *(_OWORD *)(v21 + 148) = *(_OWORD *)a10;
      *(_DWORD *)(v21 + 508) = HvpHeaderCheckSum((_DWORD *)v21);
      *((_QWORD *)BugCheckParameter2 + 8) = v21;
      *((_DWORD *)BugCheckParameter2 + 45) = 1;
      *((_DWORD *)BugCheckParameter2 + 42) = 1;
      *((_DWORD *)BugCheckParameter2 + 43) = 1;
      *((_BYTE *)BugCheckParameter2 + 190) = 1;
      if( a12 )
        *(_DWORD *)a12 = 825314627;
      return 0;
    }
    Hive = -1073741670;
    LODWORD(v24) = 16;
LABEL_37:
    SetFailureLocation(a13, 0i64, 24i64, Hive, v24);
    return Hive;
  }
  CmpTraceHiveMountStart(a5, a2, (UINT64)a3);
  Hive = HvLoadHive((ULONG_PTR)BugCheckParameter2);
  CmpTraceHiveMountStop(Hive);
  if( (Hive & 0x80000000) != 0 )
  {
    LODWORD(v24) = 64;
    goto LABEL_37;
  }
  if( Hive == 1073741833 && a11 )
    *(_BYTE *)a11 = 1;
  if( a12 )
    *(_DWORD *)a12 = 825445699;
  v18 = (_HBASE_BLOCK *)*((_QWORD *)BugCheckParameter2 + 8);
  if( (v18->Flags & 1) != 0 )
  {
    HvMarkBaseBlockDirty((_HHIVE *)BugCheckParameter2);
    if( a11 )
      *(_BYTE *)a11 = 1;
    *(_DWORD *)(*((_QWORD *)BugCheckParameter2 + 8) + 144i64) &= ~1u;
    v18 = (_HBASE_BLOCK *)*((_QWORD *)BugCheckParameter2 + 8);
  }
  HvpFillFileName(v18, FileName);
  return 0;
}

Referenced by:

CmpCreateHive