PopFxUnregisterDevice

VOID __stdcall PopFxUnregisterDevice(_POP_FX_DEVICE *FxDevice){
  unsigned int v2; 
  unsigned int i; 
  unsigned int v4; 
  INT64 v5; 
  REGHANDLE v6; 
  unsigned int j; 
  _XSTATE_CONFIGURATION *v8; 
  UINT64 v9; 
  __int64 v10; 
  UINT16 *v11; 
  int v12; 
  int v13; 
  INT64 v14; 
  unsigned int v15; 
  __int64 v16; 
  int v17; 
  unsigned __int64 k; 
  int v19; 
  unsigned int v20; 
  int v21; 
  unsigned int v22; 
  int v23; 
  unsigned int v24; 
  __int64 v25; 
  INT64 v26; 
  _EVENT_DATA_DESCRIPTOR UserData; 
  _EVENT_DATA_DESCRIPTOR v28; 
  int *v29; 
  __int64 v30; 
  int *v31; 
  __int64 v32; 
  __int64 v33; 
  int v34[2]; 
  int *v35; 
  __int64 v36; 
  int *v37; 
  __int64 v38; 
  int *v39; 
  __int64 v40; 
  __int64 *v41; 
  __int64 v42; 

  if( (*((_DWORD *)FxDevice + 206) & 1) == 0 )
  {
    v2 = *((_DWORD *)FxDevice + 207);
    for( i = 0; i < v2; ++i )
    {
      PoFxActivateComponent((POHANDLE *)FxDevice, i, 2ui64);
      v2 = *((_DWORD *)FxDevice + 207);
    }
    v4 = 0;
    if( v2 )
    {
      do
        KeWaitForSingleObject(*(_QWORD *)(*((_QWORD *)FxDevice + 104) + 8i64 * v4++) + 104i64, 0, 0, 0, 0i64);
      while( v4 < *((_DWORD *)FxDevice + 207) );
    }
  }
  v5 = *((_QWORD *)FxDevice + 6);
  if( v5 )
  {
    PopFxRemoveDevice((_EX_PUSH_LOCK *)FxDevice, FxDevice);
    v26 = v5;
    PopFxAddLogEntry(v5, 0, 2, 0i64);
    if( PopDiagHandleRegistered )
    {
      v6 = PopDiagHandle;
      if( EtwEventEnabled(PopDiagHandle, &POP_ETW_EVENT_DEVICE_UNREGISTRATION) )
      {
        *(_QWORD *)&UserData.Size = 8i64;
        UserData.Ptr = (unsigned __int64)&v26;
        EtwWrite(v6, &POP_ETW_EVENT_DEVICE_UNREGISTRATION, 0, 1u, &UserData);
      }
    }
    PopFxAssignDeviceToDevNode((_DEVICE_NODE *)v5, 0i64);
  }
  for( j = 0; j < *((_DWORD *)FxDevice + 207); ++j )
  {
    if( *(int *)(*(_QWORD *)(*((_QWORD *)FxDevice + 104) + 8i64 * j) + 96i64) > 0 )
      _InterlockedDecrement((_DWORD *)&stru_140C23628 + 990);
  }
  IoReleaseRemoveLockAndWaitEx((PIO_REMOVE_LOCK)((char *)FxDevice + 240), 0i64, 0x20u);
  PopPepUnregisterDevice(*((PVOID *)FxDevice + 7));
  v9 = *((_QWORD *)FxDevice + 8);
  if( v9 )
    PopPluginUnregisterDevice(v9, *((_QWORD *)FxDevice + 9));
  v10 = *((_QWORD *)FxDevice + 148);
  if( v10 )
  {
    v11 = *(UINT16 **)(v10 + 16);
    PopPlLockPowerPlane((INT64)v11, v8);
    v12 = *(_DWORD *)(v10 + 32);
    v20 = 0;
    v21 = 1;
    v13 = PopPlCalculateDevicePowerDraw((__int64)FxDevice, &v21, &v20, 0i64);
    *(_DWORD *)(v10 + 32) = v13;
    v15 = v13 - v12;
    if( *(&stru_140C00F40 + 1194) > 5u )
    {
      v23 = v13;
      v30 = 2i64;
      LOWORD(v19) = 1;
      v32 = 2i64;
      v29 = &v19;
      v34[1] = 0;
      v31 = v34;
      v33 = *((_QWORD *)FxDevice + 28);
      v34[0] = *((unsigned __int16 *)FxDevice + 108);
      v35 = (int *)&v22;
      v37 = &v23;
      v39 = (int *)&v24;
      v16 = *(_QWORD *)(v10 + 16);
      v22 = v15;
      v36 = 4i64;
      v38 = 4i64;
      v24 = v15;
      v40 = 4i64;
      v17 = *(_DWORD *)(v16 + 28);
      v41 = &v25;
      LODWORD(v25) = v15 + v17;
      v42 = 4i64;
      tlgWriteTransfer_EtwWriteTransfer(
        (__int64)&stru_140C00F40 + 4776,
        (unsigned __int8 *)byte_140029325,
        0i64,
        0i64,
        9u,
        &v28);
    }
    PopPlPublishSystemPowerChange(v11, v15, v14);
    for( k = 0i64;
          k < *((unsigned int *)FxDevice + 207);
          PopPlUnregisterComponent(*(_QWORD *)(*((_QWORD *)FxDevice + 104) + 8 * k++)) )
    {
      ;
    }
    *(_QWORD *)(v10 + 24) = 0i64;
    *((_QWORD *)FxDevice + 148) = 0i64;
    PopPlUnlockPowerPlane((INT64)v11);
  }
  if( v5 )
    KeSetEvent((PRKEVENT)(v5 + 96), 0, 0);
  if( (*((_DWORD *)FxDevice + 206) & 1) != 0 )
    PopFxDestroyDeviceDpm((_DEVICE_NODE *)v5, FxDevice);
}

Referenced by:

PoFxUnregisterDevice
PopFxUnregisterDeviceOrWait