CmRealKCBToVirtualPath
INT64 __fastcall CmRealKCBToVirtualPath(INT64 a1, __m128i *a2, INT64 a3, UNICODE_STRING *a4){
char v6;
_UNICODE_STRING *v8;
NTSTATUS VirtualizationID;
unsigned int v10;
__m128i v11;
wchar_t *v12;
unsigned __int16 Length;
wchar_t *PoolWithTag;
wchar_t *v15;
UNICODE_STRING v16;
UNICODE_STRING Source;
UNICODE_STRING v18;
v6 = 0;
Source = 0i64;
v16 = 0i64;
if( !CmpVEEnabled )
return 3221225485i64;
v8 = CmpConstructName((_CM_KEY_CONTROL_BLOCK *)a1);
if( !v8 )
return 3221225626i64;
VirtualizationID = CmpGetVirtualizationID(&Source);
if( VirtualizationID >= 0 )
{
v10 = v8->Length + Source.Length + 38;
if( a2 )
{
v11 = *a2;
*(_QWORD *)&v16.Length = a2->m128i_i64[0];
v12 = (wchar_t *)_mm_srli_si128(v11, 8).m128i_u64[0];
v16.Buffer = v12;
if( v12 )
{
Length = v16.Length;
if( v16.Length )
{
if( *v12 )
{
if( *v12 == 92 )
{
Length = v16.Length - 2;
v16.Buffer = v12 + 1;
v16.Length -= 2;
}
if( Length )
{
v10 += Length + 2;
v6 = 1;
}
}
}
}
}
PoolWithTag = (wchar_t *)ExAllocatePoolWithTag(PagedPool, v10, 0x624E4D43ui64);
a4->Buffer = PoolWithTag;
if( PoolWithTag )
{
a4->MaximumLength = v10;
a4->Length = 0;
VirtualizationID = RtlAppendUnicodeToString(a4, (PWCHAR)L"\\Registry\\User\\");
if( VirtualizationID < 0 )
goto LABEL_23;
VirtualizationID = RtlAppendUnicodeStringToString(a4, &Source);
if( VirtualizationID < 0 )
goto LABEL_23;
VirtualizationID = RtlAppendUnicodeToString(a4, (PWCHAR)L"\\VirtualStore");
if( VirtualizationID < 0
|| (v15 = v8->Buffer + 9,
*(_QWORD *)&v18.Length = *(_QWORD *)&v8->Length,
v18.Buffer = v15,
v18.Length = v8->Length - 18,
VirtualizationID = RtlAppendUnicodeStringToString(a4, &v18),
VirtualizationID < 0)
|| v6
&& ((VirtualizationID = RtlAppendUnicodeToString(a4, (PWCHAR)L"\\"), VirtualizationID < 0)
|| (VirtualizationID = RtlAppendUnicodeStringToString(a4, &v16), VirtualizationID < 0)) )
{
LABEL_23:
RtlFreeAnsiString(a4);
}
}
else
{
VirtualizationID = -1073741670;
}
}
CmpFreeTransientPoolWithTag(v8, 0x624E4D43ui64);
RtlFreeAnsiString(&Source);
return(unsigned int)VirtualizationID;
}Referenced by:
CmpReparseToVirtualPath
CmpReplicateKeyToVirtual
CmpReportAuditVirtualizationEvent
CmpVEExecuteCreateLogic
CmpVEExecuteRealStoreParseLogic