CmpCreateChild

INT64 __fastcall CmpCreateChild(
        INT64 a1,
        INT64 a2,
        INT64 r8,
        UNICODE_STRING *a4,
        INT64 a5,
        INT16 a6,
        INT64 a7,
        CHAR a8,
        INT64 a9){
  char v9; 
  char v10; 
  INT64 KcbAtLayerHeight; 
  INT64 v12; 
  INT64 v13; 
  ULONG_PTR v14; 
  INT64 v15; 
  INT64 v16; 
  unsigned int v17; 
  _DWORD *v18; 
  bool IsKcbInsideVirtualStore; 
  __int16 v20; 
  INT64 v21; 
  __int64 v22; 
  __int16 v23; 
  int v24; 
  INT64 v25; 
  GENERIC_MAPPING *GenericMapping; 
  LIST_ENTRY *SecurityDescriptorForKcbStack; 
  BOOL v28; 
  NTSTATUS v29; 
  int v30; 
  __int64 v31; 
  _CM_KEY_NODE *v32; 
  INT64 v33; 
  INT64 v34; 
  int SecurityDescriptorNode; 
  INT64 v36; 
  char v37; 
  __int16 v38; 
  wchar_t *v39; 
  __int64 v40; 
  UNICODE_STRING *v41; 
  unsigned int v42; 
  bool v43; 
  _CM_KCB_UOW *UnitOfWork; 
  int v45; 
  _CM_KCB_UOW *v46; 
  int v47; 
  int v48; 
  __int64 v49; 
  INT64 v50; 
  int v51; 
  __int64 v52; 
  INT64 v53; 
  int v54; 
  __int64 v55; 
  INT64 v56; 
  int v57; 
  __int64 v58; 
  HSTORAGE_TYPE v59; 
  _CM_KEY_NODE *v60; 
  __int16 v61; 
  UNICODE_STRING *v62; 
  int Buffer; 
  unsigned __int16 v64; 
  __int16 v65; 
  UNICODE_STRING *v66; 
  INT64 v67; 
  __int64 v68; 
  ULONG_PTR v69; 
  int v70; 
  INT64 v71; 
  UINT8 v72; 
  UNICODE_STRING *Length; 
  unsigned int v74; 
  __int64 v75; 
  void *v76; 
  void *v77; 
  PSECURITY_DESCRIPTOR v78; 
  __int64 v79; 
  void *v80; 
  char v82; 
  char v83; 
  _CM_KEY_NODE *Node; 
  char v85; 
  __int16 v86; 
  ULONG_PTR BugCheckParameter3; 
  __int16 v88; 
  char Size[12]; 
  ULONG_PTR BugCheckParameter4; 
  ULONG_PTR v91; 
  UNICODE_STRING *String1; 
  int v93; 
  VOID *CellAddress; 
  _HV_GET_CELL_CONTEXT CellAddressContext; 
  PSECURITY_DESCRIPTOR NewDescriptor; 
  __int64 v97; 
  int v98; 
  __int64 v99; 
  _HV_GET_CELL_CONTEXT v100; 
  _CM_KCB_UOW *v101; 
  _CM_KCB_UOW *v102; 
  INT64 v103; 
  ULONG_PTR BugCheckParameter2; 
  signed int v108; 
  unsigned __int16 *p_ClassLength; 
  v83 = 0;
  v9 = 0;
  v10 = 0;
  v85 = 0;
  Node = 0i64;
  v93 = -1;
  v100 = (_HV_GET_CELL_CONTEXT)0xFFFFFFFFi64;
  CellAddress = 0i64;
  BugCheckParameter3 = -1i64;
  CellAddressContext = (_HV_GET_CELL_CONTEXT)0xFFFFFFFFi64;
  v97 = 0i64;
  v99 = 0xFFFFFFFFi64;
  NewDescriptor = 0i64;
  *(_DWORD *)Size = -1;
  v91 = 0i64;
  v101 = 0i64;
  BugCheckParameter4 = 0i64;
  v102 = 0i64;
  v82 = 0;
  KcbAtLayerHeight = CmpGetKcbAtLayerHeight(a1, *(_WORD *)(a1 + 2));
  String1 = (UNICODE_STRING *)KcbAtLayerHeight;
  v13 = CmpGetKcbAtLayerHeight(v12, *(_WORD *)(v12 + 2));
  v103 = v13;
  v14 = *(_QWORD *)(v13 + 32);
  BugCheckParameter2 = v14;
  if( a9 && (*(_DWORD *)(v14 + 160) & 2) != 0 )
  {
    v15 = 3222863873i64;
    v16 = 262400i64;
LABEL_4:
    v17 = v15;
LABEL_5:
    v18 = (_DWORD *)a5;
LABEL_6:
    CmpRecordParseFailure((INT64)v18, v16, v15);
LABEL_155:
    v32 = Node;
    goto LABEL_156;
  }
  if( (a7 & 0xFFFFFFFC) != 0 )
  {
    v17 = -1073741811;
    v15 = 3221225485i64;
    v16 = 262528i64;
    goto LABEL_5;
  }
  if( (a7 & 1) != 0 || (*(_DWORD *)(v14 + 4152) & 0x20) != 0 )
  {
    v10 = 1;
    v85 = 1;
  }
  if( (*(_DWORD *)(KcbAtLayerHeight + 8) & 0x80u) != 0 )
  {
    v15 = 3221225506i64;
    v16 = 262656i64;
    goto LABEL_4;
  }
  if( CmpIsKcbImmutable((_CM_KEY_CONTROL_BLOCK *)KcbAtLayerHeight) )
  {
    v15 = 3221225506i64;
    v16 = 262912i64;
    goto LABEL_4;
  }
  if( *(_BYTE *)(KcbAtLayerHeight + 65) == 1 )
  {
    v15 = 3221225506i64;
    v16 = 263168i64;
    goto LABEL_4;
  }
  IsKcbInsideVirtualStore = CmpIsKcbInsideVirtualStore(KcbAtLayerHeight);
  v23 = v20 | 0x200;
  if( !IsKcbInsideVirtualStore )
    v23 = v20;
  v86 = v23;
  if( v10 && *(_QWORD *)(r8 + 64) )
  {
    v15 = 3221225506i64;
    v16 = 263424i64;
    goto LABEL_4;
  }
  v18 = (_DWORD *)a5;
  v24 = *(_DWORD *)(a5 + 24) & 1;
  v98 = v24;
  if( *(int *)(KcbAtLayerHeight + 40) < 0 && !v24 && (!v21 || !*(_QWORD *)(KcbAtLayerHeight + 240)) )
  {
    v17 = -1073741439;
    v15 = 3221225857i64;
    v16 = 263680i64;
    goto LABEL_6;
  }
  if( v21 && !CmpIsKeyStackDeleted(v22, 0i64) )
  {
    if( (int)CmpUndoDeleteKeyForTrans(v13, a9, v21) < 0 )
    {
      v17 = -1073741772;
      v15 = 3221225524i64;
      v16 = 263936i64;
      goto LABEL_6;
    }
LABEL_154:
    v17 = 0;
    goto LABEL_155;
  }
  if( (*(_DWORD *)(a5 + 160) & 1) == 0 )
  {
    CmpAttachToRegistryProcess((KAPC_STATE *)(a5 + 168));
    *(_DWORD *)(a5 + 160) |= 1u;
  }
  v88 = v86 & 2;
  if( (v86 & 2) == 0 )
  {
    if( v85 )
    {
      NewDescriptor = CmpGetSecurityDescriptorForKcbStack(a1, a9, v21);
    }
    else
    {
      if( SkipVirtualAccessCheck(v13) )
        *(_QWORD *)&Size[4] = 0i64;
      else
        *(_QWORD *)&Size[4] = *(_QWORD *)(r8 + 64);
      GenericMapping = (GENERIC_MAPPING *)((char *)CmKeyObjectType + 76);
      SecurityDescriptorForKcbStack = CmpGetSecurityDescriptorForKcbStack(a1, a9, v25);
      LOBYTE(v28) = 1;
      v29 = SeAssignSecurity(
              SecurityDescriptorForKcbStack,
              *(PVOID *)&Size[4],
              &NewDescriptor,
              v28,
              (SECURITY_SUBJECT_CONTEXT *)(r8 + 32),
              GenericMapping,
              *((POOL_TYPE *)CmKeyObjectType + 25));
      v17 = v29;
      if( v29 < 0 )
      {
        v15 = (unsigned int)v29;
        v16 = 264192i64;
        goto LABEL_6;
      }
      KcbAtLayerHeight = (INT64)String1;
    }
  }
  v30 = v98;
  if( a9 )
    v30 = 1;
  *(_DWORD *)&Size[4] = v30;
  v31 = *(unsigned int *)(v13 + 40);
  if( (_DWORD)v31 != -1 )
  {
    if( v30 != (unsigned int)v31 >> 31 )
    {
      CmpLogUnsupportedOperation(2i64);
      v31 = *(unsigned int *)(v13 + 40);
    }
    v108 = (unsigned int)v31 >> 31;
    if( !a8 )
    {
      HvLockHiveFlusherShared(v14);
      v9 = 1;
      v31 = *(unsigned int *)(v13 + 40);
    }
    v32 = (_CM_KEY_NODE *)(*(__int64(__fastcall **)(ULONG_PTR, __int64, _HV_GET_CELL_CONTEXT *))(v14 + 8))(
                            v14,
                            v31,
                            &v100);
    Node = v32;
    if( CmpNameSize(a4) != v32->NameLength )
    {
      CmpLogUnsupportedOperation(1i64);
      v17 = -1073741822;
      v33 = 3221225474i64;
      v34 = 264448i64;
      goto LABEL_52;
    }
    if( !CmpMarkKeyDirty(v14, *(unsigned int *)(v13 + 40), 0) )
    {
      v33 = 3221225853i64;
      v17 = -1073741443;
      v34 = 264704i64;
      goto LABEL_52;
    }
    if( !HvMarkCellDirty(v14, LODWORD(String1[2].Buffer), 0) )
    {
      v33 = 3221225853i64;
      v17 = -1073741443;
      v34 = 264960i64;
      goto LABEL_52;
    }
    if( *(_WORD *)(a5 + 4) )
    {
      LODWORD(BugCheckParameter3) = HvAllocateCell(
                                      (_HHIVE *)v14,
                                      *(unsigned __int16 *)(a5 + 4),
                                      (HSTORAGE_TYPE)v108,
                                      &CellAddress,
                                      &CellAddressContext);
      *(_DWORD *)&Size[4] = BugCheckParameter3;
      if( (_DWORD)BugCheckParameter3 == -1 )
      {
        v33 = 3221225626i64;
        v17 = -1073741670;
        v34 = 265216i64;
        goto LABEL_52;
      }
      memmove((UINT8 *)CellAddress, *(UINT8 **)(a5 + 8), *(unsigned __int16 *)(a5 + 4));
      (*(void(__fastcall **)(ULONG_PTR, _HV_GET_CELL_CONTEXT *))(v14 + 16))(v14, &CellAddressContext);
      CellAddress = 0i64;
    }
    CmLockHiveSecurityExclusive((_CMHIVE *)v14);
    SecurityDescriptorNode = CmpGetSecurityDescriptorNode(
                               (_HHIVE *)v14,
                               *(unsigned int *)(v13 + 40),
                               v32,
                               NewDescriptor,
                               1u,
                               (UINT64 *)Size);
    v17 = SecurityDescriptorNode;
    if( SecurityDescriptorNode >= 0 )
    {
      CmpFreeSecurityDescriptor(v14, *(unsigned int *)(v13 + 40));
      v32->Security = *(_DWORD *)Size;
      CmUnlockHiveSecurity(v14);
      v32->Class = BugCheckParameter3;
      p_ClassLength = &v32->ClassLength;
      v32->ClassLength = *(_WORD *)(a5 + 4);
      LODWORD(BugCheckParameter3) = -1;
      CmpCopyName(v32->Name, a4);
      *((_BYTE *)v32 + 13) |= 3u;
      v38 = v86;
      v32->Flags = v86;
      if( v32->NameLength < a4->Length )
        v32->Flags = v38 | 0x20;
      v39 = *(wchar_t **)&KUSER_SHARED_DATA.SystemTime.LowPart;
      v32 = Node;
      Node->LastWriteTime.QuadPart = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
      ++*(_QWORD *)(v13 + 304);
      CmpRebuildKcbCacheFromNode((_CM_KEY_CONTROL_BLOCK *)v13, v32);
      v40 = (*(__int64(__fastcall **)(ULONG_PTR, _QWORD, __int64 *))(v14 + 8))(v14, LODWORD(String1[2].Buffer), &v99);
      v97 = v40;
      *(_QWORD *)(v40 + 4) = v39;
      v41 = String1;
      String1[10].Buffer = v39;
      ++*(_QWORD *)&v41[19].Length;
      v42 = *p_ClassLength;
      if( *(_DWORD *)(v40 + 56) < v42 )
        *(_DWORD *)(v40 + 56) = v42;
      if( v9 )
        HvUnlockHiveFlusherShared(v14);
      CmpReportNotifyForKcbStack(a1, 0i64, 1i64, 0i64);
      v17 = 0;
      v9 = 0;
      goto LABEL_156;
    }
    v36 = 265728i64;
LABEL_63:
    CmpRecordParseFailure(a5, v36, (unsigned int)SecurityDescriptorNode);
    v37 = 1;
    goto LABEL_157;
  }
  v43 = a8 == 0;
  if( !a8 )
  {
    HvLockHiveFlusherShared(v14);
    v43 = 1;
  }
  v9 = v43;
  if( a9 )
  {
    UnitOfWork = CmpAllocateUnitOfWork();
    v91 = (ULONG_PTR)UnitOfWork;
    v101 = UnitOfWork;
    if( !UnitOfWork )
    {
      v15 = 3221225626i64;
      v17 = -1073741670;
      v16 = 265984i64;
      goto LABEL_6;
    }
    CmpTransEnlistUowInKcb(UnitOfWork, KcbAtLayerHeight);
    CmpTransEnlistUowInCmTrans((_CM_KCB_UOW *)v91, (_CM_TRANS *)a9);
    v17 = v45;
    if( v45 < 0 )
    {
      v15 = (unsigned int)v45;
      v16 = 266240i64;
      goto LABEL_6;
    }
    v46 = CmpAllocateUnitOfWork();
    BugCheckParameter4 = (ULONG_PTR)v46;
    v102 = v46;
    if( !v46 )
    {
      v15 = 3221225626i64;
      v17 = -1073741670;
      v16 = 266496i64;
      goto LABEL_6;
    }
    CmpTransEnlistUowInKcb(v46, v13);
    CmpTransEnlistUowInCmTrans((_CM_KCB_UOW *)BugCheckParameter4, (_CM_TRANS *)a9);
    v17 = v47;
    if( v47 < 0 )
    {
      v15 = (unsigned int)v47;
      v16 = 266752i64;
      goto LABEL_6;
    }
    if( !CmpLockIXLockIntent((UINT64 *)(KcbAtLayerHeight + 248), v91) )
    {
      v15 = 3222863873i64;
      v17 = -1072103423;
      v16 = 267008i64;
      goto LABEL_6;
    }
    if( !CmpLockIXLockExclusive(v13 + 248, (_QWORD *)BugCheckParameter4, 0) )
    {
      v15 = 3222863873i64;
      v17 = -1072103423;
      v16 = 267264i64;
      goto LABEL_6;
    }
    if( !CmpLockIXLockExclusive(v13 + 264, (_QWORD *)BugCheckParameter4, 1) )
    {
      v15 = 3222863873i64;
      v17 = -1072103423;
      v16 = 267520i64;
      goto LABEL_6;
    }
  }
  else
  {
    if( *(_QWORD *)(KcbAtLayerHeight + 240) )
    {
      if( (a7 & 2) != 0 )
      {
        v15 = 3222863873i64;
        v17 = -1072103423;
        v16 = 267648i64;
      }
      else
      {
        v48 = CmpSnapshotTxOwnerArray(KcbAtLayerHeight + 248, (UINT64 *)(a5 + 120), (VOID ***)(a5 + 128));
        v17 = v48;
        if( v48 >= 0 )
        {
          CmpLogTransactionAbortedWithChildName(KcbAtLayerHeight, a4, 6, v49, *(_DWORD *)(a5 + 120));
          *(_DWORD *)(a5 + 100) |= 4u;
          v15 = 3221226029i64;
          v17 = -1073741267;
          v16 = 268032i64;
        }
        else
        {
          v15 = (unsigned int)v48;
          v16 = 267776i64;
        }
      }
      goto LABEL_6;
    }
    if( !CmpTryAcquireIXLockIntent((_CM_INTENT_LOCK *)(KcbAtLayerHeight + 248)) )
    {
      if( (a7 & 2) != 0 )
      {
        v15 = 3222863873i64;
        v17 = -1072103423;
        v16 = 268160i64;
      }
      else
      {
        v51 = CmpSnapshotTxOwnerArray(v50, (UINT64 *)(a5 + 120), (VOID ***)(a5 + 128));
        v17 = v51;
        if( v51 >= 0 )
        {
          CmpLogTransactionAbortedWithChildName(KcbAtLayerHeight, a4, 6, v52, *(_DWORD *)(a5 + 120));
          *(_DWORD *)(a5 + 100) |= 4u;
          v15 = 3221226029i64;
          v17 = -1073741267;
          v16 = 268544i64;
        }
        else
        {
          v15 = (unsigned int)v51;
          v16 = 268288i64;
        }
      }
      goto LABEL_6;
    }
    if( !CmpTryAcquireIXLockExclusive((_CM_INTENT_LOCK *)(v13 + 248)) )
    {
      if( (a7 & 2) != 0 )
      {
        v15 = 3222863873i64;
        v17 = -1072103423;
        v16 = 268672i64;
      }
      else
      {
        v54 = CmpSnapshotTxOwnerArray(v53, (UINT64 *)(a5 + 120), (VOID ***)(a5 + 128));
        v17 = v54;
        if( v54 >= 0 )
        {
          CmpLogTransactionAbortedWithChildName(KcbAtLayerHeight, a4, 6, v55, *(_DWORD *)(a5 + 120));
          *(_DWORD *)(a5 + 100) |= 4u;
          v15 = 3221226029i64;
          v17 = -1073741267;
          v16 = 269056i64;
        }
        else
        {
          v15 = (unsigned int)v54;
          v16 = 268800i64;
        }
      }
      goto LABEL_6;
    }
    if( !CmpTryAcquireIXLockExclusive((_CM_INTENT_LOCK *)(v13 + 264)) )
    {
      if( (a7 & 2) != 0 )
      {
        v15 = 3222863873i64;
        v17 = -1072103423;
        v16 = 269184i64;
      }
      else
      {
        v57 = CmpSnapshotTxOwnerArray(v56, (UINT64 *)(a5 + 120), (VOID ***)(a5 + 128));
        v17 = v57;
        if( v57 >= 0 )
        {
          CmpLogTransactionAbortedWithChildName(KcbAtLayerHeight, a4, 6, v58, *(_DWORD *)(a5 + 120));
          *(_DWORD *)(a5 + 100) |= 4u;
          v15 = 3221226029i64;
          v17 = -1073741267;
          v16 = 269568i64;
        }
        else
        {
          v15 = (unsigned int)v57;
          v16 = 269312i64;
        }
      }
      goto LABEL_6;
    }
  }
  *(_DWORD *)Size = CmpHKeyNodeSize(a4);
  v59 = *(_DWORD *)&Size[4];
  HIDWORD(BugCheckParameter3) = HvAllocateCell(
                                  (_HHIVE *)v14,
                                  *(unsigned int *)Size,
                                  *(HSTORAGE_TYPE *)&Size[4],
                                  (VOID **)&Node,
                                  &v100);
  v93 = HIDWORD(BugCheckParameter3);
  if( HIDWORD(BugCheckParameter3) == -1 )
  {
    v15 = 3221225626i64;
    v17 = -1073741670;
    v16 = 269824i64;
    goto LABEL_6;
  }
  if( *(_WORD *)(a5 + 4) )
  {
    LODWORD(BugCheckParameter3) = HvAllocateCell(
                                    (_HHIVE *)v14,
                                    *(unsigned __int16 *)(a5 + 4),
                                    v59,
                                    &CellAddress,
                                    &CellAddressContext);
    *(_DWORD *)&Size[4] = BugCheckParameter3;
    if( (_DWORD)BugCheckParameter3 == -1 )
    {
      v15 = 3221225626i64;
      v17 = -1073741670;
      v16 = 270080i64;
      goto LABEL_6;
    }
    memmove((UINT8 *)CellAddress, *(UINT8 **)(a5 + 8), *(unsigned __int16 *)(a5 + 4));
    (*(void(__fastcall **)(ULONG_PTR, _HV_GET_CELL_CONTEXT *))(v14 + 16))(v14, &CellAddressContext);
    CellAddress = 0i64;
  }
  v60 = Node;
  memset((INT64)Node, 0i64);
  v61 = 27500;
  if( !v88 )
    v61 = 27502;
  v60->Signature = v61;
  v60->AccessBits = CmpAccessBitForPhase;
  if( *(_BYTE *)(KcbAtLayerHeight + 65) == 3 )
    *((_BYTE *)v60 + 13) |= 3u;
  else
    *((_BYTE *)v60 + 13) &= 0xFCu;
  v60->Flags = v86;
  v32 = Node;
  Node->LastWriteTime.QuadPart = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
  v62 = String1;
  v32->Parent = (unsigned int)String1[2].Buffer;
  v32->SubKeyLists[0] = -1;
  v32->SubKeyLists[1] = -1;
  v32->ValueList.List = -1;
  v32->Security = -1;
  v32->Class = BugCheckParameter3;
  v32->ClassLength = *(_WORD *)(a5 + 4);
  LODWORD(BugCheckParameter3) = -1;
  Buffer = (int)v62[11].Buffer;
  if( (Buffer & 0x80u) != 0 )
    *((_DWORD *)v32 + 13) ^= (*((_DWORD *)v32 + 13) ^ (Buffer << 16)) & 0xF00000;
  v64 = CmpCopyName(v32->Name, a4);
  v32->NameLength = v64;
  if( v64 < a4->Length )
    v60->Flags |= 0x20u;
  v65 = v88;
  if( v88 )
  {
    v32->ChildHiveReference.KeyHive = *(_HHIVE **)(a5 + 48);
    v32->SubKeyLists[0] = *(_DWORD *)(a5 + 40);
  }
  v83 = 1;
  if( !v65 )
  {
    CmLockHiveSecurityExclusive((_CMHIVE *)v14);
    SecurityDescriptorNode = CmpAssignSecurityDescriptor(v14, HIDWORD(BugCheckParameter3), (INT64)v32, NewDescriptor, 0);
    v17 = SecurityDescriptorNode;
    if( SecurityDescriptorNode < 0 )
    {
      v36 = 270592i64;
      goto LABEL_63;
    }
    CmUnlockHiveSecurity(v14);
  }
  v66 = String1;
  if( HvMarkCellDirty(v14, LODWORD(String1[2].Buffer), 0) )
  {
    v67 = a9;
    if( !a9 )
    {
      if( !CmpAddSubKey(v14, LODWORD(v66[2].Buffer), HIDWORD(BugCheckParameter3)) )
      {
        v33 = 3221225626i64;
        v17 = -1073741670;
        v34 = 271104i64;
        goto LABEL_52;
      }
      v67 = 0i64;
    }
    v82 = 1;
    *(_DWORD *)(v13 + 40) = HIDWORD(BugCheckParameter3);
    HIDWORD(BugCheckParameter3) = -1;
    *(_QWORD *)(v13 + 240) = v67;
    if( (v86 & 0x40) == 0 )
    {
      *(_DWORD *)(v13 + 96) = v32->ValueList.Count;
      *(_DWORD *)(v13 + 100) = v32->ValueList.List;
    }
    ++*(_QWORD *)(v13 + 304);
    CmpRebuildKcbCacheFromNode((_CM_KEY_CONTROL_BLOCK *)v13, v32);
    if( !v88 )
      CmpAssignSecurityToKcb(v13, v32->Security, 0i64, 0, 0);
    if( a9 )
    {
      v68 = BugCheckParameter4;
      *(_DWORD *)(BugCheckParameter4 + 68) = 0;
      *(_DWORD *)(v68 + 72) = v98;
      v69 = v91;
      *(_QWORD *)(v68 + 80) = v91;
      *(_DWORD *)(v69 + 68) = 1;
      *(_QWORD *)(v69 + 88) = v13;
      v70 = CmAddLogForAction(v68, 1u);
      v17 = v70;
      if( v70 < 0 )
      {
        v33 = (unsigned int)v70;
        v34 = 271360i64;
        goto LABEL_52;
      }
      BugCheckParameter4 = 0i64;
      v91 = 0i64;
      v66 = String1;
    }
    v71 = (*(__int64(__fastcall **)(_QWORD, _QWORD, __int64 *))(*(_QWORD *)&v66[2].Length + 8i64))(
            *(_QWORD *)&v66[2].Length,
            LODWORD(v66[2].Buffer),
            &v99);
    v97 = v71;
    CmpUpdateKeyNodeAccessBits(*(_QWORD *)&v66[2].Length, v71, LODWORD(v66[2].Buffer));
    *(_QWORD *)(v71 + 4) = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
    Length = (UNICODE_STRING *)a4->Length;
    if( (unsigned __int16)*(_DWORD *)(v71 + 52) < (unsigned int)Length )
      *(_WORD *)(v71 + 52) = (_WORD)Length;
    v74 = *(unsigned __int16 *)(a5 + 4);
    if( *(_DWORD *)(v71 + 56) < v74 )
      *(_DWORD *)(v71 + 56) = v74;
    ++*(_QWORD *)&v66[19].Length;
    v75 = v97;
    v66[11].Length = *(_WORD *)(v97 + 52);
    v66[10].Buffer = *(wchar_t **)(v75 + 4);
    LOBYTE(Length) = 1;
    CmpCleanUpSubKeyInfo(v66, Length, v72);
    if( !a8 )
      HvUnlockHiveFlusherShared(v14);
    CmpReportNotifyForKcbStack(a1, a9, 1i64, 0i64);
    v82 = 0;
    v9 = a8 != 0 ? v9 : 0;
    goto LABEL_154;
  }
  v33 = 3221225853i64;
  v17 = -1073741443;
  v34 = 270848i64;
LABEL_52:
  CmpRecordParseFailure(a5, v34, v33);
LABEL_156:
  v37 = 0;
LABEL_157:
  if( v37 )
    CmUnlockHiveSecurity(v14);
  if( v82 )
  {
    HIDWORD(BugCheckParameter3) = *(_DWORD *)(v13 + 40);
    *(_DWORD *)(v13 + 40) = -1;
    *(_DWORD *)(v13 + 96) = 0;
    *(_DWORD *)(v13 + 100) = -1;
    *(_WORD *)(v13 + 186) = 0;
    *(_DWORD *)(v13 + 112) = 0;
    *(_QWORD *)(v13 + 168) = 0i64;
    *(_QWORD *)(v13 + 176) = 0i64;
    *(_DWORD *)(v13 + 184) &= 0xFFFFFF00;
    *(_BYTE *)(v13 + 185) = 0;
    *(_QWORD *)(v13 + 240) = 0i64;
    *(_QWORD *)(v13 + 88) = 0i64;
  }
  v76 = (void *)BugCheckParameter4;
  if( BugCheckParameter4 )
  {
    CmpRundownUnitOfWork(BugCheckParameter4);
    CmpFreeUnitOfWork(v76);
  }
  v77 = (void *)v91;
  if( v91 )
  {
    CmpRundownUnitOfWork(v91);
    CmpFreeUnitOfWork(v77);
  }
  v78 = NewDescriptor;
  if( NewDescriptor && !v85 )
  {
    if( (*v18 & 1) != 0 && (v18[6] & 4) != 0 )
    {
      SeDeassignSecurity(&NewDescriptor);
    }
    else
    {
      v79 = *(_QWORD *)(r8 + 72);
      v80 = *(void **)(v79 + 48);
      if( v80 )
        ExFreePoolWithTag(v80, 0);
      *(_QWORD *)(v79 + 48) = v78;
    }
  }
  if( v97 )
    (*(void(__fastcall **)(_QWORD, __int64 *))(*(_QWORD *)&String1[2].Length + 16i64))(
      *(_QWORD *)&String1[2].Length,
      &v99);
  if( CellAddress )
    (*(void(__fastcall **)(ULONG_PTR, _HV_GET_CELL_CONTEXT *))(v14 + 16))(v14, &CellAddressContext);
  if( (_DWORD)BugCheckParameter3 != -1 )
    HvFreeCell(v14, (unsigned int)BugCheckParameter3);
  if( v32 )
    (*(void(__fastcall **)(ULONG_PTR, _HV_GET_CELL_CONTEXT *))(v14 + 16))(v14, &v100);
  if( HIDWORD(BugCheckParameter3) != -1 )
  {
    if( v83 )
      CmpFreeKeyByCell((_HHIVE *)v14, HIDWORD(BugCheckParameter3), 0);
    else
      HvFreeCell(v14, HIDWORD(BugCheckParameter3));
  }
  if( v9 )
    HvUnlockHiveFlusherShared(v14);
  return v17;
}

Referenced by:

CmpDoBuildVirtualStack
CmpDoParseKey