CmpVEExecuteRealStoreParseLogic
INT64 __fastcall CmpVEExecuteRealStoreParseLogic(INT64 a1, __m128i *a2, _DWORD *a3, __m128i *a4, INT64 a5){
volatile signed __int64 *v8;
__int64 v9;
INT64 v10;
int v11;
CHAR PathByName;
CHAR v13;
WCHAR v14;
__int64 v16;
void *v17;
char ParentReplicated[4];
UINT64 v19;
__int16 v20;
__int16 v21;
INT64 v22;
struct _UNICODE_STRING DestinationString;
v21 = 0;
v19 = 0xFFFFFFFF00000000ui64;
ParentReplicated[0] = 0;
v20 = 0;
v22 = 0i64;
DestinationString = 0i64;
v8 = 0i64;
v9 = 0i64;
v10 = 0i64;
RtlInitUnicodeString(&DestinationString, 0i64, (WCHAR)a3);
if( CmpIsKeyDeleted(a1, 0i64) )
{
v13 = 0;
}
else
{
v11 = CmpBlockHiveWrites(*(_CMHIVE **)(a1 + 32), 0i64, 0i64);
if( v11 < 0 )
goto LABEL_9;
v8 = *(volatile signed __int64 **)(a1 + 32);
PathByName = CmpFindPathByName(a1, a2, 0i64, &v19, &v22);
v10 = v22;
v13 = PathByName;
if( PathByName )
{
v16 = (*(__int64(__fastcall **)(INT64, _QWORD, char *))(v22 + 8))(v22, (unsigned int)v19, (char *)&v19 + 4);
v9 = v16;
if( !v16 )
{
v11 = -1073741670;
goto LABEL_9;
}
if( (*(_DWORD *)(v16 + 52) & 0x200000) != 0 )
{
LABEL_8:
v11 = -1073741199;
goto LABEL_9;
}
(*(void(__fastcall **)(INT64, char *))(v10 + 16))(v10, (char *)&v19 + 4);
}
CmpUnblockHiveWrites(*(volatile signed __int64 **)(a1 + 32), 0, 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;
}
v17 = (void *)a4->m128i_i64[1];
if( v17 )
ExFreePoolWithTag(v17, 0);
*(struct _UNICODE_STRING *)a4 = DestinationString;
RtlInitUnicodeString(&DestinationString, 0i64, v14);
v11 = 260;
LABEL_9:
if( DestinationString.Buffer )
ExFreePoolWithTag(DestinationString.Buffer, 0);
if( v9 )
(*(void(__fastcall **)(INT64, char *))(v10 + 16))(v10, (char *)&v19 + 4);
if( v8 )
CmpUnblockHiveWrites(v8, 0, 0i64);
return(unsigned int)v11;
}Referenced by:
CmpVEExecuteParseLogic