CmpVirtualBranchIsReplicated
INT64 __fastcall CmpVirtualBranchIsReplicated(
_CM_KEY_CONTROL_BLOCK *RootKCB,
_UNICODE_STRING *Path,
UINT8 *ParentReplicated){
INT64 result;
_CMHIVE *v7;
_CMHIVE *KeyHive;
char PathByName;
__int64 v10;
char v11;
__int64 v12;
bool v13;
UINT8 v14;
unsigned __int16 v15;
unsigned __int16 v16;
bool v17;
__int64 v18;
_UNICODE_STRING v19;
unsigned int v20;
int v21;
int v22;
PVOID v23;
v21 = -1;
result = 0i64;
v20 = 0;
v22 = 0;
v18 = 0i64;
v23 = 0i64;
*ParentReplicated = 0;
v7 = 0i64;
v19 = 0i64;
if( RootKCB )
{
if( !Path->Length )
{
v17 = CmpVEEnabled && (RootKCB->_bf_b8 & 0x1000000) != 0;
LOBYTE(result) = v17;
return result;
}
KeyHive = (_CMHIVE *)RootKCB->KeyHash.KeyHive;
}
else
{
LODWORD(result) = CmpGetCmHiveFromVirtualPath(Path, (_CMHIVE **)&v23);
if( (int)result < 0 )
{
LABEL_18:
LOBYTE(result) = 0;
return result;
}
v7 = *(_CMHIVE **)&CmpMasterHive;
KeyHive = (_CMHIVE *)v23;
}
LODWORD(result) = CmpBlockTwoHiveWrites(v7, KeyHive, 1u);
if( (int)result < 0 )
goto LABEL_18;
PathByName = CmpFindPathByName((__int64)RootKCB, (__m128i *)Path, &v19, &v20, &v18);
v10 = v18;
v11 = PathByName;
if( v18 && (v12 = (*(__int64(__fastcall **)(__int64, _QWORD, int *))(v18 + 8))(v18, v20, &v21)) != 0 )
{
if( v11 )
{
if( !CmpVEEnabled || (*(_WORD *)(v12 + 2) & 0x100) == 0 )
v11 = 0;
}
else
{
if( !CmpVEEnabled || (v13 = (*(_WORD *)(v12 + 2) & 0x100) == 0, v14 = 1, v13) )
v14 = 0;
v15 = 0;
v16 = v19.Length >> 1;
*ParentReplicated = v14;
if( v16 )
{
while( v19.Buffer[v15] != 92 )
{
if( ++v15 >= v16 )
goto LABEL_16;
}
*ParentReplicated = 0;
}
}
LABEL_16:
(*(void(__fastcall **)(__int64, int *))(v10 + 16))(v10, &v21);
}
else
{
v11 = 0;
}
CmpUnblockTwoHiveWrites(v7, KeyHive);
LOBYTE(result) = v11;
return result;
}Referenced by:
CmpVEExecuteRealStoreParseLogic
CmpVEExecuteVirtualStoreParseLogic