PopFxLogSocSubsystemMetadata
NTSTATUS __stdcall PopFxLogSocSubsystemMetadata(UINT8 ScenarioInstanceId, UINT64 PlatformIdleStateIndex, UINT64 Flags){
int v3;
NTSTATUS v4;
_LIST_ENTRY *v5;
_LIST_ENTRY *v6;
unsigned int v7;
__int64 v8;
__int64 v9;
size_t v10;
VOID **PoolWithTag;
VOID **v12;
unsigned int v13;
unsigned int i;
__int64 v15;
__int64 v16;
UINT64 v17;
VOID **v18;
VOID **v19;
POP_FX_PLUGIN *v20;
__int64 v21;
VOID *v22;
unsigned int j;
VOID **v24;
VOID **v25;
_EVENT_DATA_DESCRIPTOR *UserData;
unsigned int v27;
unsigned int v28;
__int64 v29;
__int64 v30;
unsigned __int16 *v31;
__int64 v32;
unsigned int v33;
__int64 v34;
unsigned int v35;
__int64 v36;
__int64 v37;
unsigned int v38;
__int64 v39;
bool v40;
REGHANDLE v41;
UINT64 v43;
unsigned int v44;
int v45;
int v46;
int v47;
ULONG UserDataCount;
v47 = Flags;
v46 = PlatformIdleStateIndex;
v45 = v3;
v44 = 0;
v4 = 0;
v43 = PopWnfCsEnterScenarioId;
LOBYTE(v47) = 0;
v5 = PopFxLookupSocSubsystemsByPlatformIdleState(PlatformIdleStateIndex);
v6 = v5;
if( v5 )
{
v7 = 0;
if( !HIDWORD(v5[1].Flink) )
return v4;
while( 1 )
{
v8 = 344i64 * v7;
v9 = *(unsigned int *)((char *)&v6[6].Blink + v8);
v44 = v9;
if( !(_DWORD)v9 )
goto LABEL_28;
v10 = 296 * v9;
PoolWithTag = ExAllocatePoolWithTag(1ui64, 296 * v9, 1297630800i64);
v12 = PoolWithTag;
if( !PoolWithTag )
return -1073741670;
memset(PoolWithTag, 0i64, v10);
v13 = v44;
for( i = 0; i < v44; v13 = v44 )
{
v15 = i++;
v16 = 37 * v15;
v12[v16 + 1] = &v12[37 * v15 + 4];
WORD1(v12[v16]) = 128;
v12[v16 + 3] = (char *)&v12[37 * v15 + 20] + 4;
WORD1(v12[v16 + 2]) = 128;
LODWORD(v12[v16 + 20]) = -1430541637;
HIDWORD(v12[v16 + 36]) = -1430541637;
}
v17 = (int)(8 * v13 + 32);
v18 = ExAllocatePoolWithTag(1ui64, v17, 1297630800i64);
v19 = v18;
if( !v18 )
break;
memset(v18, 0i64, v17);
v21 = 0i64;
*(_DWORD *)v19 = v46;
v22 = *(_LIST_ENTRY **)((char *)&v6[4].Flink + v8);
*((_DWORD *)v19 + 6) = 0;
v19[1] = v22;
v19[2] = (char *)&v6[2].Blink + v8;
for( *((_DWORD *)v19 + 7) = v44; (unsigned int)v21 < v44; v21 = (unsigned int)(v21 + 1) )
{
v20 = (POP_FX_PLUGIN *)(unsigned int)v21;
v19[v21 + 4] = &v12[37 * (unsigned int)v21];
}
if( (unsigned __int8)PopPluginQuerySocSubsystemMetadata(
v20,
*(unsigned int *)((char *)&v6[3].Blink + v8 + 4),
(PEP_QUERY_SOC_SUBSYSTEM_METADATA *)v19) )
{
for( j = 0; j < v44; ++j )
{
v24 = &v12[37 * j];
if( *((_DWORD *)v24 + 40) != -1430541637 )
PopFxBugCheck(0x706u, 0x28u, 0x4B657920u, *((unsigned __int16 *)v24 + 1));
if( *((_DWORD *)v24 + 73) != -1430541637 )
PopFxBugCheck(0x706u, 0x28u, 0x56616C75u, *((unsigned __int16 *)v24 + 9));
}
UserDataCount = v44 + 4 * v44 + 3;
v25 = ExAllocatePoolWithTag(1ui64, 16i64 * UserDataCount, 1297630800i64);
UserData = (_EVENT_DATA_DESCRIPTOR *)v25;
if( !v25 )
break;
v27 = 2;
LOBYTE(v47) = v43;
v28 = 0;
v25[1] = (VOID *)1;
*v25 = &v47;
v25[2] = &v44;
for( v25[3] = (VOID *)4; v28 < v44; *(_QWORD *)&UserData[v37].Size = v38 )
{
v29 = v27;
UserData[v29].Ptr = (unsigned __int64)&v6[4].Blink + v8;
*(_QWORD *)&UserData[v29].Size = 16i64;
v30 = v28++;
v31 = (unsigned __int16 *)&v12[37 * v30];
*((_DWORD *)v31 + 40) = *v31 >> 1;
v32 = v27 + 1;
v33 = v27 + 2;
v32 *= 2i64;
v34 = v33;
*(&UserData->Ptr + v32) = (unsigned __int64)(v31 + 80);
*((_QWORD *)&UserData->Size + v32) = 4i64;
v35 = *v31;
UserData[v34].Ptr = *((_QWORD *)v31 + 1);
UserData[v34].Size = v35;
UserData[v34].Reserved = 0;
*((_DWORD *)v31 + 73) = v31[8] >> 1;
v36 = v33 + 1;
v33 += 2;
v36 *= 2i64;
v37 = v33;
v27 = v33 + 1;
*(&UserData->Ptr + v36) = (unsigned __int64)(v31 + 146);
*((_QWORD *)&UserData->Size + v36) = 4i64;
v38 = v31[8];
UserData[v37].Ptr = *((_QWORD *)v31 + 3);
}
v39 = v27;
v40 = PopDiagSleepStudyHandleRegistered == 0;
UserData[v39].Ptr = (unsigned __int64)&v43;
*(_QWORD *)&UserData[v39].Size = 8i64;
if( !v40 )
{
v41 = PopDiagSleepStudyHandle;
if( EtwEventEnabled(PopDiagSleepStudyHandle, &SLEEPSTUDY_EVT_SCENARIO_BLOCKER_DATA) )
EtwWrite(v41, &SLEEPSTUDY_EVT_SCENARIO_BLOCKER_DATA, 0, UserDataCount, UserData);
}
ExFreePoolWithTag(UserData, 0x4D584650u);
}
else
{
v4 = -1073741595;
}
LABEL_25:
ExFreePoolWithTag(v12, 0x4D584650u);
if( v19 )
ExFreePoolWithTag(v19, 0x4D584650u);
if( v4 < 0 )
return v4;
LABEL_28:
if( ++v7 >= HIDWORD(v6[1].Flink) )
return v4;
}
v4 = -1073741670;
goto LABEL_25;
}
return -1073741584;
}Referenced by:
PopCaptureSleepStudyStatistics