PiDevCfgQueryIncludedDriverConfigurations
INT64 __fastcall PiDevCfgQueryIncludedDriverConfigurations(INT64 a1){
INT64 v1;
unsigned int v2;
INT64 *v3;
int DriverConfiguration;
_QWORD *v6;
PVOID *v7;
INT64 v8;
WCHAR *v9;
WCHAR *v10;
WCHAR *v11;
WCHAR *v12;
const WCHAR *v13;
bool v14;
int v15;
WCHAR *v16;
int v17;
WCHAR *v18;
WCHAR *v19;
__int64 v20;
INT64 v21;
INT64 v22;
wchar_t *v23;
INT64 v24;
int v25;
INT64 *v26;
UNICODE_STRING *v27;
INT64 v28;
__int64 v29;
INT64 **v30;
const WCHAR *v31;
INT64 v32;
INT64 v33;
PVOID P;
struct _UNICODE_STRING DestinationString;
unsigned int v37;
INT64 v38;
wchar_t *Str2;
v1 = a1;
v2 = 0;
v33 = (INT64)&v33;
v3 = &v33;
DestinationString = 0i64;
P = &v33;
if( *(_QWORD *)(v1 + 360) )
{
DriverConfiguration = PiDevCfgPushDriverNodeEntry((INT64)&v33, v1);
if( DriverConfiguration < 0 )
goto LABEL_61;
do
{
LABEL_6:
if( (INT64 *)v33 == &v33 )
return(unsigned int)DriverConfiguration;
v6 = P;
if( *(INT64 **)P != &v33 || (v7 = (PVOID *)*((_QWORD *)P + 1), *v7 != P) )
LABEL_64:
__fastfail(3u);
P = (PVOID)*((_QWORD *)P + 1);
*v7 = &v33;
v8 = v6[2];
v32 = v8;
ExFreePoolWithTag(v6, 0);
v9 = *(WCHAR **)(v8 + 360);
}
while( !v9 );
while( 1 )
{
if( !*v9 )
{
LABEL_58:
if( DriverConfiguration < 0 )
goto LABEL_61;
goto LABEL_6;
}
v10 = v9;
v11 = v9;
v12 = wcschr(v9, 0x3Au);
if( v12 )
{
v13 = v12 + 1;
*v12 = 0;
v31 = v12 + 1;
v9 = v12 + 1;
v14 = *v11 < 0x2Au;
if( *v11 != 42 || (v14 = 0, v11[1]) )
v15 = v14 ? -1 : 1;
else
v15 = 0;
Str2 = (wchar_t *)((unsigned __int64)v10 & -(__int64)(v15 != 0));
v16 = wcsrchr(v13, 0x2Eu);
if( v16 )
{
*v16 = 0;
v9 = v16 + 1;
v17 = v16[1] - 42;
if( v16[1] == 42 )
v17 = v16[2];
if( v17 )
{
v37 = 0;
v9 = v16 + 1;
if( v16[1] )
{
do
{
v18 = wcschr(v9, 0x2Cu);
if( v18 )
{
*v18 = 0;
v19 = v18 + 1;
}
else
{
v20 = -1i64;
do
++v20;
while( v9[v20] );
v19 = &v9[v20];
}
v2 |= PiDevCfgGetDriverConfigurationKeyScope(v9);
v9 = v19;
}
while( *v19 );
v37 = v2;
}
v2 = 0;
}
else
{
v37 = -1;
}
v38 = 0i64;
RtlInitUnicodeString(&DestinationString, v13, v17);
v21 = v1 + 368;
v22 = *(_QWORD *)(v1 + 368);
if( v22 != v1 + 368 )
{
v23 = Str2;
do
{
v38 = v22;
if( RtlEqualUnicodeString((UNICODE_STRING *)(v22 + 88), &DestinationString, 1u) )
{
v24 = v22;
if( !v23 || !wcsicmp(*(const wchar_t **)(v22 + 48), v23) )
break;
}
v22 = *(_QWORD *)v22;
v24 = 0i64;
v38 = 0i64;
}
while( v22 != v21 );
v1 = a1;
v13 = v31;
if( v24 )
{
v2 = 0;
goto LABEL_52;
}
v2 = 0;
}
v25 = PiDevCfgQueryIncludedDriverNode(v32, Str2, v13, v37, &v38);
DriverConfiguration = v25;
if( v25 < 0 )
{
*(_DWORD *)(v1 + 412) = v25;
goto LABEL_58;
}
v26 = *(INT64 **)(v21 + 8);
if( *v26 != v21 )
goto LABEL_64;
v27 = (UNICODE_STRING *)v38;
v28 = v38;
*(_QWORD *)v38 = v21;
*(_QWORD *)(v28 + 8) = v26;
*v26 = v28;
*(_QWORD *)(v21 + 8) = v28;
DriverConfiguration = PiDevCfgQueryDriverConfiguration(v28);
if( DriverConfiguration < 0 )
goto LABEL_61;
if( v27[18].Buffer
&& !*(_QWORD *)(v1 + 296)
&& !PnpDuplicateUnicodeString((UNICODE_STRING *)(v1 + 288), v27 + 18) )
{
DriverConfiguration = -1073741670;
goto LABEL_58;
}
if( v27[19].Buffer )
{
DriverConfiguration = PiDevCfgAppendMultiSz((_UNICODE_STRING *)(v1 + 304), 0i64, v27 + 19, 0);
if( DriverConfiguration < 0 )
goto LABEL_61;
}
if( v27[20].Buffer )
{
DriverConfiguration = PiDevCfgAppendMultiSz((_UNICODE_STRING *)(v1 + 320), 0i64, v27 + 20, 0);
if( DriverConfiguration < 0 )
goto LABEL_61;
}
DriverConfiguration = PiDevCfgPushDriverNodeEntry((INT64)&v33, (INT64)v27);
if( DriverConfiguration < 0 )
goto LABEL_61;
}
}
LABEL_52:
v29 = -1i64;
do
++v29;
while( v9[v29] );
v9 += v29 + 1;
}
}
DriverConfiguration = 0;
while( (INT64 *)v33 != &v33 )
{
if( (INT64 *)*v3 != &v33 )
goto LABEL_64;
v30 = (INT64 **)v3[1];
if( *v30 != v3 )
goto LABEL_64;
P = (PVOID)v3[1];
*v30 = &v33;
ExFreePoolWithTag(v3, 0);
LABEL_61:
v3 = (INT64 *)P;
}
return(unsigned int)DriverConfiguration;
}Referenced by:
PiDevCfgQueryDriverConfiguration