CmpVEExecuteVirtualStoreParseLogic
VOID __fastcall CmpVEExecuteVirtualStoreParseLogic(_CM_KEY_CONTROL_BLOCK *FoundKcb, _UNICODE_STRING *RemainingName){
_DWORD *v2;
UNICODE_STRING *v3;
_CMHIVE *v6;
UNICODE_STRING *v7;
_DWORD *v8;
WCHAR v9;
unsigned int v10;
WCHAR v11;
CHAR PathByName;
WCHAR v13;
wchar_t *Buffer;
wchar_t *v15;
UINT64 v16;
_CMHIVE *TerminalHive;
INT64 v18;
UNICODE_STRING v19;
struct _UNICODE_STRING DestinationString;
UINT8 ParentReplicated;
v18 = 0i64;
LODWORD(v16) = 0;
ParentReplicated = 0;
v6 = 0i64;
DestinationString = 0i64;
TerminalHive = 0i64;
v7 = v3;
v19 = 0i64;
v8 = v2;
RtlInitUnicodeString(&DestinationString, 0i64, (WCHAR)v2);
RtlInitUnicodeString(&v19, 0i64, v9);
*v8 |= 8u;
if( !(unsigned __int8)CmpVirtualBranchIsReplicated(FoundKcb, RemainingName, &ParentReplicated)
&& CmVirtualKCBToRealPath(FoundKcb, &DestinationString) >= 0 )
{
v10 = RemainingName->Length + DestinationString.Length + 2;
if( v10 <= 0xFFFF )
{
v19.MaximumLength = RemainingName->Length + DestinationString.Length + 2;
v19.Buffer = (wchar_t *)ExAllocatePoolWithTag(PagedPool, (unsigned __int16)v10, 0x624E4D43ui64);
if( !v19.Buffer )
goto LABEL_22;
RtlUnicodeStringCopy(&v19, &DestinationString);
CmpUnicodeStringAppendCharacter(&v19.Length);
RtlUnicodeStringCat(&v19, RemainingName);
if( (*v8 & 1) != 0 && ParentReplicated )
{
if( CmpBlockHiveWrites(0i64, 0x10ui64, &TerminalHive) >= 0 )
{
PathByName = CmpFindPathByName(0i64, (__m128i *)&v19, 0i64, &v16, &v18);
CmpUnblockHiveWrites(0i64, 16, (volatile signed __int32 *)TerminalHive);
if( PathByName )
{
Buffer = v7->Buffer;
if( Buffer )
ExFreePoolWithTag(Buffer, 0);
*v7 = v19;
RtlInitUnicodeString(&v19, 0i64, v13);
}
goto LABEL_20;
}
v6 = TerminalHive;
LABEL_18:
if( v6 )
CmpUnblockHiveWrites(0i64, 16, (volatile signed __int32 *)v6);
goto LABEL_20;
}
if( (*((_DWORD *)FoundKcb + 2) & 0x7FE00000u) > 0x800000 )
{
v15 = v7->Buffer;
if( v15 )
ExFreePoolWithTag(v15, 0);
*v7 = v19;
RtlInitUnicodeString(&v19, 0i64, v11);
goto LABEL_18;
}
}
}
LABEL_20:
if( v19.Buffer )
ExFreePoolWithTag(v19.Buffer, 0);
LABEL_22:
if( DestinationString.Buffer )
ExFreePoolWithTag(DestinationString.Buffer, 0);
}Referenced by:
CmpVEExecuteParseLogic