PiDevCfgQueryIncludedDriverConfigurations
NTSTATUS __stdcall PiDevCfgQueryIncludedDriverConfigurations(PI_DEVCFG_DRIVER_NODE *DriverNode){
PI_DEVCFG_DRIVER_NODE *v1;
unsigned int v2;
_LIST_ENTRY *p_DriverNodeStack;
int DriverConfiguration;
_LIST_ENTRY *Blink;
_LIST_ENTRY *v7;
_LIST_ENTRY *Flink;
WORD *v9;
WORD *v10;
WORD *v11;
WORD *v12;
WORD *v13;
bool v14;
int v15;
WORD *v16;
int v17;
WORD *v18;
WORD *v19;
__int64 v20;
PI_DEVCFG_DRIVER_NODE *v21;
PI_DEVCFG_DRIVER_NODE *v22;
wchar_t *v23;
PI_DEVCFG_DRIVER_NODE *v24;
NTSTATUS v25;
_PI_DEVCFG_DRIVER_NODE **v26;
_PI_DEVCFG_DRIVER_NODE *v27;
_PI_DEVCFG_DRIVER_NODE *v28;
__int64 v29;
_LIST_ENTRY *v30;
WORD *v31;
PI_DEVCFG_DRIVER_NODE *DriverNodeParent;
_LIST_ENTRY DriverNodeStack;
_UNICODE_STRING DestinationString;
unsigned int ConfigurationScope;
_PI_DEVCFG_DRIVER_NODE *DriverNodea;
wchar_t *Str2;
v1 = DriverNode;
v2 = 0;
DriverNodeStack.Flink = &DriverNodeStack;
p_DriverNodeStack = &DriverNodeStack;
DestinationString = 0i64;
DriverNodeStack.Blink = &DriverNodeStack;
if( *((_QWORD *)v1 + 45) )
{
DriverConfiguration = PiDevCfgPushDriverNodeEntry(&DriverNodeStack, v1);
if( DriverConfiguration < 0 )
goto LABEL_61;
do
{
LABEL_6:
if( DriverNodeStack.Flink == &DriverNodeStack )
return DriverConfiguration;
Blink = DriverNodeStack.Blink;
if( DriverNodeStack.Blink->Flink != &DriverNodeStack
|| (v7 = DriverNodeStack.Blink->Blink, v7->Flink != DriverNodeStack.Blink) )
{
LABEL_64:
__fastfail(3u);
}
DriverNodeStack.Blink = DriverNodeStack.Blink->Blink;
v7->Flink = &DriverNodeStack;
Flink = Blink[1].Flink;
DriverNodeParent = (PI_DEVCFG_DRIVER_NODE *)Flink;
ExFreePoolWithTag(Blink, 0);
v9 = (WORD *)Flink[22].Blink;
}
while( !v9 );
while( 1 )
{
if( !*v9 )
{
LABEL_58:
if( DriverConfiguration < 0 )
goto LABEL_61;
goto LABEL_6;
}
v10 = v9;
v11 = v9;
v12 = wcschr(v9, 58);
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, 46);
if( v16 )
{
*v16 = 0;
v9 = v16 + 1;
v17 = v16[1] - 42;
if( v16[1] == 42 )
v17 = v16[2];
if( v17 )
{
ConfigurationScope = 0;
v9 = v16 + 1;
if( v16[1] )
{
do
{
v18 = wcschr(v9, 44);
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 );
ConfigurationScope = v2;
}
v2 = 0;
}
else
{
ConfigurationScope = -1;
}
DriverNodea = 0i64;
RtlInitUnicodeString(&DestinationString, v13);
v21 = v1 + 92;
v22 = (PI_DEVCFG_DRIVER_NODE *)*((_QWORD *)v1 + 46);
if( v22 != v1 + 92 )
{
v23 = Str2;
do
{
DriverNodea = v22;
if( (unsigned __int8)RtlEqualUnicodeString((PCUNICODE_STRING)(v22 + 22), &DestinationString, 1u) )
{
v24 = v22;
if( !v23 || !wcsicmp(*((const wchar_t **)v22 + 6), v23) )
break;
}
v22 = *(PI_DEVCFG_DRIVER_NODE **)v22;
v24 = 0i64;
DriverNodea = 0i64;
}
while( v22 != v21 );
v1 = DriverNode;
v13 = v31;
if( v24 )
{
v2 = 0;
goto LABEL_52;
}
v2 = 0;
}
v25 = PiDevCfgQueryIncludedDriverNode(DriverNodeParent, Str2, v13, ConfigurationScope, &DriverNodea);
DriverConfiguration = v25;
if( v25 < 0 )
{
v1[103] = v25;
goto LABEL_58;
}
v26 = (_PI_DEVCFG_DRIVER_NODE **)*((_QWORD *)v21 + 1);
if( *v26 != v21 )
goto LABEL_64;
v27 = DriverNodea;
v28 = DriverNodea;
*(_QWORD *)DriverNodea = v21;
*((_QWORD *)v28 + 1) = v26;
*v26 = v28;
*((_QWORD *)v21 + 1) = v28;
DriverConfiguration = PiDevCfgQueryDriverConfiguration(v28);
if( DriverConfiguration < 0 )
goto LABEL_61;
if( *((_QWORD *)v27 + 37)
&& !*((_QWORD *)v1 + 37)
&& !PnpDuplicateUnicodeString((__int64)(v1 + 72), (__int64)(v27 + 72)) )
{
DriverConfiguration = -1073741670;
goto LABEL_58;
}
if( *((_QWORD *)v27 + 39) )
{
DriverConfiguration = PiDevCfgAppendMultiSz((_UNICODE_STRING *)v1 + 19, 0i64, (const VOID **)v27 + 38, 0);
if( DriverConfiguration < 0 )
goto LABEL_61;
}
if( *((_QWORD *)v27 + 41) )
{
DriverConfiguration = PiDevCfgAppendMultiSz((_UNICODE_STRING *)v1 + 20, 0i64, (const VOID **)v27 + 40, 0);
if( DriverConfiguration < 0 )
goto LABEL_61;
}
DriverConfiguration = PiDevCfgPushDriverNodeEntry(&DriverNodeStack, v27);
if( DriverConfiguration < 0 )
goto LABEL_61;
}
}
LABEL_52:
v29 = -1i64;
do
++v29;
while( v9[v29] );
v9 += v29 + 1;
}
}
DriverConfiguration = 0;
while( DriverNodeStack.Flink != &DriverNodeStack )
{
if( p_DriverNodeStack->Flink != &DriverNodeStack )
goto LABEL_64;
v30 = p_DriverNodeStack->Blink;
if( v30->Flink != p_DriverNodeStack )
goto LABEL_64;
DriverNodeStack.Blink = p_DriverNodeStack->Blink;
v30->Flink = &DriverNodeStack;
ExFreePoolWithTag(p_DriverNodeStack, 0);
LABEL_61:
p_DriverNodeStack = DriverNodeStack.Blink;
}
return DriverConfiguration;
}Referenced by:
PiDevCfgQueryDriverConfiguration