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