PnpCompleteDeviceEvent

void __fastcall PnpCompleteDeviceEvent(PVOID P, int a2){
  __int32 i; 
  __int64 v5; 
  __int64 v6; 
  int *v7; 
  void(__fastcall *v8)(_QWORD); 
  void *v9; 
  __int64 v10; 
  void *v11; 
  union _LARGE_INTEGER Interval; 
  Interval.QuadPart = -1000000i64;
  for( i = _InterlockedExchange((volatile __int32 *)P + 17, 1); i; i = _InterlockedExchange(
                                                                          (volatile __int32 *)P + 17,
                                                                          1) )
    KeDelayExecutionThread(0, 0, &Interval);
  v5 = *((_QWORD *)P + 10);
  if( v5 )
  {
    while( _InterlockedExchange((volatile __int32 *)(v5 + 68), 1) )
    {
      KeDelayExecutionThread(0, 0, &Interval);
      v5 = *((_QWORD *)P + 10);
    }
  }
  if( *((_BYTE *)P + 72) || (v6 = *((_QWORD *)P + 10)) != 0 && *(_BYTE *)(v6 + 72) )
  {
    v11 = (void *)*((_QWORD *)P + 6);
    if( v11 )
      ExFreePoolWithTag(v11, 0);
  }
  else
  {
    v7 = (int *)*((_QWORD *)P + 17);
    if( *((_QWORD *)P + 3) )
    {
      *v7 = a2;
      KeSetEvent(*((PRKEVENT *)P + 3), 0);
    }
    else if( v7 && *((_DWORD *)P + 32) == 1 )
    {
      *v7 = a2;
    }
    v8 = (void(__fastcall *)(_QWORD))*((_QWORD *)P + 4);
    if( v8 )
      v8(*((_QWORD *)P + 5));
  }
  v9 = (void *)*((_QWORD *)P + 19);
  if( v9 )
    ObfDereferenceObjectWithTag(v9, 0x56706E50ui64);
  v10 = *((_QWORD *)P + 10);
  if( v10 && _InterlockedExchangeAdd((volatile signed __int32 *)(v10 + 64), 0xFFFFFFFF) == 1 )
    ExFreePoolWithTag(*((PVOID *)P + 10), 0x4B706E50u);
  if( _InterlockedExchangeAdd((volatile signed __int32 *)P + 16, 0xFFFFFFFF) == 1 )
    ExFreePoolWithTag(P, 0x4B706E50u);
}

Referenced by:

PnpDeviceEventWorker
PnpProcessCompletedEject