HvHiveStartFileBacked

__int64 __fastcall HvHiveStartFileBacked(
        _HHIVE *Hive,
        __int64 a2,
        unsigned int a3,
        unsigned int a4,
        __int64 a5,
        int a6,
        int a7,
        _UNICODE_STRING *FileName,
        __int64 a9,
        __int64 a10,
        __int64 a11,
        __int64 a12,
        _HIVE_LOAD_FAILURE *HiveLoadFailure){
  unsigned int v14; 
  unsigned int v15; 
  __int64 v16; 
  unsigned int v17; 
  _HBASE_BLOCK *BaseBlock; 
  char *v20; 
  char *v21; 
  int v22; 
  unsigned int v23; 
  UINT64 Point; 

  if( Hive->Signature != -1092567328 || (a3 & 0xFF617CEC) != 0 || a4 > 2 || (unsigned int)(a6 - 1) > 7 )
    __fastfail(5u);
  v14 = a3 & 0xFFFDFFFF;
  if( !(_BYTE)a2 )
    v14 = a3;
  Hive->HiveFlags = v14;
  if( a5 )
  {
    Hive->Allocate = *(void *(__fastcall **)(unsigned int, unsigned __int8, unsigned int))a5;
    Hive->Free = *(void(__fastcall **)(void *, unsigned int))(a5 + 8);
    Hive->FileWrite = *(int(__fastcall **)(_HHIVE *, unsigned int, CMP_OFFSET_ARRAY *, unsigned int, unsigned int))(a5 + 24);
    Hive->FileRead = *(int(__fastcall **)(_HHIVE *, unsigned int, unsigned int, void *, unsigned int))(a5 + 32);
  }
  if( a4 )
  {
    v15 = 4;
    if( a4 == 1 )
      v15 = 1;
    Hive->CurrentLog = v15;
  }
  else
  {
    Hive->CurrentLog = 0;
  }
  Hive->BaseBlockAlloc = 4096;
  Hive->GetCellRoutine = (_CELL_DATA *(__fastcall *)(_HHIVE *, unsigned int, _HV_GET_CELL_CONTEXT *))HvpGetCellPaged;
  Hive->Cluster = a6;
  Hive->ReleaseCellRoutine = (void(__fastcall *)(_HHIVE *, _HV_GET_CELL_CONTEXT *))HvpReleaseCellPaged;
  Hive->StorageTypeCount = 2;
  v16 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
  if( (_BYTE)a2 )
  {
    LOBYTE(a2) = 1;
    v20 = (char *)Hive->Allocate(Hive->BaseBlockAlloc, a2, 825314627i64);
    v21 = v20;
    if( v20 )
    {
      memset(v20, 0i64, Hive->BaseBlockAlloc);
      *((_DWORD *)v21 + 7) = 0;
      *((_DWORD *)v21 + 9) = -1;
      *((_DWORD *)v21 + 10) = 0;
      *(_DWORD *)v21 = 1718052210;
      *((_DWORD *)v21 + 1) = 1;
      *((_DWORD *)v21 + 2) = 1;
      *((_DWORD *)v21 + 8) = 1;
      *((_DWORD *)v21 + 11) = 1;
      HvpFillFileName((_HBASE_BLOCK *)v21, FileName);
      *((_DWORD *)v21 + 36) = 0;
      v22 = v14 & 0x80000;
      if( v22 )
        *((_DWORD *)v21 + 36) = 2;
      *((_DWORD *)v21 + 5) = 1;
      v23 = v22 != 0 ? 6 : 3;
      *((_DWORD *)v21 + 6) = v23;
      Hive->Version = v23;
      *((_DWORD *)v21 + 41) = 1836346738;
      *(_QWORD *)(v21 + 12) = v16;
      if( a9 )
      {
        *((_OWORD *)v21 + 7) = *(_OWORD *)a9;
        *((_OWORD *)v21 + 8) = *(_OWORD *)a9;
      }
      if( a10 )
        *(_OWORD *)(v21 + 148) = *(_OWORD *)a10;
      *((_DWORD *)v21 + 127) = HvpHeaderCheckSum((_HBASE_BLOCK *)v21);
      Hive->BaseBlock = (_HBASE_BLOCK *)v21;
      Hive->MinimumLogSequence = 1;
      Hive->CurrentLogSequence = 1;
      Hive->CurrentLogMinimumSequence = 1;
      Hive->PrimaryFileValid = 1;
      if( a12 )
        *(_DWORD *)a12 = 825314627;
      return 0;
    }
    v17 = -1073741670;
    LODWORD(Point) = 16;
LABEL_37:
    SetFailureLocation(HiveLoadFailure, 0i64, _HvHiveStartFileBacked, v17, Point);
    return v17;
  }
  CmpTraceHiveMountStart();
  v17 = HvLoadHive(Hive);
  CmpTraceHiveMountStop(v17);
  if( (v17 & 0x80000000) != 0 )
  {
    LODWORD(Point) = 64;
    goto LABEL_37;
  }
  if( v17 == 1073741833 && a11 )
    *(_BYTE *)a11 = 1;
  if( a12 )
    *(_DWORD *)a12 = 825445699;
  BaseBlock = Hive->BaseBlock;
  if( (BaseBlock->Flags & 1) != 0 )
  {
    HvMarkBaseBlockDirty(Hive);
    if( a11 )
      *(_BYTE *)a11 = 1;
    Hive->BaseBlock->Flags &= ~1u;
    BaseBlock = Hive->BaseBlock;
  }
  HvpFillFileName(BaseBlock, FileName);
  return 0;
}

Referenced by:

CmpCreateHive