CmpDoParseKey

INT64 __fastcall CmpDoParseKey(
        INT64 rcx0,
        _ACCESS_STATE *rdx0,
        UINT8 r8_0,
        INT16 r9_0,
        _UNICODE_STRING *arg20,
        INT64 *arg28,
        INT64 a3,
        INT64 _2D8,
        PADAPTER_OBJECT *arg40){
  _CM_KEY_CONTROL_BLOCK *v11; 
  INT16 v12; 
  __m128i v13; 
  INT16 v14; 
  INT64 v15; 
  _CM_KEY_CONTROL_BLOCK *v16; 
  _CM_TRANS_PTR v17; 
  UINT64 v18; 
  int v19; 
  int v20; 
  unsigned int v21; 
  int v22; 
  int v23; 
  int v24; 
  char v25; 
  _UNICODE_STRING *v26; 
  int started; 
  int v28; 
  INT64 *v29; 
  INT64 *v30; 
  __int64 ParentKcb; 
  _CM_KEY_BODY *v32; 
  _CM_KEY_CONTROL_BLOCK *KeyControlBlock; 
  bool v34; 
  bool v35; 
  __int16 v36; 
  __int32 *p_bf_b8; 
  _UNICODE_STRING *v38; 
  unsigned int v39; 
  unsigned int v40; 
  _CM_TRANS *v41; 
  CHAR a5; 
  int v43; 
  struct _ACCESS_STATE *v44; 
  _UNICODE_STRING *v45; 
  INT64 v46; 
  UINT64 v47; 
  int v48; 
  INT64 v50; 
  int ComponentHashAtIndex; 
  const _UNICODE_STRING *v52; 
  bool v53; 
  int v54; 
  unsigned __int64 FullKCBName; 
  char v56; 
  __int16 v57; 
  __int16 v58; 
  wchar_t *v59; 
  __int16 v60; 
  wchar_t *v61; 
  __int16 v62; 
  int v63; 
  int v64; 
  int v65; 
  char v66; 
  int SymbolicLinkTarget; 
  _HHIVE *KeyHive; 
  _CM_KEY_CONTROL_BLOCK *v69; 
  INT64 *v70; 
  char v71; 
  int v72; 
  _HHIVE *v73; 
  unsigned int v74; 
  __int64 *v75; 
  INT64 v76; 
  _UNICODE_STRING *v77; 
  unsigned int Logic; 
  int v79; 
  _UNICODE_STRING *v80; 
  int Child; 
  _CM_NAME_CONTROL_BLOCK *NameBlock; 
  unsigned int NameLength; 
  __int64 v84; 
  __int16 v85; 
  __int64 v86; 
  INT64 v87; 
  INT64 v88; 
  unsigned int v89; 
  _CM_COMPONENT_HASH v90; 
  INT64 v91; 
  UINT64 v92; 
  unsigned int *v93; 
  CMHIVE *v94; 
  int HiveRootCell; 
  INT64 v96; 
  INT64 v97; 
  INT64 v98; 
  INT8 v99; 
  int v100; 
  _HHIVE *v101; 
  unsigned int DirtyCount; 
  __int64 KeyNodeForKcb; 
  __int64 v104; 
  INT64 v105; 
  INT64 v106; 
  _EPROCESS *CurrentThreadProcess; 
  INT64 v108; 
  NTSTATUS ServerSiloServiceSessionId; 
  NTSTATUS SessionId; 
  INT64 v111; 
  INT64 v112; 
  INT64 v113; 
  INT64 v114; 
  INT64 v115; 
  _UNICODE_STRING *v116; 
  UINT64 *v117; 
  INT64 v118; 
  int v119; 
  _UNICODE_STRING *v120; 
  int v121; 
  INT8 v122; 
  INT64 v123; 
  INT64 v124; 
  _UNICODE_STRING *v125; 
  UINT64 *v126; 
  _UNICODE_STRING *ComponentNameAtIndex; 
  UINT64 *v128; 
  unsigned int v129; 
  INT64 v130; 
  _UNICODE_STRING *v131; 
  UINT64 *v132; 
  INT64 v133; 
  _UNICODE_STRING *v134; 
  UINT64 *v135; 
  _EPROCESS *v136; 
  INT64 v137; 
  NTSTATUS v138; 
  NTSTATUS v139; 
  INT64 v140; 
  INT64 v141; 
  _CM_KEY_CONTROL_BLOCK *v142; 
  _UNICODE_STRING *v143; 
  int v144; 
  _CM_KEY_CONTROL_BLOCK *v145; 
  INT64 v146; 
  INT64 v147; 
  int v148; 
  _UNICODE_STRING *v149; 
  unsigned int v150; 
  _WCHAR v151; 
  INT64 v152; 
  int v153; 
  INT64 a6; 
  INT64 ObjectCreated; 
  INT64 ObjectCreatedd; 
  INT64 ObjectCreateda; 
  INT64 ObjectCreatedb; 
  INT64 ObjectCreatedc; 
  PVOID v160; 
  bool v161; 
  unsigned int a9; 
  char a9_4; 
  __int16 a9_5; 
  char a9_7; 
  _UNICODE_STRING *v166; 
  char v167; 
  INT64 a1; 
  __int16 a8; 
  int a8_2; 
  INT16 v171[2]; 
  char v172; 
  PVOID BugCheckParameter4; 
  UINT8 v174[8]; 
  struct _ACCESS_STATE *a4; 
  __int64 v176; 
  __m128i *p_ParentKcb; 
  _UNICODE_STRING *String2; 
  PADAPTER_OBJECT DmaAdapter; 
  _UNICODE_STRING *KeyName; 
  __m128i v181; 
  PVOID v182; 
  _CM_KEY_BODY *KeyBody; 
  INT64 v184; 
  INT64 v185; 
  PVOID BugCheckParameter2; 
  INT64 a7[2]; 
  _UNICODE_STRING DestinationString; 
  PADAPTER_OBJECT *v189; 
  INT64 v190[2]; 
  __int128 v191; 
  INT64 a2[2]; 
  __int128 v193; 
  INT64 v194[2]; 
  __int128 v195; 
  INT64 v196[22]; 

  KeyBody = (_CM_KEY_BODY *)rcx0;
  v189 = arg40;
  String2 = arg20;
  a4 = rdx0;
  v184 = 0i64;
  v11 = 0i64;
  v12 = 0;
  DestinationString = 0i64;
  v13 = *(__m128i *)arg28;
  a9_5 = r8_0;
  v14 = 0;
  p_ParentKcb = (__m128i *)arg28;
  v181 = v13;
  LOWORD(v176) = 0;
  *(_QWORD *)v174 = 0i64;
  *(_OWORD *)a7 = 0i64;
  DmaAdapter = 0i64;
  BugCheckParameter4 = 0i64;
  v185 = 0i64;
  v161 = 0;
  v172 = 0;
  a8 = 0;
  a9_7 = 0;
  v171[0] = 0;
  BugCheckParameter2 = 0i64;
  LODWORD(v184) = -1;
  CmpInitializeDelayDerefContext(a7);
  a8_2 = (unsigned __int8)v15;
  v166 = (_UNICODE_STRING *)v15;
  memset(v196, v15, 0xA8u);
  *(_OWORD *)(a3 + 160) = 0i64;
  *(_OWORD *)(a3 + 176) = 0i64;
  *(_OWORD *)(a3 + 192) = 0i64;
  *(_OWORD *)a2 = 0i64;
  WORD1(a2[0]) = -1;
  *(_OWORD *)v194 = 0i64;
  WORD1(v194[0]) = -1;
  *(_OWORD *)v190 = 0i64;
  WORD1(v190[0]) = -1;
  *(_QWORD *)(a3 + 208) = 0i64;
  *(_OWORD *)(a3 + 216) = 0i64;
  *(_OWORD *)(a3 + 232) = 0i64;
  *(_OWORD *)(a3 + 248) = 0i64;
  *(_OWORD *)(a3 + 264) = 0i64;
  *(_OWORD *)(a3 + 280) = 0i64;
  v193 = 0i64;
  v195 = 0i64;
  v191 = 0i64;
  if( a3 )
    *(_QWORD *)(a3 + 216) = *(_QWORD *)(a3 + 88);
  if( (r9_0 & 0x100) != 0 )
    *(_DWORD *)a3 |= 0x200u;
  v16 = *(_CM_KEY_CONTROL_BLOCK **)(a3 + 88);
  v17.0 = *($F21FB2B31E9B30A96ADF077329256E82 *)(a3 + 72);
  v182 = v16;
  *(_QWORD *)(a3 + 88) = 0i64;
  if( v17.0 )
  {
    v104 = *(_QWORD *)(rcx0 + 56);
    if( v104 && *(_QWORD *)&v17.0 != v104 )
    {
      a9 = -1072103422;
      CmpRecordParseFailure(a3, 256i64, 3222863874i64);
      v45 = 0i64;
      goto LABEL_82;
    }
    KeyName = 0i64;
  }
  else
  {
    v17.0 = *($F21FB2B31E9B30A96ADF077329256E82 *)(rcx0 + 56);
    KeyName = *(_UNICODE_STRING **)(rcx0 + 64);
  }
  *(_DWORD *)(a3 + 20) = *(unsigned __int16 *)(rcx0 + 50);
  if( *(_QWORD *)(rcx0 + 8) != *((_QWORD *)CmpRegistryRootObject + 1) && v16 )
  {
    CmpLockRegistry();
    CmpDereferenceKeyControlBlock((UINT64)v16);
    v16 = 0i64;
    v182 = 0i64;
    CmpUnlockRegistry();
  }
  v167 = 0;
  if( !v16 )
  {
LABEL_11:
    a9_4 = HIBYTE(a8);
    if( !v16 )
    {
      v18 = *(_QWORD *)(rcx0 + 8);
      v19 = CmpComputeComponentHashes(&v181, v171, (INT64)v196);
      a9 = v19;
      if( v19 < 0 )
      {
        CmpRecordParseFailure(a3, 1280i64, (unsigned int)v19);
        v45 = v166;
      }
      else
      {
        v14 = v171[0];
        v20 = CmpValidateComponents((unsigned int)v171[0], (INT64)v196);
        a9 = v20;
        if( v20 >= 0 )
          goto LABEL_14;
        CmpRecordParseFailure(a3, 1536i64, (unsigned int)v20);
        v45 = v166;
      }
LABEL_79:
      if( HIBYTE(a8) )
        CmpUnlockHashEntryByKcb((INT64)v16);
      goto LABEL_81;
    }
    v18 = (UINT64)v16;
LABEL_14:
    v21 = v14;
    *(_QWORD *)(a3 + 224) = v18;
    *(_QWORD *)(a3 + 248) = v18;
    v22 = ((*(_DWORD *)(v18 + 8) >> 21) & 0x3FF) - (unsigned __int16)v12;
    LODWORD(p_ParentKcb) = v14;
    if( (unsigned int)(v14 + v22) > 0x200 )
    {
      a9 = -1073741811;
      CmpRecordParseFailure(a3, 1792i64, 3221225485i64);
      v45 = v166;
LABEL_78:
      v16 = (_CM_KEY_CONTROL_BLOCK *)v182;
      goto LABEL_79;
    }
    if( !v167 )
    {
      if( (*(_DWORD *)a3 & 0x400) != 0 )
        CmpLockRegistryExclusive();
      else
        CmpLockRegistry();
      v21 = (unsigned int)p_ParentKcb;
      v167 = 1;
    }
    v23 = *((_DWORD *)KeyBody + 12);
    if( (v23 & 9) != 0 )
    {
      v115 = 3221225852i64;
      if( (v23 & 1) != 0 )
        v115 = 3221226533i64;
      a9 = v115;
      CmpRecordParseFailure(a3, 2048i64, v115);
      v45 = v166;
      goto LABEL_78;
    }
    if( v12 == v14 )
    {
      CmpReferenceKeyControlBlockUnsafe((volatile INT64 *)v18);
      v11 = (_CM_KEY_CONTROL_BLOCK *)v18;
      BugCheckParameter4 = (PVOID)v18;
      if( (PVOID)v18 == v182 )
      {
        v71 = a9_4;
        HIBYTE(a8) = 0;
      }
      else
      {
        CmpLockHashEntrySharedByKcb((PVOID)v18);
        v71 = 1;
      }
      HIBYTE(a9_5) = v71;
    }
    else
    {
      v24 = CmpPerformCompleteKcbCacheLookup(
              v18,
              (unsigned __int16)v12,
              v21,
              (INT64)v196,
              a3,
              (INT64 *)&BugCheckParameter4,
              (CHAR *)&a9_5 + 1,
              &v176);
      a9 = v24;
      if( v24 < 0 || v24 == 259 )
      {
        CmpRecordParseFailure(a3, 2432i64, (unsigned int)v24);
        v11 = (_CM_KEY_CONTROL_BLOCK *)BugCheckParameter4;
        goto LABEL_107;
      }
      v25 = v176;
      v11 = (_CM_KEY_CONTROL_BLOCK *)BugCheckParameter4;
      v12 += v176;
      *(_QWORD *)(a3 + 232) = BugCheckParameter4;
      *(_BYTE *)(a3 + 256) = v25;
      *(_QWORD *)(a3 + 248) = v11;
    }
    if( v12 == v14 && (*(_DWORD *)a3 & 1) == 0 )
    {
      CmpUnlockHashEntryByKcb((INT64)v11);
      HIBYTE(a9_5) = 0;
    }
    CmpLockKcbShared(v11);
    if( v12 < v14 )
    {
      DestinationString.Buffer = *(wchar_t **)(CmpGetComponentNameAtIndex((INT64)v196, (unsigned int)v12) + 8);
      DestinationString.Length = v181.m128i_i16[0] - 2 * (((__int64)DestinationString.Buffer - v181.m128i_i64[1]) >> 1);
      DestinationString.MaximumLength = DestinationString.Length;
    }
    else
    {
      RtlInitUnicodeString(&DestinationString, 0i64);
    }
    a9 = CmpVEExecuteParseLogic((INT64)v11, (__m128i *)&DestinationString, a3, (__m128i *)String2, a9_5, (INT64)a4 + 32);
    CmpUnlockKcb(v11);
    if( a9 == -1073741199 )
    {
      if( CmpOKToFollowLink(*(CMHIVE **)(a3 + 64), (CMHIVE *)v11->KeyHash.KeyHive) )
      {
        v26 = KeyName;
        if( *(_QWORD *)&v17.0 || KeyName )
        {
          if( v11->KeyHash.KeyHive == *(_HHIVE **)&CmpMasterHive )
          {
            BYTE2(a8_2) = 1;
            v17.0 = 0i64;
            v26 = 0i64;
          }
          else if( (*(_QWORD *)&v17.0 || KeyName) && v11->LayerHeight )
          {
            CmpLogUnsupportedOperation(8);
            if( !PsIsCurrentThreadInServerSilo() )
            {
              a9 = -1072103419;
              CmpRecordParseFailure(a3, 2816i64, 3222863877i64);
              goto LABEL_107;
            }
            v17.0 = 0i64;
            v26 = 0i64;
          }
        }
        if( !CmpTransSilentIgnore() && (*(_QWORD *)&v17.0 || v26) )
        {
          a9 = CmpTransSearchAddTransFromHive(
                 (_CMHIVE *)v11->KeyHash.KeyHive,
                 v17,
                 (_GUID *)v26,
                 0i64,
                 (_CM_TRANS **)v174);
          if( (a9 & 0x80000000) != 0 )
          {
            if( HIBYTE(a9_5) )
            {
              CmpUnlockHashEntryByKcb((INT64)v11);
              HIBYTE(a9_5) = 0;
            }
            CmpUnlockRegistry();
            a9 = CmpTransSearchAddTransFromHive(
                   (_CMHIVE *)v11->KeyHash.KeyHive,
                   v17,
                   (_GUID *)v26,
                   1ui64,
                   (_CM_TRANS **)v174);
            CmpLockRegistry();
            v87 = a9;
            v167 = 1;
            if( (a9 & 0x80000000) == 0 )
            {
              v87 = 3221226029i64;
              a9 = -1073741267;
            }
            CmpRecordParseFailure(a3, 3072i64, v87);
            v45 = v166;
            goto LABEL_76;
          }
        }
        started = CmpStartKcbStack((INT64)a2, v11->LayerHeight);
        a9 = started;
        if( started < 0 )
        {
          CmpRecordParseFailure(a3, 3328i64, (unsigned int)started);
        }
        else
        {
          v28 = CmpStartKcbStack((INT64)v194, v11->LayerHeight);
          a9 = v28;
          if( v28 >= 0 )
          {
            v29 = a2;
            v30 = v194;
            CmpPopulateKcbStack((__int64)a2, (__int64)v11);
            if( v12 < v14 )
            {
              while( 1 )
              {
                CmpLockKcbStackShared((INT64)v29);
                v50 = *(_QWORD *)v174;
                if( CmpIsKeyStackDeleted((INT64)v29, *(INT64 *)v174) )
                {
                  if( byte_140C5082C
                    && (v11 = (_CM_KEY_CONTROL_BLOCK *)BugCheckParameter4,
                        (struct _KTHREAD *)qword_140C50830 != KeGetCurrentThread())
                    && *((_QWORD *)BugCheckParameter4 + 4) == *(_QWORD *)&CmpMasterHive
                    && (*((_DWORD *)BugCheckParameter4 + 2) & 0x7FE00000) == 6291456
                    && v12 > 0
                    && (ComponentNameAtIndex = (_UNICODE_STRING *)CmpGetComponentNameAtIndex(
                                                                    (INT64)v196,
                                                                    (unsigned int)(v12 - 1)),
                        CmpWaitForHiveMount(ComponentNameAtIndex, v128)) )
                  {
                    *(_DWORD *)a3 |= 0x100u;
                    v105 = 3840i64;
                    a9 = 259;
                    v106 = 259i64;
                  }
                  else
                  {
                    v105 = 4096i64;
                    a9 = -1073741772;
                    v106 = 3221225524i64;
                  }
                  CmpRecordParseFailure(a3, v105, v106);
                  v45 = v166;
                  v32 = KeyBody;
                  v30 = (INT64 *)v166;
                  goto LABEL_68;
                }
                if( CmpIsKeyStackSymlink((INT64)v29) )
                  break;
                CmpUnlockKcbStack((INT64)v29);
                CmpGetComponentNameAtIndex((INT64)v196, (unsigned int)v12);
                ComponentHashAtIndex = CmpGetComponentHashAtIndex((INT64)v196, (unsigned int)v12);
                v53 = (*(_DWORD *)a3 & 1) != 0 && v12 == (_DWORD)p_ParentKcb - 1;
                LODWORD(v160) = ComponentHashAtIndex + 37 * v11->KeyHash.ConvKey.Hash;
                LODWORD(ObjectCreated) = ComponentHashAtIndex;
                v54 = CmpWalkOneLevel(
                        (INT64)v11,
                        (INT64)v29,
                        &v185,
                        (INT64)v30,
                        (_BOOL *)&a8_2 + 1,
                        v52,
                        ObjectCreated,
                        (UINT64)v160,
                        *(INT64 *)v174,
                        v53,
                        a3);
                a9 = v54;
                if( v54 == -1073741772 )
                {
                  if( !byte_140C5082C )
                    goto LABEL_106;
                  v11 = (_CM_KEY_CONTROL_BLOCK *)BugCheckParameter4;
                  if( (struct _KTHREAD *)qword_140C50830 == KeGetCurrentThread()
                    || *((_QWORD *)BugCheckParameter4 + 4) != *(_QWORD *)&CmpMasterHive )
                  {
                    v54 = a9;
LABEL_106:
                    CmpRecordParseFailure(a3, 5504i64, (unsigned int)v54);
                    goto LABEL_107;
                  }
                  if( (*((_DWORD *)BugCheckParameter4 + 2) & 0x7FE00000) == 6291456 && v12 > 0 )
                  {
                    v125 = (_UNICODE_STRING *)CmpGetComponentNameAtIndex((INT64)v196, (unsigned int)(v12 - 1));
                    if( CmpWaitForHiveMount(v125, v126) )
                    {
                      *(_DWORD *)a3 |= 0x100u;
                      a9 = 259;
                      CmpRecordParseFailure(a3, 5120i64, 259i64);
                      goto LABEL_107;
                    }
                  }
                  if( (v11->_bf_8 & 0x7FE00000) == 0x400000 )
                  {
                    v116 = (_UNICODE_STRING *)CmpGetComponentNameAtIndex((INT64)v196, (unsigned int)v12);
                    if( CmpWaitForHiveMount(v116, v117) )
                    {
                      *(_DWORD *)a3 |= 0x100u;
                      a9 = 259;
                      CmpRecordParseFailure(a3, 5376i64, 259i64);
                      v45 = v166;
                      goto LABEL_76;
                    }
                  }
                  v14 = v171[0];
                  v54 = a9;
                }
                if( v54 < 0 )
                  goto LABEL_106;
                v69 = (_CM_KEY_CONTROL_BLOCK *)v185;
                ++*(_BYTE *)(a3 + 257);
                *(_QWORD *)(a3 + 240) = v69;
                *(_QWORD *)(a3 + 248) = v69;
                CmpDereferenceKeyControlBlockUnsafe((volatile INT64 *)v11);
                HIBYTE(a9_5) = BYTE1(a8_2);
                ++v12;
                BugCheckParameter4 = v69;
                v70 = v29;
                v185 = 0i64;
                v29 = v30;
                BYTE1(a8_2) = 0;
                v30 = v70;
                v11 = v69;
                if( v12 >= v14 )
                  goto LABEL_39;
              }
              SymbolicLinkTarget = CmpGetSymbolicLinkTarget(
                                     (INT64)v29,
                                     (INT64)v196,
                                     v12,
                                     v14,
                                     v50,
                                     a3,
                                     (INT64)a7,
                                     (INT64)String2,
                                     a3 + 88);
              a9 = SymbolicLinkTarget;
              if( SymbolicLinkTarget < 0 )
              {
                CmpRecordParseFailure(a3, 4608i64, (unsigned int)SymbolicLinkTarget);
                goto LABEL_107;
              }
              *(_DWORD *)a3 &= ~8u;
              if( !*(_QWORD *)(a3 + 64) )
              {
                KeyHive = v11->KeyHash.KeyHive;
                if( (KeyHive[2].Storage[1].FreeDisplay[6].RealVectorSize & 1) != 0 )
                  *(_QWORD *)(a3 + 64) = KeyHive;
              }
              a9 = 260;
              CmpRecordParseFailure(a3, 4864i64, 260i64);
              v45 = v166;
              goto LABEL_76;
            }
LABEL_39:
            ParentKcb = (__int64)v11->ParentKcb;
            a1 = (INT64)v30;
            p_ParentKcb = (__m128i *)&v11->ParentKcb;
            if( ParentKcb )
            {
              CmpPopulateKcbStack((__int64)v30, ParentKcb);
              ParentKcb = (__int64)v11->ParentKcb;
            }
            else
            {
              v30 = 0i64;
              a1 = 0i64;
            }
            v32 = KeyBody;
            KeyControlBlock = KeyBody->KeyControlBlock;
            if( (_CM_KEY_CONTROL_BLOCK *)ParentKcb != KeyControlBlock && v11 != KeyControlBlock )
            {
              CmpLockKcbShared(KeyControlBlock);
              a9_7 = 1;
            }
            v34 = v30 == 0i64;
            if( v30 )
            {
              CmpLockKcbStackShared((INT64)v30);
              v34 = v30 == 0i64;
            }
            v35 = !v34;
            a9_4 = !v34;
            v161 = !v34;
            CmpLockKcbStackShared((INT64)v29);
            if( CmpIsKeyDeletedForKeyBody(v32, 0i64) )
            {
              v129 = -1073740763;
              if( (*((_BYTE *)v32 + 48) & 1) == 0 )
                v129 = -1073741444;
              a9 = v129;
              CmpRecordParseFailure(a3, 5888i64, v129);
              v45 = v166;
              v161 = v35;
              goto LABEL_68;
            }
            v36 = v12 - 1;
            p_bf_b8 = &v11->_bf_b8;
            if( (v11->_bf_b8 & 0x20000) != 0 )
            {
              a9 = -1073741772;
              CmpRecordParseFailure(a3, 6144i64, 3221225524i64);
              v161 = v35;
              goto LABEL_276;
            }
            if( !CmRmIsKCBVisible((__int64)v11, *(__int64 *)v174) )
            {
              a9 = -1073741772;
              CmpRecordParseFailure(a3, 6400i64, 3221225524i64);
              v45 = v166;
              v161 = v35;
              goto LABEL_67;
            }
            if( (*(_DWORD *)a3 & 2) == 0 )
            {
              if( (*(_DWORD *)a3 & 0x20) == 0 )
              {
                if( !CmpIsKeyStackDeleted((INT64)v29, *(INT64 *)v174) )
                {
                  if( CmpIsKeyStackSymlink((INT64)v29) && (*(_DWORD *)a3 & 0x200) == 0 )
                  {
                    if( (*(_DWORD *)(a3 + 24) & 2) == 0 )
                    {
                      v30 = (INT64 *)a1;
                      v161 = v35;
                      if( a1 )
                      {
                        CmpUnlockKcbStack(a1);
                        v161 = 0;
                      }
                      if( a9_7 )
                      {
                        CmpUnlockKcb(v32->KeyControlBlock);
                        a9_7 = 0;
                      }
                      if( HIBYTE(a9_5) )
                      {
                        CmpUnlockHashEntryByKcb((INT64)v11);
                        HIBYTE(a9_5) = 0;
                      }
                      v72 = CmpGetSymbolicLinkTarget(
                              (INT64)v29,
                              (INT64)v196,
                              0,
                              0,
                              *(INT64 *)v174,
                              a3,
                              (INT64)a7,
                              (INT64)String2,
                              a3 + 88);
                      a9 = v72;
                      if( v72 < 0 )
                      {
                        CmpRecordParseFailure(a3, 14336i64, (unsigned int)v72);
                        v45 = v166;
                      }
                      else
                      {
                        *(_DWORD *)a3 &= ~8u;
                        if( !*(_QWORD *)(a3 + 64) )
                        {
                          v73 = v11->KeyHash.KeyHive;
                          if( (v73[2].Storage[1].FreeDisplay[6].RealVectorSize & 1) != 0 )
                            *(_QWORD *)(a3 + 64) = v73;
                        }
                        a9 = 260;
                        CmpRecordParseFailure(a3, 14592i64, 260i64);
                        v45 = v166;
                      }
                      goto LABEL_69;
                    }
                    a9 = -1073741771;
                    v113 = 14080i64;
                    v114 = 3221225525i64;
                    goto LABEL_255;
                  }
                  if( !BYTE2(a8_2) )
                  {
                    if( (*p_bf_b8 & 0x20000) != 0 )
                    {
                      v113 = 15104i64;
                      a9 = -1073741772;
                      v114 = 3221225524i64;
                      goto LABEL_255;
                    }
                    if( (*(_DWORD *)(a3 + 24) & 2) != 0 )
                    {
                      a9 = -1073741771;
                      v113 = 15360i64;
                      v114 = 3221225525i64;
                      goto LABEL_255;
                    }
                    v38 = String2;
                    v30 = (INT64 *)a1;
                    v39 = CmpDoWritethroughReparse((INT64)v11, (INT64)v29, a1, 0, 0i64, a3, String2);
                    a9 = v39;
                    if( v39 == -1073741199 )
                    {
                      v40 = CmpVEExecuteOpenLogic((UINT64)v11, a3, 0, (INT64)v38, a9_5);
                      a9 = v40;
                      if( v40 == -1073741199 )
                      {
                        v41 = *(_CM_TRANS **)v174;
                        a5 = a9_5;
                        v43 = CmpCreateKeyBody(
                                (volatile INT64 *)v11,
                                a9_5,
                                a3,
                                *(INT64 *)v174,
                                0,
                                (INT64)v29,
                                (INT64)&DmaAdapter,
                                (INT64)&a8);
                        a9 = v43;
                        v161 = v35;
                        if( v43 >= 0 )
                        {
LABEL_59:
                          v44 = a4;
LABEL_60:
                          if( *(_DWORD *)(a3 + 32) == 1
                            || (unsigned __int8)CmpCheckOpenAccessOnKeyBody(
                                                  DmaAdapter,
                                                  (INT64)v29,
                                                  (_DWORD *)a3,
                                                  v44,
                                                  a5,
                                                  (*(_DWORD *)(a3 + 24) & 4) != 0,
                                                  v41,
                                                  (INT64)&a8_2,
                                                  (INT64)&a9) )
                          {
                            *v189 = DmaAdapter;
                            DmaAdapter = 0i64;
                            if( !*(_DWORD *)(a3 + 32) )
                              *(_DWORD *)(a3 + 32) = 2;
                            v45 = 0i64;
                            if( (_BYTE)a8 )
                              a9 = 1073741846;
                            else
                              a9 = 0;
                          }
                          else
                          {
                            if( (_BYTE)a8_2 )
                            {
                              if( (*(_DWORD *)(a3 + 160) & 1) == 0 )
                              {
                                CmpAttachToRegistryProcess((KAPC_STATE *)(a3 + 168));
                                *(_DWORD *)(a3 + 160) |= 1u;
                              }
                              v45 = CmpConstructName(v11);
                            }
                            else
                            {
                              v45 = v166;
                            }
                            CmpRecordParseFailure(a3, 15584i64, a9);
                          }
                          HIBYTE(a8_2) = 0;
                          if( !v172 )
                            goto LABEL_67;
                          goto LABEL_227;
                        }
                        v113 = 15552i64;
                        if( v43 == -1073741444 )
                          v43 = -1073741772;
                        a9 = v43;
                        v114 = (unsigned int)v43;
LABEL_255:
                        CmpRecordParseFailure(a3, v113, v114);
                        v45 = v166;
                        v161 = v35;
                        goto LABEL_67;
                      }
                      CmpRecordParseFailure(a3, 15488i64, v40);
                      v161 = v35;
                    }
                    else
                    {
                      CmpRecordParseFailure(a3, 15424i64, v39);
                      v161 = v35;
                    }
LABEL_241:
                    v45 = v166;
                    goto LABEL_68;
                  }
                  v113 = 14848i64;
LABEL_254:
                  a9 = -1073741811;
                  v114 = 3221225485i64;
                  goto LABEL_255;
                }
                if( BYTE2(a8_2) )
                {
                  v113 = 9728i64;
                  goto LABEL_254;
                }
                if( CmpIsKeyStackDeleted(a1, *(INT64 *)v174)
                  || !CmRmIsKCBVisible(p_ParentKcb->m128i_i64[0], *(__int64 *)v174) )
                {
                  v113 = 9984i64;
                  a9 = -1073741772;
                  v114 = 3221225524i64;
                  goto LABEL_255;
                }
                if( (*(_DWORD *)(p_ParentKcb->m128i_i64[0] + 184) & 0x20000) != 0 )
                {
                  a9 = -1073741772;
                  CmpRecordParseFailure(a3, 10240i64, 3221225524i64);
                  v161 = v35;
                }
                else
                {
                  if( (*(_DWORD *)a3 & 1) != 0 )
                  {
                    KeyName = (_UNICODE_STRING *)&v11->KeyHive;
                    if( v11->KeyHash.KeyHive == *(_HHIVE **)&CmpMasterHive )
                    {
                      if( CmpNoMasterCreates )
                      {
                        v11 = (_CM_KEY_CONTROL_BLOCK *)BugCheckParameter4;
                        if( (struct _KTHREAD *)qword_140C50830 != KeGetCurrentThread() )
                        {
                          if( !byte_140C5082C
                            || (*((_DWORD *)BugCheckParameter4 + 2) & 0x7FE00000) != 6291456
                            || (v134 = (_UNICODE_STRING *)CmpGetComponentNameAtIndex((INT64)v196, (unsigned int)v36),
                                !CmpWaitForHiveMount(v134, v135)) )
                          {
                            v113 = 11264i64;
                            goto LABEL_254;
                          }
                          v133 = 11008i64;
                          goto LABEL_343;
                        }
                      }
                    }
                    BugCheckParameter2 = (PVOID)CmpGetComponentNameAtIndex((INT64)v196, (unsigned int)v36);
                    v74 = CmpDoWritethroughReparse(
                            (INT64)v11,
                            (INT64)v29,
                            a1,
                            1,
                            (_UNICODE_STRING *)BugCheckParameter2,
                            a3,
                            String2);
                    a9 = v74;
                    if( v74 != -1073741199 )
                    {
                      v114 = v74;
                      v113 = 11392i64;
                      goto LABEL_255;
                    }
                    if( (*(_DWORD *)(a3 + 160) & 1) == 0 )
                    {
                      CmpAttachToRegistryProcess((KAPC_STATE *)(a3 + 168));
                      *(_DWORD *)(a3 + 160) |= 1u;
                    }
                    v75 = (__int64 *)p_ParentKcb;
                    if( *(_DWORD *)(p_ParentKcb->m128i_i64[0] + 40) != -1 )
                    {
                      CmpUnlockKcbStack((INT64)v29);
                      CmpUnlockKcbStack(a1);
                      CmpLockKcbStackTopExclusiveRestShared(a1);
                      goto LABEL_173;
                    }
                    if( CmpCheckCreateAccessOnKcbStack(
                           16 * (*(_DWORD *)(a3 + 24) & 2u),
                           a1,
                           a3,
                           (INT64)a4,
                           a9_5,
                           16 * (*(_DWORD *)(a3 + 24) & 2),
                           (*(_DWORD *)(a3 + 24) & 4) != 0,
                           *(__int64 *)v174,
                           (int *)&a9) )
                    {
                      CmpUnlockKcbStack((INT64)v29);
                      CmpUnlockKcbStack(a1);
                      if( a9_7 )
                      {
                        CmpUnlockKcb(v32->KeyControlBlock);
                        a9_7 = 0;
                      }
                      v144 = CmpPromoteKey(a1, 0, 1);
                      a9 = v144;
                      if( v144 < 0 )
                      {
                        if( v144 == -1073741444 )
                          v144 = -1073741772;
                        a9 = v144;
                        CmpRecordParseFailure(a3, 11776i64, (unsigned int)v144);
                        v45 = v166;
                        v30 = (INT64 *)a1;
                        goto LABEL_70;
                      }
LABEL_173:
                      CmpLockKcbStackTopExclusiveRestShared((INT64)v29);
                      v76 = *(_QWORD *)v174;
                      if( !CmRmIsKCBVisible((__int64)v11, *(__int64 *)v174) )
                      {
                        a9 = -1073741772;
                        CmpRecordParseFailure(a3, 12032i64, 3221225524i64);
                        v161 = 1;
                        goto LABEL_192;
                      }
                      if( CmpIsKeyStackDeleted((INT64)v29, v76) )
                      {
                        v41 = (_CM_TRANS *)v76;
                        if( CmpIsKeyStackDeleted(a1, v76) || !CmRmIsKCBVisible(*v75, v76) )
                        {
                          a9 = -1073741772;
                          CmpRecordParseFailure(a3, 12288i64, 3221225524i64);
                          v161 = 1;
                          goto LABEL_192;
                        }
                        if( (*(_DWORD *)(*v75 + 184) & 0x20000) != 0 )
                        {
                          a9 = -1073741772;
                          CmpRecordParseFailure(a3, 12544i64, 3221225524i64);
                          v161 = 1;
                          goto LABEL_192;
                        }
                        ObjectCreatedd = v76;
                        v77 = (_UNICODE_STRING *)BugCheckParameter2;
                        LODWORD(a6) = 16 * (*(_DWORD *)(a3 + 24) & 2);
                        Logic = CmpVEExecuteCreateLogic(
                                  *v75,
                                  (INT64)v11,
                                  (__m128i *)BugCheckParameter2,
                                  (INT64)a4,
                                  a9_5,
                                  a6,
                                  ObjectCreatedd,
                                  a3,
                                  (INT64)String2);
                        a9 = Logic;
                        if( Logic == -1073741739 )
                        {
                          *(_DWORD *)a3 |= 0x400u;
                          a9 = -1073741267;
                          CmpRecordParseFailure(a3, 12672i64, 3221226029i64);
                          v161 = 1;
                          goto LABEL_192;
                        }
                        if( Logic != -1073741199 )
                        {
                          CmpRecordParseFailure(a3, 12736i64, Logic);
                          v161 = 1;
                          goto LABEL_192;
                        }
                        if( CmpCheckCreateAccessOnKcbStack(
                               16 * (*(_DWORD *)(a3 + 24) & 2u),
                               a1,
                               a3,
                               (INT64)a4,
                               a9_5,
                               16 * (*(_DWORD *)(a3 + 24) & 2),
                               (*(_DWORD *)(a3 + 24) & 4) != 0,
                               (__int64)v41,
                               (int *)&a9) )
                        {
                          a5 = a9_5;
                          v79 = CmpCreateKeyBody(
                                  (volatile INT64 *)v11,
                                  a9_5,
                                  a3,
                                  (INT64)v41,
                                  1,
                                  (INT64)v29,
                                  (INT64)&DmaAdapter,
                                  (INT64)&a8);
                          a9 = v79;
                          if( v79 < 0 )
                          {
                            CmpRecordParseFailure(a3, 12928i64, (unsigned int)v79);
                            v161 = 1;
                            goto LABEL_192;
                          }
                          v80 = v77;
                          v44 = a4;
                          LODWORD(ObjectCreateda) = 0;
                          Child = CmpCreateChild(
                                    a1,
                                    (INT64)v29,
                                    (INT64)a4,
                                    v80,
                                    a3,
                                    8 * (*(_WORD *)(a3 + 24) & 2u),
                                    ObjectCreateda,
                                    0,
                                    (INT64)v41);
                          a9 = Child;
                          if( Child < 0 )
                          {
                            CmpRecordParseFailure(a3, 12992i64, (unsigned int)Child);
                            v45 = v166;
                            v161 = 1;
                            goto LABEL_67;
                          }
                          *(_DWORD *)(a3 + 32) = 1;
LABEL_184:
                          v161 = 1;
                          goto LABEL_60;
                        }
                        if( KeGetCurrentThread()->PreviousMode == 1 )
                        {
                          CurrentThreadProcess = (_EPROCESS *)PsGetCurrentThreadProcess();
                          LODWORD(v108) = PsGetProcessServerSilo((INT64)CurrentThreadProcess);
                          ServerSiloServiceSessionId = PsGetServerSiloServiceSessionId(v108);
                          SessionId = MmGetSessionIdEx(CurrentThreadProcess);
                          v30 = (INT64 *)a1;
                          if( SessionId != ServerSiloServiceSessionId && CmpCheckKeyOwnerForPca(a1, v111, v112) )
                          {
                            v145 = (_CM_KEY_CONTROL_BLOCK *)*v75;
                            LOBYTE(a8_2) = 1;
                            v45 = CmpConstructName(v145);
                            goto LABEL_239;
                          }
                        }
                        else
                        {
                          v30 = (INT64 *)a1;
                        }
                        v45 = v166;
LABEL_239:
                        CmpRecordParseFailure(a3, 12800i64, a9);
                        v11 = (_CM_KEY_CONTROL_BLOCK *)BugCheckParameter4;
                        v161 = 1;
                        goto LABEL_68;
                      }
                      if( !CmpIsKeyStackSymlink((INT64)v29) || (*(_DWORD *)a3 & 0x200) != 0 )
                      {
                        if( (*p_bf_b8 & 0x20000) != 0 )
                        {
                          a9 = -1073741772;
                          CmpRecordParseFailure(a3, 13568i64, 3221225524i64);
                          v161 = 1;
                          goto LABEL_192;
                        }
                        if( (*(_DWORD *)(a3 + 24) & 2) == 0 )
                        {
                          v149 = String2;
                          v30 = (INT64 *)a1;
                          v150 = CmpDoWritethroughReparse((INT64)v11, (INT64)v29, a1, 0, 0i64, a3, String2);
                          a9 = v150;
                          if( v150 == -1073741199 )
                          {
                            a5 = a9_5;
                            LOBYTE(v151) = 1;
                            v150 = CmpVEExecuteOpenLogic((UINT64)v11, a3, v151, (INT64)v149, a9_5);
                            a9 = v150;
                            if( v150 == -1073741199 )
                            {
                              v41 = *(_CM_TRANS **)v174;
                              v153 = CmpCreateKeyBody(
                                       (volatile INT64 *)v11,
                                       a5,
                                       a3,
                                       *(INT64 *)v174,
                                       1,
                                       (INT64)v29,
                                       (INT64)&DmaAdapter,
                                       (INT64)&a8);
                              a9 = v153;
                              if( v153 >= 0 )
                              {
                                v44 = a4;
                                goto LABEL_184;
                              }
                              v147 = (unsigned int)v153;
                              v146 = 14016i64;
LABEL_378:
                              CmpRecordParseFailure(a3, v146, v147);
                              v161 = 1;
                              goto LABEL_192;
                            }
                            v152 = 13952i64;
                          }
                          else
                          {
                            v152 = 13888i64;
                          }
                          CmpRecordParseFailure(a3, v152, v150);
                          v161 = 1;
                          goto LABEL_241;
                        }
                        v146 = 13824i64;
                      }
                      else
                      {
                        if( (*(_DWORD *)(a3 + 24) & 2) == 0 )
                        {
                          CmpUnlockKcbStack(a1);
                          if( a9_7 )
                          {
                            CmpUnlockKcb(v32->KeyControlBlock);
                            a9_7 = 0;
                          }
                          if( HIBYTE(a9_5) )
                          {
                            CmpUnlockHashEntryByKcb((INT64)v11);
                            HIBYTE(a9_5) = 0;
                          }
                          v148 = CmpGetSymbolicLinkTarget(
                                   (INT64)v29,
                                   (INT64)v196,
                                   0,
                                   0,
                                   v76,
                                   a3,
                                   (INT64)a7,
                                   (INT64)String2,
                                   a3 + 88);
                          a9 = v148;
                          if( v148 >= 0 )
                          {
                            *(_DWORD *)a3 &= ~8u;
                            if( !*(_QWORD *)(a3 + 64) && (*(_DWORD *)(*(_QWORD *)&KeyName->Length + 4152i64) & 1) != 0 )
                              *(_QWORD *)(a3 + 64) = *(_QWORD *)&KeyName->Length;
                            a9 = 260;
                            CmpRecordParseFailure(a3, 13440i64, 260i64);
                            v45 = v166;
                          }
                          else
                          {
                            CmpRecordParseFailure(a3, 13312i64, (unsigned int)v148);
                            v45 = v166;
                          }
                          goto LABEL_72;
                        }
                        v146 = 13056i64;
                      }
                      a9 = -1073741771;
                      v147 = 3221225525i64;
                      goto LABEL_378;
                    }
                    if( KeGetCurrentThread()->PreviousMode == 1 )
                    {
                      v136 = (_EPROCESS *)PsGetCurrentThreadProcess();
                      LODWORD(v137) = PsGetProcessServerSilo((INT64)v136);
                      v138 = PsGetServerSiloServiceSessionId(v137);
                      v139 = MmGetSessionIdEx(v136);
                      v30 = (INT64 *)a1;
                      if( v139 != v138 && CmpCheckKeyOwnerForPca(a1, v140, v141) )
                      {
                        v142 = (_CM_KEY_CONTROL_BLOCK *)*v75;
                        LOBYTE(a8_2) = 1;
                        v143 = CmpConstructName(v142);
                        v35 = a9_4;
                        v45 = v143;
LABEL_356:
                        CmpRecordParseFailure(a3, 11520i64, a9);
                        v11 = (_CM_KEY_CONTROL_BLOCK *)BugCheckParameter4;
                        v161 = v35;
                        goto LABEL_68;
                      }
                      v35 = a9_4;
                    }
                    else
                    {
                      v30 = (INT64 *)a1;
                    }
                    v45 = v166;
                    goto LABEL_356;
                  }
                  if( byte_140C5082C )
                  {
                    v11 = (_CM_KEY_CONTROL_BLOCK *)BugCheckParameter4;
                    if( (struct _KTHREAD *)qword_140C50830 != KeGetCurrentThread()
                      && *((_QWORD *)BugCheckParameter4 + 4) == *(_QWORD *)&CmpMasterHive
                      && (*((_DWORD *)BugCheckParameter4 + 2) & 0x7FE00000) == 6291456 )
                    {
                      v131 = (_UNICODE_STRING *)CmpGetComponentNameAtIndex((INT64)v196, (unsigned int)v36);
                      if( CmpWaitForHiveMount(v131, v132) )
                      {
                        v133 = 10496i64;
LABEL_343:
                        *(_DWORD *)a3 |= 0x100u;
                        a9 = 259;
                        CmpRecordParseFailure(a3, v133, 259i64);
                        v161 = v35;
                        goto LABEL_192;
                      }
                    }
                  }
                  a9 = -1073741772;
                  CmpRecordParseFailure(a3, 10752i64, 3221225524i64);
                  v161 = v35;
                }
LABEL_192:
                v45 = v166;
LABEL_67:
                v30 = (INT64 *)a1;
LABEL_68:
                CmpUnlockKcbStack((INT64)v29);
LABEL_69:
                v35 = v161;
LABEL_70:
                if( v35 )
                  CmpUnlockKcbStack((INT64)v30);
LABEL_72:
                if( a9_7 )
                  CmpUnlockKcb(v32->KeyControlBlock);
                if( HIBYTE(a8_2) )
                  CmpUnlockHashEntry(*(_QWORD *)(a3 + 48), 0i64);
                goto LABEL_76;
              }
              CmpUnlockKcbStack((INT64)v29);
              CmpUnlockKcbStack(a1);
              CmpLockKcbStackTopExclusiveRestShared(a1);
              CmpLockKcbStackTopExclusiveRestShared((INT64)v29);
              v41 = *(_CM_TRANS **)v174;
              if( CmpIsKeyStackDeleted(a1, *(INT64 *)v174) )
              {
                a9 = -1073741772;
                CmpRecordParseFailure(a3, 8960i64, 3221225524i64);
                v161 = v35;
                goto LABEL_192;
              }
              if( (*(_DWORD *)(p_ParentKcb->m128i_i64[0] + 184) & 0x20000) != 0 )
              {
                a9 = -1073741772;
                CmpRecordParseFailure(a3, 9216i64, 3221225524i64);
                v161 = v35;
                goto LABEL_192;
              }
              v118 = CmpGetComponentNameAtIndex((INT64)v196, (unsigned int)v36);
              v119 = *(_DWORD *)(a3 + 24);
              v120 = (_UNICODE_STRING *)v118;
              if( (v119 & 2) != 0 )
                v121 = 32;
              else
                v121 = 0;
              if( !CmpCheckCreateAccessOnKcbStack(
                      (__int64)&a9,
                      a1,
                      a3,
                      (INT64)a4,
                      a9_5,
                      v121,
                      (v119 & 4) != 0,
                      (__int64)v41,
                      (int *)&a9) )
              {
                CmpRecordParseFailure(a3, 9472i64, a9);
                v161 = v35;
                goto LABEL_192;
              }
              CmpCleanUpKcbCachedSymlink((INT64)v11, (INT64)a7);
              HIWORD(v11->_bf_b8) |= 0x40u;
              v122 = a9_5;
              v11->ValueList.List = -1;
              v11->ValueList.Count = *(_DWORD *)(a3 + 56);
              a9 = CmpCreateKeyBody(
                     (volatile INT64 *)v11,
                     v122,
                     a3,
                     (INT64)v41,
                     1,
                     (INT64)v29,
                     (INT64)&DmaAdapter,
                     (INT64)&a8);
              v161 = v35;
              if( (a9 & 0x80000000) == 0 )
              {
                if( !CmpIsKeyStackDeleted((INT64)v29, (INT64)v41) )
                {
LABEL_274:
                  a5 = a9_5;
                  v161 = v35;
                  goto LABEL_59;
                }
                LODWORD(ObjectCreatedc) = 0;
                a9 = CmpCreateChild(a1, (INT64)v29, (INT64)a4, v120, a3, 64, ObjectCreatedc, 0, (INT64)v41);
                v161 = v35;
                if( (a9 & 0x80000000) == 0 )
                {
                  *(_DWORD *)(a3 + 32) = 1;
                  goto LABEL_274;
                }
              }
LABEL_276:
              v45 = v166;
              goto LABEL_67;
            }
            CmpUnlockKcbStack((INT64)v29);
            v88 = a1;
            CmpUnlockKcbStack(a1);
            if( a9_7 )
              CmpUnlockKcb(v32->KeyControlBlock);
            HIBYTE(a8_2) = CmpTryToLockHashEntryExclusive(*(_QWORD *)(a3 + 48), 0i64);
            if( a9_7 )
              CmpLockKcbShared(v32->KeyControlBlock);
            CmpLockKcbStackTopExclusiveRestShared(v88);
            CmpLockKcbStackTopExclusiveRestShared((INT64)v29);
            KeyName = (_UNICODE_STRING *)CmpGetComponentNameAtIndex((INT64)v196, (unsigned int)v36);
            v90.Hash = CmpGetComponentHashAtIndex((INT64)v196, v89);
            if( CmpIsKeyDeletedForKeyBody(v32, 0i64) )
            {
              HiveRootCell = -1073740763;
              v130 = 6656i64;
              if( (*((_BYTE *)v32 + 48) & 1) == 0 )
                HiveRootCell = -1073741444;
            }
            else
            {
              v91 = *(_QWORD *)v174;
              if( CmpIsKeyStackDeleted(a1, *(INT64 *)v174) )
              {
                HiveRootCell = -1073741772;
                v130 = 6912i64;
              }
              else
              {
                if( !CmpIsKeyStackDeleted((INT64)v29, v91) )
                {
                  a9 = -1073741790;
                  v130 = 7168i64;
                  v96 = 3221225506i64;
                  goto LABEL_324;
                }
                if( *(_QWORD *)(p_ParentKcb->m128i_i64[0] + 32) != *(_QWORD *)&CmpMasterHive )
                {
                  a9 = -1073741790;
                  v130 = 7424i64;
                  v96 = 3221225506i64;
                  goto LABEL_324;
                }
                if( (*(_DWORD *)(p_ParentKcb->m128i_i64[0] + 184) & 0x20000) == 0 )
                {
                  if( (*(_DWORD *)(a3 + 160) & 1) == 0 )
                  {
                    CmpAttachToRegistryProcess((KAPC_STATE *)(a3 + 168));
                    *(_DWORD *)(a3 + 160) |= 1u;
                  }
                  v92 = *(unsigned int *)(a3 + 40);
                  v93 = (unsigned int *)(a3 + 40);
                  v94 = *(CMHIVE **)(a3 + 48);
                  if( (_DWORD)v92 == -1 )
                  {
                    HiveRootCell = CmpCreateHiveRootCell((UINT64)v94, (INT64)a4, KeyName, a3, (UINT64 *)(a3 + 40));
                    a9 = HiveRootCell;
                    if( HiveRootCell < 0 )
                    {
                      v130 = 7808i64;
                      goto LABEL_322;
                    }
                  }
                  else
                  {
                    HiveRootCell = CmpUpdateHiveRootCellFlags(v94, v92);
                    a9 = HiveRootCell;
                    if( HiveRootCell < 0 )
                    {
                      v130 = 7936i64;
                      goto LABEL_322;
                    }
                  }
                  HIWORD(v11->_bf_b8) |= 2u;
                  a9 = CmpCreateKeyControlBlock(
                         *(_CMHIVE **)(a3 + 48),
                         0xFFFFFFFF,
                         v11,
                         *(_CM_KEY_CONTROL_BLOCK **)(a3 + 80),
                         1u,
                         KeyName,
                         v90,
                         0,
                         (_CM_KEY_CONTROL_BLOCK **)&BugCheckParameter2);
                  HIWORD(v11->_bf_b8) &= ~2u;
                  v96 = a9;
                  if( (a9 & 0x80000000) != 0 )
                  {
                    v130 = 0x2000i64;
                    goto LABEL_324;
                  }
                  v97 = (INT64)v11;
                  v11 = (_CM_KEY_CONTROL_BLOCK *)BugCheckParameter2;
                  CmpDereferenceKeyControlBlockUnsafe((volatile INT64 *)v97);
                  CmpUnlockHashEntryByKcb(v97);
                  HIBYTE(a9_5) = 0;
                  HiveRootCell = CmpStartKcbStackForTopLayerKcb((INT64)v190, (INT64)v11);
                  a9 = HiveRootCell;
                  if( HiveRootCell >= 0 )
                  {
                    *(_WORD *)(v97 + 186) |= 2u;
                    CmpLockKcbStackTopExclusiveRestShared((INT64)v190);
                    v98 = *(_QWORD *)v174;
                    v99 = a9_5;
                    *(_WORD *)(v97 + 186) &= ~2u;
                    v172 = 1;
                    v100 = CmpCreateKeyBody(
                             (volatile INT64 *)v11,
                             v99,
                             a3,
                             v98,
                             1,
                             (INT64)v190,
                             (INT64)&DmaAdapter,
                             (INT64)&a8);
                    a9 = v100;
                    if( v100 < 0 )
                    {
                      CmpRecordParseFailure(a3, 8576i64, (unsigned int)v100);
                      v45 = v166;
                      v161 = a9_4;
                    }
                    else
                    {
                      HvLockHiveFlusherShared(*(_QWORD *)(v97 + 32));
                      HvLockHiveFlusherExclusive((INT64)v11->KeyHash.KeyHive);
                      v101 = v11->KeyHash.KeyHive;
                      DirtyCount = v101->DirtyCount;
                      if( HvMarkCellDirty(v101, (PVOID)*v93, 0) )
                      {
                        LODWORD(ObjectCreatedb) = 0;
                        a9 = CmpCreateChild(
                               a1,
                               (INT64)v29,
                               (INT64)a4,
                               KeyName,
                               a3,
                               10,
                               ObjectCreatedb,
                               1,
                               *(INT64 *)v174);
                        if( (a9 & 0x80000000) == 0 )
                        {
                          v11->KeyHash.KeyCell = *v93;
                          KeyNodeForKcb = CmpGetKeyNodeForKcb((INT64)v11, (INT64)&v184, 1);
                          *(_DWORD *)(KeyNodeForKcb + 16) = *(_DWORD *)(v97 + 40);
                          ++v11->SequenceNumber;
                          CmpRebuildKcbCacheFromNode(v11, KeyNodeForKcb, 0i64, 0);
                          CmpReleaseKeyNodeForKcb((__int64)v11);
                          if( !DirtyCount )
                            HvResetDirtyData(v11->KeyHash.KeyHive);
                          HvUnlockHiveFlusherExclusive((INT64)v11->KeyHash.KeyHive);
                          HvUnlockHiveFlusherShared(*(_QWORD *)(v97 + 32));
                          *(_WORD *)(v97 + 8) |= 8u;
                          CmpReferenceKeyControlBlockUnsafe((volatile INT64 *)v11);
                          *(_QWORD *)(v97 + 104) = v11;
                          CmpUnlockHashEntry(*(_QWORD *)(a3 + 48), 0i64);
                          v41 = *(_CM_TRANS **)v174;
                          a5 = a9_5;
                          v161 = a9_4;
                          *(_DWORD *)(a3 + 32) = 1;
                          goto LABEL_59;
                        }
                      }
                      else
                      {
                        a9 = -1073741443;
                        CmpRecordParseFailure(a3, 8704i64, 3221225853i64);
                      }
                      HvUnlockHiveFlusherExclusive((INT64)v11->KeyHash.KeyHive);
                      HvUnlockHiveFlusherShared(*(_QWORD *)(v97 + 32));
                      v45 = v166;
                    }
LABEL_227:
                    CmpUnlockKcbStack((INT64)v190);
                    goto LABEL_67;
                  }
                  v130 = 8448i64;
LABEL_322:
                  v96 = (unsigned int)HiveRootCell;
LABEL_324:
                  CmpRecordParseFailure(a3, v130, v96);
                  v161 = a9_4;
                  goto LABEL_192;
                }
                HiveRootCell = -1073741772;
                v130 = 7680i64;
              }
            }
            a9 = HiveRootCell;
            goto LABEL_322;
          }
          CmpRecordParseFailure(a3, 3584i64, (unsigned int)v28);
        }
      }
      else
      {
        a9 = -1073741790;
        CmpRecordParseFailure(a3, 2560i64, 3221225506i64);
      }
    }
    else
    {
      CmpRecordParseFailure(a3, 2496i64, a9);
    }
LABEL_107:
    v45 = v166;
LABEL_76:
    if( HIBYTE(a9_5) )
      CmpUnlockHashEntryByKcb((INT64)v11);
    goto LABEL_78;
  }
  if( (*(_DWORD *)a3 & 0x400) != 0 )
    CmpLockRegistryExclusive();
  else
    CmpLockRegistry();
  FullKCBName = (unsigned __int64)v16->FullKCBName;
  LOBYTE(v14) = 1;
  v56 = 0;
  v167 = 1;
  if( (FullKCBName & 1) != 0 )
  {
    v56 = 1;
    FullKCBName &= ~1ui64;
  }
  if( !FullKCBName || v56 || !(unsigned __int8)RtlPrefixUnicodeString((PCUNICODE_STRING)FullKCBName, String2, 1u) )
  {
    CmpDereferenceKeyControlBlock((UINT64)v16);
    v16 = 0i64;
    v182 = 0i64;
    CmpUnlockRegistry();
    v14 = v171[0];
    v167 = 0;
LABEL_127:
    v11 = (_CM_KEY_CONTROL_BLOCK *)BugCheckParameter4;
    goto LABEL_11;
  }
  v57 = String2->Length - *(_WORD *)FullKCBName;
  v58 = String2->MaximumLength - *(_WORD *)FullKCBName;
  v59 = &String2->Buffer[(unsigned __int64)*(unsigned __int16 *)FullKCBName >> 1];
  v60 = v57;
  v181.m128i_i16[0] = v57;
  v61 = v59;
  v181.m128i_i64[1] = (__int64)v59;
  v62 = v58;
  v181.m128i_i16[1] = v58;
  if( v57 )
  {
    do
    {
      if( *v61 != 92 )
        break;
      ++v61;
      v62 -= 2;
      v60 -= 2;
    }
    while( v60 );
    v181.m128i_i64[1] = (__int64)v61;
    v181.m128i_i16[0] = v60;
    v181.m128i_i16[1] = v62;
  }
  v63 = (((unsigned __int32)v16->_bf_8 >> 21) & 0x3FF) - 1;
  if( (*(_DWORD *)a3 & 1) != 0 && !v60 )
  {
    NameBlock = v16->NameBlock;
    NameLength = NameBlock->NameHash.NameLength;
    v34 = (*(_DWORD *)NameBlock & 1) == 0;
    v84 = NameBlock->NameHash.NameLength;
    if( v34 )
    {
      v181.m128i_i16[0] = NameLength + v57;
      v86 = (__int64)&v59[-((unsigned __int64)NameLength >> 1)];
      v181.m128i_i16[1] = NameLength + v58;
    }
    else
    {
      v85 = 2 * NameLength;
      v86 = (__int64)&v59[-v84];
      v181.m128i_i16[1] = v58 + v85;
      v181.m128i_i16[0] = v57 + v85;
    }
    v181.m128i_i64[1] = v86;
    v12 = 1;
    --v63;
  }
  v64 = CmpComputeComponentHashes(&v181, v171, (INT64)v196);
  a9 = v64;
  if( v64 >= 0 )
  {
    v14 = v171[0];
    if( (unsigned int)(v171[0] + v63) > 0x20 )
    {
      a9 = -1073741811;
      v123 = 768i64;
      v124 = 3221225485i64;
    }
    else
    {
      v65 = CmpValidateComponents((unsigned int)v171[0], (INT64)v196);
      a9 = v65;
      if( v65 >= 0 )
      {
        if( v12 == v14 )
        {
          CmpLockHashEntrySharedByKcb(v16);
          v66 = 1;
          HIBYTE(a8) = 1;
        }
        else
        {
          v66 = 0;
        }
        CmpLockKcbShared(v16);
        if( CmpIsKeyDeleted((INT64)v16, 0i64) || (v16->_bf_8 & 0x40000) != 0 )
        {
          CmpUnlockKcb(v16);
          if( v66 )
            CmpUnlockHashEntryByKcb((INT64)v16);
          CmpDereferenceKeyControlBlock((UINT64)v16);
          v16 = 0i64;
          v182 = 0i64;
          v12 = 0;
          v181 = *p_ParentKcb;
          CmpCleanupPathInfo((INT64)v196);
          memset(v196, 0i64, 0xA8u);
          HIBYTE(a8) = 0;
        }
        else
        {
          CmpUnlockKcb(v16);
        }
        goto LABEL_127;
      }
      v124 = (unsigned int)v65;
      v123 = 1024i64;
    }
    CmpRecordParseFailure(a3, v123, v124);
    v11 = (_CM_KEY_CONTROL_BLOCK *)BugCheckParameter4;
    v45 = v166;
LABEL_81:
    LOBYTE(v14) = v167;
    goto LABEL_82;
  }
  CmpRecordParseFailure(a3, 512i64, (unsigned int)v64);
  v11 = (_CM_KEY_CONTROL_BLOCK *)BugCheckParameter4;
  v45 = v166;
LABEL_82:
  CmpCleanupKcbStack((INT64)a2);
  CmpCleanupKcbStack((INT64)v194);
  CmpCleanupKcbStack((INT64)v190);
  v46 = v185;
  if( v185 )
  {
    CmpDereferenceKeyControlBlockUnsafe((volatile INT64 *)v11);
    v47 = v46;
  }
  else
  {
    if( !v11 )
      goto LABEL_86;
    v47 = (UINT64)v11;
  }
  CmpDereferenceKeyControlBlock(v47);
LABEL_86:
  if( v16 )
    CmpDereferenceKeyControlBlock((UINT64)v16);
  v48 = *(_DWORD *)(a3 + 100);
  if( v48 && (v48 & 2) != 0 )
  {
    CmpSearchKeyControlBlockTreeEx(
      (__int64(__fastcall *)(__int64 *, __int64, __int64, __int64))CmpSyncKcbCacheForHive,
      *(_QWORD *)(a3 + 112),
      (__int64)a7,
      0i64,
      1);
    *(_DWORD *)(a3 + 100) &= ~2u;
  }
  CmpDrainDelayDerefContext((UINT64 **)a7);
  if( (_BYTE)v14 )
    CmpUnlockRegistry();
  if( (_BYTE)a8_2 )
  {
    if( !v45 )
      goto LABEL_94;
    if( CmpCheckExeOwnerForPca() )
      CmpPublishEventForPcaResolver(a3, &v45->Length);
  }
  if( v45 )
    CmpFreeTransientPoolWithTag(v45, 0x624E4D43ui64);
LABEL_94:
  if( (*(_DWORD *)(a3 + 160) & 1) != 0 )
    CmpDetachFromRegistryProcess((KAPC_STATE *)(a3 + 168));
  if( DmaAdapter )
    HalPutDmaAdapter(DmaAdapter);
  CmpCleanupPathInfo((INT64)v196);
  return a9;
}

Referenced by:

CmpParseKey