PopDiagTracePowerRequestCreate

VOID __fastcall PopDiagTracePowerRequestCreate(CHAR a1, INT64 a2, EVENT_DESCRIPTOR *a3){
  EVENT_DESCRIPTOR *v5; 
  int *v6; 
  _DWORD *PoolWithTag; 
  _DWORD *v8; 
  WCHAR v9; 
  __int64 v10; 
  SIZE_T v11; 
  _WORD *v12; 
  __int64 v13; 
  unsigned __int16 v14; 
  wchar_t *v15; 
  INT64 v16; 
  int v17; 
  int v18; 
  bool v19; 
  int v20; 
  unsigned int v21; 
  unsigned __int16 v22; 
  unsigned __int16 v23; 
  __int64 v24; 
  EVENT_DESCRIPTOR *v25; 
  __int64 v26; 
  unsigned int v27; 
  __int64 v28; 
  __int64 v29; 
  __int64 v30; 
  __int64 v31; 
  UINT64 v32; 
  __int64 v33; 
  __int64 v34; 
  wchar_t *v35; 
  __int64 v36; 
  _WORD *v37; 
  __int64 v38; 
  wchar_t *v39; 
  unsigned __int16 v40; 
  __int16 v41; 
  int v42; 
  int v43; 
  int v44; 
  int v45; 
  int SessionId; 
  int v47; 
  int v48; 
  int v49; 
  int v50; 
  int v51; 
  INT64 v52; 
  SIZE_T NumberOfBytes[2]; 
  struct _UNICODE_STRING DestinationString; 
  EVENT_DATA_DESCRIPTOR UserData; 
  int *v56; 
  __int64 v57; 
  int *v58; 
  __int64 v59; 
  int *p_SessionId; 
  __int64 v61; 
  int *v62; 
  __int64 v63; 
  int *v64; 
  __int64 v65; 
  int *v66; 
  __int64 v67; 
  int *v68; 
  __int64 v69; 
  INT64 v70; 
  __int64 v71; 
  INT64 v72; 
  __int64 v73; 
  INT64 v74; 
  __int64 v75; 
  __int16 *v76; 
  __int64 v77; 
  __int16 *v78; 
  __int64 v79; 
  SIZE_T v80; 
  int v81; 
  int v82; 
  wchar_t pszDest[24]; 
  v52 = a2;
  v40 = 0;
  v41 = 0;
  DestinationString = 0i64;
  if( PopDiagHandleRegistered )
  {
    v5 = (EVENT_DESCRIPTOR *)&POP_ETW_EVENT_CREATE_POWER_REQUEST;
    if( a1 )
      v5 = (EVENT_DESCRIPTOR *)POP_ETW_EVENT_POWER_REQUEST_RUNDOWN;
    if( EtwEventEnabled(PopDiagHandle, v5, a3) )
    {
      v6 = *(int **)(a2 + 80);
      NumberOfBytes[0] = 0i64;
      v42 = *v6;
      v45 = 0;
      SessionId = 0;
      v43 = 0;
      v47 = 0;
      v48 = 0;
      v49 = 0;
      v44 = 0;
      v51 = 0;
      v50 = 0;
      PoStoreRequester(*(_QWORD *)(a2 + 80), 0i64, NumberOfBytes, 0);
      PoolWithTag = ExAllocatePoolWithTag(PagedPool, NumberOfBytes[0], 0x50455654ui64);
      v8 = PoolWithTag;
      if( PoolWithTag )
      {
        if( (int)PoStoreRequester(*(_QWORD *)(v52 + 80), (INT64)PoolWithTag, NumberOfBytes, 0) >= 0 )
        {
          if( v42 )
          {
            v45 = v8[6];
            SessionId = MmGetSessionIdEx(*(_QWORD *)(*(_QWORD *)(v52 + 80) + 8i64));
            v10 = *((_QWORD *)v8 + 2);
            *(_OWORD *)NumberOfBytes = 0i64;
            v11 = (SIZE_T)v8 + v10;
            if( !v11 )
              goto LABEL_54;
            v12 = (_WORD *)v11;
            v13 = 0x7FFFi64;
            do
            {
              if( !*v12 )
                break;
              ++v12;
              --v13;
            }
            while( v13 );
            if( v13 )
            {
              v14 = 2 * (v13 != 0 ? 0x7FFF - v13 : 0);
            }
            else
            {
LABEL_54:
              v11 = NumberOfBytes[1];
              v14 = NumberOfBytes[0];
            }
            if( v42 == 2 )
            {
              RtlStringCbPrintfW(pszDest, 0x2Cui64, (WCHAR *)L"%d");
              v15 = pszDest;
            }
            else
            {
              v15 = 0i64;
            }
            RtlInitUnicodeString(&DestinationString, v15, v9);
          }
          else
          {
            v34 = *((_QWORD *)v8 + 2);
            v35 = (wchar_t *)((char *)v8 + *((_QWORD *)v8 + 3));
            *(_OWORD *)NumberOfBytes = 0i64;
            v11 = (SIZE_T)v8 + v34;
            if( !v11 )
              goto LABEL_53;
            v36 = 0x7FFFi64;
            v37 = (_WORD *)v11;
            do
            {
              if( !*v37 )
                break;
              ++v37;
              --v36;
            }
            while( v36 );
            if( v36 )
            {
              v14 = 2 * (v36 != 0 ? 0x7FFF - v36 : 0);
            }
            else
            {
LABEL_53:
              v11 = NumberOfBytes[1];
              v14 = NumberOfBytes[0];
            }
            if( v35 )
            {
              v38 = 0x7FFFi64;
              v39 = v35;
              do
              {
                if( !*v39 )
                  break;
                ++v39;
                --v38;
              }
              while( v38 );
              if( v38 )
              {
                DestinationString.Buffer = v35;
                DestinationString.Length = 2 * (v38 != 0 ? 0x7FFF - v38 : 0);
              }
            }
          }
          v16 = v52;
          v17 = v43;
          if( !*(_QWORD *)(v52 + 80) )
            v17 = 1;
          v43 = v17;
          v18 = *(_DWORD *)(v52 + 20);
          if( (v18 & 2) != 0 )
          {
            v47 = 1;
            v18 = *(_DWORD *)(v52 + 20);
          }
          if( (v18 & 1) != 0 )
          {
            v48 = 1;
            v18 = *(_DWORD *)(v52 + 20);
          }
          if( (v18 & 4) != 0 )
          {
            v49 = 1;
            v18 = *(_DWORD *)(v52 + 20);
          }
          if( (v18 & 8) != 0 )
          {
            v50 = 1;
            v18 = *(_DWORD *)(v52 + 20);
          }
          if( (v18 & 0x10) != 0 )
          {
            v51 = 1;
            v18 = *(_DWORD *)(v52 + 20);
          }
          v19 = (v18 & 0x20) == 0;
          v20 = v44;
          v21 = 13;
          if( !v19 )
            v20 = 1;
          *(_QWORD *)&UserData.Size = 8i64;
          v44 = v20;
          UserData.Ptr = (unsigned __int64)&v52;
          v56 = &v42;
          v58 = &v45;
          p_SessionId = &SessionId;
          v62 = &v43;
          v64 = &v47;
          v66 = &v48;
          v68 = &v49;
          v70 = v52 + 36;
          v72 = v52 + 32;
          v74 = v52 + 40;
          v22 = v14 >> 1;
          v23 = DestinationString.Length >> 1;
          v76 = (__int16 *)&v40;
          v78 = &v41;
          v40 = v22;
          v41 = DestinationString.Length >> 1;
          v57 = 4i64;
          v59 = 4i64;
          v61 = 4i64;
          v63 = 4i64;
          v65 = 4i64;
          v67 = 4i64;
          v69 = 4i64;
          v71 = 4i64;
          v73 = 4i64;
          v75 = 4i64;
          v77 = 2i64;
          v79 = 2i64;
          if( v22 )
          {
            v21 = 14;
            v80 = v11;
            v81 = 2 * v22;
            v82 = 0;
          }
          if( v23 )
          {
            v33 = 2i64 * v21;
            *(&UserData.Ptr + v33) = (unsigned __int64)DestinationString.Buffer;
            *(&UserData.Reserved + 2 * v33) = 0;
            *(&UserData.Size + 2 * v33) = 2 * v23;
            ++v21;
          }
          v24 = 2i64 * v21;
          v25 = (EVENT_DESCRIPTOR *)POP_ETW_EVENT_POWER_REQUEST_RUNDOWN;
          *(&UserData.Ptr + v24) = (unsigned __int64)&v50;
          *((_QWORD *)&UserData.Size + v24) = 4i64;
          v26 = v21 + 1;
          v27 = v21 + 2;
          v26 *= 2i64;
          *(&UserData.Ptr + v26) = (unsigned __int64)&v51;
          *((_QWORD *)&UserData.Size + v26) = 4i64;
          v28 = 2i64 * v27;
          *(&UserData.Ptr + v28) = (unsigned __int64)&v44;
          *((_QWORD *)&UserData.Size + v28) = 4i64;
          v29 = v27 + 1;
          v27 += 2;
          v29 *= 2i64;
          *(&UserData.Ptr + v29) = v16 + 44;
          *((_QWORD *)&UserData.Size + v29) = 4i64;
          v30 = 2i64 * v27;
          *(&UserData.Ptr + v30) = v16 + 48;
          *((_QWORD *)&UserData.Size + v30) = 4i64;
          v31 = v27 + 1;
          v32 = v27 + 2;
          v31 *= 2i64;
          *(&UserData.Ptr + v31) = v16 + 52;
          *((_QWORD *)&UserData.Size + v31) = 4i64;
          if( !a1 )
            v25 = (EVENT_DESCRIPTOR *)&POP_ETW_EVENT_CREATE_POWER_REQUEST;
          EtwWrite(PopDiagHandle, v25, 0i64, v32, &UserData);
        }
        ExFreePoolWithTag(v8, 0x50455654u);
      }
    }
  }
}

Referenced by:

PopCreateKernelPowerRequest
PopCreateUserPowerRequest
PopDiagTraceControlCallback