PopIdleWakeGenerateDescriptionString
VOID __stdcall PopIdleWakeGenerateDescriptionString(INT64 *a1, INT64 a2){
__int64 v2;
_UNICODE_STRING *v3;
wchar_t *v6;
__int64 v7;
wchar_t *v8;
unsigned __int16 v9;
__int64 v10;
VOID **v11;
UINT64 v12;
UINT64 v13;
VOID **PoolWithTag;
__int128 v15;
unsigned int *v16;
INT64 v17;
__int64 v18;
unsigned int v19;
unsigned __int16 *v20;
UINT64 v21;
VOID **v22;
UINT64 *v23;
UINT64 v24;
const wchar_t *v25;
__int64 v26;
__int16 v27;
signed __int64 v28;
unsigned int i;
unsigned __int64 MaximumLength;
unsigned __int64 Length;
wchar_t *Buffer;
const wchar_t *v33;
unsigned __int64 v34;
unsigned __int64 v35;
__int64 v36;
__int16 v37;
unsigned __int64 v38;
char *v39;
_UNICODE_STRING *v40;
WCHAR **v41;
UINT64 pcbLength;
UINT64 v43;
UINT64 pcchDest;
WCHAR *ppszDest;
__int128 v46;
INT64 v47;
INT64 v48;
v2 = *(int *)a1;
v3 = (_UNICODE_STRING *)(a2 + 392);
pcbLength = 0i64;
v43 = 0i64;
if( (unsigned int)v2 > 4 )
{
if( (_DWORD)v2 == 6 )
{
v10 = *((unsigned __int8 *)a1 + 8);
if( (unsigned __int8)v10 < 0x10u )
{
if( RtlStringCbLengthW(PopIrTimerDescriptions[v10], 0xFFFFui64, &pcbLength) < 0 )
return;
if( *((_BYTE *)a1 + 8) == 3 )
{
if( RtlStringCbLengthW((WCHAR *)a1 + 5, 0x80ui64, &v43) < 0 )
return;
v13 = pcbLength + v43 + 42;
}
else
{
v13 = pcbLength + 48;
}
if( v13 <= v12 )
{
PoolWithTag = ExAllocatePoolWithTag(1ui64, v13, 1734960208i64);
v3->Buffer = (wchar_t *)PoolWithTag;
if( PoolWithTag )
{
*(_BYTE *)(a2 + 384) = 1;
v3->Length = 0;
v3->MaximumLength = v13;
if( *((_BYTE *)a1 + 8) == 3 )
RtlUnicodeStringPrintf(v3, (WCHAR *)L"Timer(Name:Index): %s:%s");
else
RtlUnicodeStringPrintf(v3, (WCHAR *)L"Timer(Name:Index): %s:%d");
}
}
}
else
{
v11 = ExAllocatePoolWithTag(1ui64, 0x40ui64, 1734960208i64);
v3->Buffer = (wchar_t *)v11;
if( v11 )
{
*(_BYTE *)(a2 + 384) = 1;
*(_DWORD *)&v3->Length = 0x400000;
RtlUnicodeStringPrintf(v3, (WCHAR *)L"Timer(Component:Index): %d:%d");
}
}
}
else if( (_DWORD)v2 == 5 )
{
v15 = *(_OWORD *)(a1 + 1);
v16 = (unsigned int *)(a2 + 408);
v17 = a1[3];
v48 = a2 + 408;
v46 = v15;
v47 = v17;
if( (int)MmEnumerateSystemImages(
(__int64(__fastcall *)(INT64 *, __int64))PopIdleWakeSystemImageCallback,
(__int64)&v46) >= 0 )
{
v18 = 0i64;
v19 = 0;
if( *v16 )
{
v20 = (unsigned __int16 *)(v16 + 2);
do
{
if( v19 )
v18 += 4i64;
++v19;
v18 += *v20;
v20 += 8;
}
while( v19 < *v16 );
}
v21 = v18 + 24;
if( v21 <= 0xFFFF )
{
v22 = ExAllocatePoolWithTag(1ui64, v21, 1734960208i64);
v3->Buffer = (wchar_t *)v22;
if( v22 )
{
*(_BYTE *)(a2 + 384) = 1;
v3->Length = 0;
v3->MaximumLength = v21;
ppszDest = 0i64;
pcchDest = 0i64;
if( RtlUnicodeStringValidateDestWorker(v3, &ppszDest, &pcchDest, v23, v40, v41, (UINT64 *)pcbLength, v43) >= 0 )
{
v24 = pcchDest;
v25 = L"Interrupt: ";
v26 = 0x7FFFi64;
v27 = 0;
if( pcchDest )
{
v28 = (char *)ppszDest - (char *)L"Interrupt: ";
do
{
if( !v26 )
break;
if( !*v25 )
break;
*(const wchar_t *)((char *)v25 + v28) = *v25;
--v26;
++v25;
++v27;
--v24;
}
while( v24 );
}
v3->Length = 2 * v27;
}
for( i = 0; i < *v16; ++i )
{
if( i )
{
MaximumLength = v3->MaximumLength;
Length = v3->Length;
if( (((unsigned __int16)Length | (unsigned __int16)MaximumLength) & 1) == 0
&& (unsigned __int16)Length <= (unsigned __int16)MaximumLength
&& (_WORD)MaximumLength != 0xFFFF )
{
Buffer = v3->Buffer;
if( Buffer || !__PAIR32__(MaximumLength, Length) )
{
v33 = L", ";
v34 = MaximumLength >> 1;
v35 = Length >> 1;
v36 = 0x7FFFi64;
v37 = 0;
v38 = v34 - v35;
if( v38 )
{
v39 = (char *)Buffer + 2 * v35 - (_QWORD)L", ";
do
{
if( !v36 )
break;
if( !*v33 )
break;
*(const wchar_t *)((char *)v33 + (_QWORD)v39) = *v33;
--v36;
++v33;
++v37;
}
while( v36 + v38 - 0x7FFF );
}
v3->Length = 2 * (v37 + v35);
}
}
}
RtlUnicodeStringCat(v3, (const _UNICODE_STRING *)&v16[4 * i + 2]);
}
}
}
}
}
}
else
{
_mm_lfence();
v6 = PopDiagStaticWakeSourceDescriptions[v2];
*v3 = 0i64;
if( v6 )
{
v7 = 0x7FFFi64;
v8 = v6;
do
{
if( !*v8 )
break;
++v8;
--v7;
}
while( v7 );
if( v7 )
{
if( v3 )
{
v9 = 2 * (v7 != 0 ? 0x7FFF - v7 : 0);
v3->Buffer = v6;
v3->Length = v9;
v3->MaximumLength = v9 + 2;
}
}
}
}
}Referenced by:
PopIdleWakeSourceAccountingToDiagnostic