PopIdleWakeGenerateDescriptionString
INT64 __fastcall PopIdleWakeGenerateDescriptionString(INT64 *a1, INT64 a2){
__int64 v2;
_UNICODE_STRING *v3;
wchar_t *v6;
INT64 result;
__int64 v8;
wchar_t *v9;
unsigned __int16 v10;
__int64 v11;
wchar_t *PoolWithTag;
const WCHAR *v13;
UINT64 v14;
UINT64 v15;
wchar_t *v16;
__int128 v17;
unsigned int *v18;
INT64 v19;
__int64 v20;
unsigned int v21;
unsigned __int16 *v22;
UINT64 v23;
wchar_t *v24;
UINT64 *v25;
size_t v26;
const wchar_t *v27;
__int64 v28;
__int16 v29;
signed __int64 v30;
unsigned int i;
unsigned __int64 MaximumLength;
unsigned __int64 Length;
wchar_t *Buffer;
const wchar_t *v35;
unsigned __int64 v36;
unsigned __int64 v37;
__int64 v38;
__int16 v39;
unsigned __int64 v40;
char *v41;
UNICODE_STRING *v42;
WCHAR **v43;
size_t pcbLength;
size_t v45;
size_t pcchDest;
wchar_t *ppszDest;
__int128 v48;
INT64 v49;
INT64 v50;
v2 = *(int *)a1;
v3 = (_UNICODE_STRING *)(a2 + 392);
pcbLength = 0i64;
v45 = 0i64;
if( (unsigned int)v2 > 4 )
{
if( (_DWORD)v2 == 6 )
{
v11 = *((unsigned __int8 *)a1 + 8);
if( (unsigned __int8)v11 >= 0x10u )
{
PoolWithTag = (wchar_t *)ExAllocatePoolWithTag(PagedPool, 0x40ui64, 0x67696450ui64);
v3->Buffer = PoolWithTag;
if( PoolWithTag )
{
*(_BYTE *)(a2 + 384) = 1;
*(_DWORD *)&v3->Length = 0x400000;
RtlUnicodeStringPrintf(
v3,
L"Timer(Component:Index): %d:%d",
*((unsigned __int8 *)a1 + 8),
*((unsigned __int8 *)a1 + 10));
return result;
}
return 3221225626i64;
}
v13 = PopIrTimerDescriptions[v11];
result = RtlStringCbLengthW(v13, 0xFFFFui64, &pcbLength);
if( (int)result < 0 )
return result;
if( *((_BYTE *)a1 + 8) == 3 )
{
result = RtlStringCbLengthW((const WCHAR *)a1 + 5, 0x80ui64, &v45);
if( (int)result < 0 )
return result;
v15 = pcbLength + v45 + 42;
}
else
{
v15 = pcbLength + 48;
}
if( v15 > v14 )
return 2147483653i64;
v16 = (wchar_t *)ExAllocatePoolWithTag(PagedPool, v15, 0x67696450ui64);
v3->Buffer = v16;
if( v16 )
{
*(_BYTE *)(a2 + 384) = 1;
v3->Length = 0;
v3->MaximumLength = v15;
if( *((_BYTE *)a1 + 8) == 3 )
RtlUnicodeStringPrintf(v3, L"Timer(Name:Index): %s:%s", v13, (char *)a1 + 10);
else
RtlUnicodeStringPrintf(v3, L"Timer(Name:Index): %s:%d", v13, *((unsigned __int8 *)a1 + 10));
return result;
}
}
else
{
if( (_DWORD)v2 != 5 )
return 3221225485i64;
v17 = *(_OWORD *)(a1 + 1);
v18 = (unsigned int *)(a2 + 408);
v19 = a1[3];
v50 = a2 + 408;
v48 = v17;
v49 = v19;
result = MmEnumerateSystemImages(
(__int64(__fastcall *)(PVOID *, __int64))PopIdleWakeSystemImageCallback,
(__int64)&v48);
if( (int)result < 0 )
return result;
v20 = 0i64;
v21 = 0;
if( *v18 )
{
v22 = (unsigned __int16 *)(v18 + 2);
do
{
if( v21 )
v20 += 4i64;
++v21;
v20 += *v22;
v22 += 8;
}
while( v21 < *v18 );
}
v23 = v20 + 24;
if( v23 > 0xFFFF )
return 2147483653i64;
v24 = (wchar_t *)ExAllocatePoolWithTag(PagedPool, v23, 0x67696450ui64);
v3->Buffer = v24;
if( v24 )
{
*(_BYTE *)(a2 + 384) = 1;
v3->Length = 0;
v3->MaximumLength = v23;
ppszDest = 0i64;
pcchDest = 0i64;
result = RtlUnicodeStringValidateDestWorker(v3, &ppszDest, &pcchDest, v25, v42, v43, (UINT64 *)pcbLength, v45);
if( (int)result >= 0 )
{
v26 = pcchDest;
v27 = L"Interrupt: ";
v28 = 0x7FFFi64;
result = 0i64;
v29 = 0;
if( !pcchDest )
goto LABEL_43;
v30 = (char *)ppszDest - (char *)L"Interrupt: ";
do
{
if( !v28 )
break;
if( !*v27 )
break;
*(const wchar_t *)((char *)v27 + v30) = *v27;
--v28;
++v27;
++v29;
--v26;
}
while( v26 );
if( !v26 && v28 && *v27 )
LABEL_43:
result = 2147483653i64;
v3->Length = 2 * v29;
}
for( i = 0; i < *v18; ++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) )
{
v35 = L", ";
v36 = MaximumLength >> 1;
v37 = Length >> 1;
v38 = 0x7FFFi64;
v39 = 0;
v40 = v36 - v37;
if( v40 )
{
v41 = (char *)Buffer + 2 * v37 - (_QWORD)L", ";
do
{
if( !v38 )
break;
if( !*v35 )
break;
*(const wchar_t *)((char *)v35 + (_QWORD)v41) = *v35;
--v38;
++v35;
++v39;
}
while( v38 + v40 - 0x7FFF );
}
v3->Length = 2 * (v39 + v37);
}
}
}
result = RtlUnicodeStringCat(v3, (const _UNICODE_STRING *)&v18[4 * i + 2]);
}
return result;
}
}
return 3221225626i64;
}
_mm_lfence();
v6 = PopDiagStaticWakeSourceDescriptions[v2];
result = 0i64;
*v3 = 0i64;
if( v6 )
{
v8 = 0x7FFFi64;
v9 = v6;
do
{
if( !*v9 )
break;
++v9;
--v8;
}
while( v8 );
result = v8 == 0 ? 0xC000000D : 0;
if( v8 )
{
if( v3 )
{
v10 = 2 * (v8 != 0 ? 0x7FFF - v8 : 0);
v3->Buffer = v6;
v3->Length = v10;
v3->MaximumLength = v10 + 2;
return result;
}
return 3221225485i64;
}
}
return result;
}Referenced by:
PopIdleWakeSourceAccountingToDiagnostic