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