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