CmpFindPathByName
char __fastcall CmpFindPathByName(__int64 a1, __m128i *a2, _UNICODE_STRING *a3, unsigned int *a4, __int64 *a5){
unsigned __int16 v5;
__int64 *v8;
__m128i v10;
unsigned __int16 v11;
wchar_t *v12;
unsigned __int16 v13;
__int64 v14;
unsigned int v15;
unsigned __int64 v16;
__int64 v17;
_CM_KEY_NODE *v18;
unsigned int v20;
__int64 v21;
_UNICODE_STRING v22;
_UNICODE_STRING SearchName;
UINT Cell;
int v25;
int v26;
unsigned int *v27;
v27 = a4;
v5 = 0;
*(_QWORD *)&SearchName.Length = 0i64;
v25 = -1;
*a4 = -1;
v8 = a5;
v26 = 0;
*a5 = 0i64;
if( a3 )
{
RtlInitUnicodeString(a3, 0i64);
a4 = v27;
v8 = a5;
}
v10 = *a2;
v11 = _mm_cvtsi128_si32(*a2);
v22 = (_UNICODE_STRING)v10;
v22.Length = v11;
if( v11 )
{
v12 = (wchar_t *)v10.m128i_i64[1];
v13 = v10.m128i_u16[1];
if( a1 )
{
v14 = *(_QWORD *)(a1 + 32);
*v8 = v14;
v15 = *(_DWORD *)(a1 + 40);
*a4 = v15;
}
else
{
v14 = *(_QWORD *)&CmpMasterHive;
v15 = *(_DWORD *)(*(_QWORD *)(*(_QWORD *)&CmpMasterHive + 64i64) + 36i64);
do
{
if( *v12 != 92 )
break;
v11 -= 2;
++v12;
v13 -= 2;
v22.Length = v11;
}
while( v11 );
v22.Buffer = v12;
v22.MaximumLength = v13;
if( !v11 )
goto LABEL_21;
do
{
if( *v12 == 92 )
break;
v11 -= 2;
++v12;
v13 -= 2;
v22.Length = v11;
}
while( v11 );
v22.Buffer = v12;
v22.MaximumLength = v13;
}
do
{
if( v11 )
{
do
{
if( *v12 != 92 )
break;
v11 -= 2;
++v12;
v13 -= 2;
v22.Length = v11;
}
while( v11 );
v22.Buffer = v12;
v22.MaximumLength = v13;
}
LABEL_21:
if( a3 )
*a3 = v22;
if( !v11 )
break;
v17 = (*(__int64(__fastcall **)(__int64, _QWORD, int *, unsigned int *))(v14 + 8))(v14, v15, &v25, a4);
v18 = (_CM_KEY_NODE *)v17;
if( !v17 )
return 0;
SearchName.Buffer = v12;
SearchName.Length = 0;
do
{
if( v12[(unsigned __int64)v5 >> 1] == 92 )
break;
v5 += 2;
}
while( v5 < v11 );
SearchName.Length = v5;
if( (*(_BYTE *)(v17 + 2) & 2) != 0 )
{
v20 = *(_DWORD *)(v17 + 28);
v21 = v14;
v14 = *(_QWORD *)(v17 + 36);
(*(void(__fastcall **)(__int64, int *, __int64))(v21 + 16))(v21, &v25, 2i64);
v18 = (_CM_KEY_NODE *)(*(__int64(__fastcall **)(__int64, _QWORD, int *))(v14 + 8))(v14, v20, &v25);
if( !v18 )
return 0;
}
Cell = 0;
CmpFindSubKeyByNameWithStatus((_HHIVE *)v14, v18, &SearchName, &Cell);
(*(void(__fastcall **)(__int64, int *))(v14 + 16))(v14, &v25);
v15 = Cell;
if( Cell == -1 )
return 0;
v13 -= v5;
v11 -= v5;
v22.MaximumLength = v13;
v22.Length = v11;
*v27 = Cell;
*a5 = v14;
v16 = v5;
v5 = 0;
v12 += v16 >> 1;
v22.Buffer = v12;
}
while( v11 );
}
else
{
if( !a1 )
return 0;
*v8 = *(_QWORD *)(a1 + 32);
*a4 = *(_DWORD *)(a1 + 40);
}
return 1;
}Referenced by:
CmpVEExecuteOpenLogic
CmpVEExecuteRealStoreParseLogic
CmpVEExecuteVirtualStoreParseLogic
CmpVirtualBranchIsReplicated
CmpVirtualPathPresent