PopEtEnergyTrackerCreate

NTSTATUS __stdcall PopEtEnergyTrackerCreate(INT64 *a1, VOID **a2){
  UINT64 v2; 
  int v3; 
  bool v6; 
  int inserted; 
  char *v8; 
  _ADAPTER_OBJECT *v9; 
  UINT64 UnbiasedInterruptTime; 
  _POP_RW_LOCK *v11; 
  _POP_RW_LOCK *v12; 
  _ADAPTER_OBJECT **v13; 
  _EPROCESS *v14; 
  VOID *v15; 
  int v16; 
  PVOID v17; 
  VOID *Flags; 
  VOID *Flagsa; 
  UINT64 Flagsb; 
  UINT64 ObjectBodySize; 
  UINT64 PagedPoolCharge; 
  UINT64 NonPagedPoolCharge; 
  int CallBack[4]; 
  __int128 v26; 
  _OBJECT_ATTRIBUTES ObjectAttributes; 
  PVOID Object; 
  PVOID Handle; 

  v3 = *(_DWORD *)a1;
  Object = 0i64;
  Handle = 0i64;
  *(&ObjectAttributes.Length + 1) = 0;
  *(&ObjectAttributes.Attributes + 1) = 0;
  *(_OWORD *)CallBack = 0i64;
  v26 = 0i64;
  if( (unsigned int)(v3 - 1) > 0x3FFFF )
    *(_DWORD *)a1 = 0x40000;
  if( !PopEtGlobals )
    return -1073741637;
  ObjectAttributes.Length = 48;
  ObjectAttributes.RootDirectory = 0i64;
  v6 = KeGetCurrentThread()->PreviousMode != 0;
  ObjectAttributes.ObjectName = 0i64;
  *(_OWORD *)&ObjectAttributes.SecurityDescriptor = 0i64;
  ObjectAttributes.Attributes = v6 ? 0 : 0x200;
  LOBYTE(v2) = KeGetCurrentThread()->PreviousMode;
  LODWORD(NonPagedPoolCharge) = 0;
  LODWORD(PagedPoolCharge) = 0;
  LODWORD(ObjectBodySize) = 640;
  inserted = ObCreateObjectEx(
               0i64,
               *(_OBJECT_TYPE **)(PopEtGlobals + 32),
               &ObjectAttributes,
               v2,
               Flags,
               ObjectBodySize,
               PagedPoolCharge,
               NonPagedPoolCharge,
               &Object,
               0i64);
  if( inserted < 0 )
  {
    v9 = (_ADAPTER_OBJECT *)Object;
  }
  else
  {
    v8 = (char *)Object;
    memset(Object, 0i64, 0x280u);
    *((_OWORD *)v8 + 1) = 0i64;
    *((_QWORD *)v8 + 2) = 0i64;
    *((_QWORD *)v8 + 8) = 0i64;
    *((_QWORD *)v8 + 9) = 0i64;
    *((_QWORD *)v8 + 6) = 0i64;
    *((_QWORD *)v8 + 7) = 0i64;
    memset(v8 + 80, 0i64, 0x200u);
    *((_QWORD *)v8 + 12) = PopEtGlobals + 848;
    *((_QWORD *)v8 + 4) = *a1;
    *((_DWORD *)v8 + 10) = *((_DWORD *)a1 + 2);
    *((_DWORD *)v8 + 159) |= 1u;
    v9 = (_ADAPTER_OBJECT *)Object;
    *((_DWORD *)Object + 148) = (KUSER_SHARED_DATA.TickCountQuad * KUSER_SHARED_DATA.TickCountMultiplier) >> 24;
    UnbiasedInterruptTime = KiQueryUnbiasedInterruptTime(1u);
    v11 = (_POP_RW_LOCK *)(PopEtGlobals + 16);
    HIDWORD(v9->LowMemoryLogicalAddressQueueEntry.ListEntry.Flink) = UnbiasedInterruptTime / 0x2710;
    LODWORD(v9->LowMemoryLogicalAddressQueueEntry.ListEntry.Blink) = 1;
    PopAcquireRwLockExclusive(v11);
    v12 = (_POP_RW_LOCK *)PopEtGlobals;
    v13 = *(_ADAPTER_OBJECT ***)(PopEtGlobals + 8);
    if( *v13 != (_ADAPTER_OBJECT *)PopEtGlobals )
      __fastfail(3u);
    *(_QWORD *)&v9->AdapterObject.DmaHeader.Version = PopEtGlobals;
    v9->AdapterObject.DmaHeader.DmaOperations = (_DMA_OPERATIONS *)v13;
    *v13 = v9;
    v12->Thread = (_ETHREAD *)v9;
    PopReleaseRwLock(v12 + 1);
    *(_QWORD *)&CallBack[1] = 0i64;
    CallBack[3] = 0;
    CallBack[0] = 1;
    v26 = (unsigned __int64)v9;
    inserted = PsEnumProcesses((INT64)PopEtProcessEnumSnapshotCallback, (INT64 *)CallBack, v14, v15, Flagsa);
    if( inserted >= 0 )
    {
      PopAcquireRwLockExclusive((_POP_RW_LOCK *)v8 + 1);
      v16 = *((_DWORD *)&v9->LowMemoryLogicalAddressQueueEntry.EntryType + 1);
      if( !v16 )
        *((_DWORD *)v8 + 159) &= ~1u;
      PopReleaseRwLock((_POP_RW_LOCK *)v8 + 1);
      if( v16 )
      {
        inserted = -1073741670;
      }
      else
      {
        LODWORD(Flagsb) = 0;
        inserted = ObInsertObjectEx(v9, 0i64, 1ui64, 1ui64, Flagsb, 0i64, &Handle);
        if( inserted < 0 )
        {
          v17 = Handle;
          v9 = 0i64;
        }
        else
        {
          v17 = 0i64;
          *a2 = Handle;
          inserted = 0;
        }
        if( v17 )
          NtClose((UINT64)v17);
      }
    }
  }
  if( v9 )
    HalPutDmaAdapter(v9);
  return inserted;
}

Referenced by:

NtPowerInformation