PopFxInitializeSocSubsystemStaticInfo
NTSTATUS __stdcall PopFxInitializeSocSubsystemStaticInfo(UINT64 PlatformIdleStateIndex, UINT64 Flags){
int v2;
__int64 v3;
int v4;
unsigned int Flink_high;
_LIST_ENTRY *v6;
__int64 v7;
VOID **PoolWithTag;
__int64 v9;
unsigned int v10;
__int64 v11;
__int128 v12;
char v13;
ULONG_PTR v14;
ULONG_PTR v15;
__int64 v16;
int v17;
WCHAR *v18;
__int64 v19;
int v20;
GUID *v21;
unsigned __int16 v22;
_LIST_ENTRY *v23;
char v25;
__int128 v26;
__int128 v27;
__int128 v28;
__int64 v29;
int v30;
__int64 v31;
WCHAR pszDest[64];
v2 = PlatformIdleStateIndex;
v29 = 0i64;
v26 = 0i64;
v27 = 0i64;
v28 = 0i64;
memset(pszDest, 0i64, sizeof(pszDest));
if( !*(_QWORD *)&PopFxProcessorPlugin )
return -1073741822;
v30 = v2;
v31 = 0i64;
if( !(unsigned __int8)PopPluginQuerySocSubsystemCount(v3, (__int64)&v30) )
return -1073741822;
Flink_high = v31;
v6 = PopFxLookupSocSubsystemsByPlatformIdleState(v2);
if( v6 )
{
v4 = -1073741585;
LABEL_29:
ExFreePoolWithTag(v6, 0x4D584650u);
return v4;
}
v7 = (int)(344 * Flink_high);
PoolWithTag = ExAllocatePoolWithTag(1ui64, v7 + 24, 1297630800i64);
v6 = (_LIST_ENTRY *)PoolWithTag;
if( !PoolWithTag )
return -1073741670;
memset(PoolWithTag, 0i64, v7 + 24);
LODWORD(v6[1].Flink) = v2;
v10 = 0;
HIDWORD(v6[1].Flink) = Flink_high;
if( Flink_high )
{
while( 1 )
{
v11 = 344i64 * v10;
*(char **)((char *)&v6[2].Flink + v11) = (char *)v6 + v11 + 108;
*(_DWORD *)((char *)&v6[1].Blink + v11) = 0x800000;
*(_WORD *)((char *)&v6[2].Blink + v11) = 0;
*(char **)((char *)&v6[3].Flink + v11) = (char *)v6 + v11 + 236;
*(_WORD *)((char *)&v6[2].Blink + v11 + 2) = 128;
*(_DWORD *)((char *)&v6[3].Blink + v11) = v10;
LODWORD(v26) = v2;
*((_QWORD *)&v26 + 1) = 0i64;
DWORD1(v26) = *(_DWORD *)((char *)&v6[3].Blink + v11);
v27 = *(_OWORD *)((char *)&v6[1].Blink + v11);
v12 = *(_OWORD *)((char *)&v6[2].Blink + v11);
v29 = 0i64;
v28 = v12;
PopPluginInitializeSocSubsystemStaticInfo(v9, (__int64)&v26);
*(_WORD *)((char *)&v6[2].Blink + v11) = v28;
*(_WORD *)((char *)&v6[1].Blink + v11) = v27;
*(_LIST_ENTRY **)((char *)&v6[4].Flink + v11) = (_LIST_ENTRY *)*((_QWORD *)&v26 + 1);
*(_DWORD *)((char *)&v6[6].Blink + v11) = v29;
v4 = RtlHashUnicodeString(
(const _UNICODE_STRING *)((char *)&v6[2].Blink + v11),
0,
0i64,
(UINT64 *)((char *)&v6[3].Blink + v11 + 4));
if( v4 < 0 )
break;
Flink_high = HIDWORD(v6[1].Flink);
if( ++v10 >= Flink_high )
goto LABEL_11;
}
}
else
{
LABEL_11:
v25 = 0;
v13 = 0;
v14 = 0;
if( Flink_high )
{
while( 1 )
{
v15 = 0;
v16 = 344i64 * v14;
v17 = *(_DWORD *)((char *)&v6[3].Blink + v16);
*(GUID *)((char *)&v6[4].Blink + v16) = GUID_SLEEPSTUDY_BLOCKER_TOP_LEVEL_SOC_SUBSYSTEM;
*(_WORD *)((char *)&v6[4].Blink + v16 + 4) = v2;
*(_WORD *)((char *)&v6[4].Blink + v16 + 6) = v17 + 1;
v18 = *(WCHAR **)((char *)&v6[2].Flink + v16);
if( HIDWORD(v6[1].Flink) )
{
while( 1 )
{
v19 = 344i64 * v15;
if( v15 != v14
&& !wcsncmp(
*(const WCHAR **)((char *)&v6[3].Flink + v16),
*(const WCHAR **)((char *)&v6[3].Flink + v19),
0x40u) )
{
PopFxBugCheck(0x706u, 0x25u, 0x4E616D65u, v15);
}
if( !wcsncmp(v18, *(const WCHAR **)((char *)&v6[3].Flink + v19), 0x40u) )
break;
if( ++v15 >= HIDWORD(v6[1].Flink) )
{
v13 = v25;
goto LABEL_18;
}
}
v20 = *(_DWORD *)((char *)&v6[3].Blink + v19) + 1;
v21 = (GUID *)((char *)&v6[5].Blink + v16);
v22 = v2;
}
else
{
LABEL_18:
if( v13 )
{
if( wcsncmp(v18, pszDest, 0x40u) )
PopFxBugCheck(0x706u, 0x25u, 0x50617265u, v14);
}
else
{
RtlStringCchCopyW(pszDest, 0x40ui64, v18);
v25 = 1;
}
LOWORD(v20) = 0;
v21 = (GUID *)((char *)&v6[5].Blink + v16);
v22 = 0;
}
++v14;
*v21 = GUID_SLEEPSTUDY_BLOCKER_TOP_LEVEL_SOC_SUBSYSTEM;
v21->Data2 = v22;
v21->Data3 = v20;
if( v14 >= HIDWORD(v6[1].Flink) )
break;
v13 = v25;
}
}
v4 = 0;
}
if( v4 )
goto LABEL_29;
v23 = (_LIST_ENTRY *)*(&stru_140C23628 + 528);
if( (_UNKNOWN *)**(&stru_140C23628 + 528) != (_UNKNOWN *)((char *)&stru_140C23628 + 4216) )
__fastfail(3u);
v6->Flink = (_LIST_ENTRY *)((char *)&stru_140C23628 + 4216);
v6->Blink = v23;
v23->Flink = v6;
*(&stru_140C23628 + 528) = v6;
return v4;
}Referenced by:
PopFxEnablePlatformStates