CmpVEExecuteRealStoreParseLogic
INT64 __fastcall CmpVEExecuteRealStoreParseLogic(INT64 a1, __m128i *a2, _DWORD *a3, __m128i *a4, INT64 a5){
_CMHIVE *v8;
__int64 v9;
__int64 v10;
int v11;
char PathByName;
char v13;
__int64 v15;
void *v16;
char ParentReplicated[4];
unsigned int v18;
__int64 v19;
__int64 v20;
_UNICODE_STRING DestinationString;
v19 = 0xFFFFFFFFi64;
v18 = 0;
ParentReplicated[0] = 0;
v20 = 0i64;
DestinationString = 0i64;
v8 = 0i64;
v9 = 0i64;
v10 = 0i64;
RtlInitUnicodeString(&DestinationString, 0i64);
if( CmpIsKeyDeleted(a1, 0i64) )
{
v13 = 0;
}
else
{
v11 = CmpBlockHiveWrites(*(_CMHIVE **)(a1 + 32), 0i64, 0i64);
if( v11 < 0 )
goto LABEL_9;
v8 = *(_CMHIVE **)(a1 + 32);
PathByName = CmpFindPathByName(a1, a2, 0i64, &v18, &v20);
v10 = v20;
v13 = PathByName;
if( PathByName )
{
v15 = (*(__int64(__fastcall **)(__int64, _QWORD, __int64 *))(v20 + 8))(v20, v18, &v19);
v9 = v15;
if( !v15 )
{
v11 = -1073741670;
goto LABEL_9;
}
if( (*(_DWORD *)(v15 + 52) & 0x200000) != 0 )
{
LABEL_8:
v11 = -1073741199;
goto LABEL_9;
}
(*(void(__fastcall **)(__int64, __int64 *))(v10 + 16))(v10, &v19);
}
CmpUnblockHiveWrites(*(_CMHIVE **)(a1 + 32), 0i64, 0i64);
}
v8 = 0i64;
v9 = 0i64;
v11 = CmRealKCBToVirtualPath(a1, a2, a5, &DestinationString);
if( v11 < 0 )
goto LABEL_9;
*a3 |= 8u;
if( !(unsigned __int8)CmpVirtualBranchIsReplicated(0i64, &DestinationString, (UINT8 *)ParentReplicated)
&& ((*a3 & 1) == 0 || v13 || !ParentReplicated[0]) )
{
goto LABEL_8;
}
v16 = (void *)a4->m128i_i64[1];
if( v16 )
ExFreePoolWithTag(v16, 0);
*(_UNICODE_STRING *)a4 = DestinationString;
RtlInitUnicodeString(&DestinationString, 0i64);
v11 = 260;
LABEL_9:
if( DestinationString.Buffer )
ExFreePoolWithTag(DestinationString.Buffer, 0);
if( v9 )
(*(void(__fastcall **)(__int64, __int64 *))(v10 + 16))(v10, &v19);
if( v8 )
CmpUnblockHiveWrites(v8, 0i64, 0i64);
return(unsigned int)v11;
}Referenced by:
CmpVEExecuteParseLogic