PopFxAcpiPrepareDevice

INT64 __fastcall PopFxAcpiPrepareDevice(UNICODE_STRING *a1, UINT64 a2, VOID ***a3, BYTE *a4){
  int AcpiDeviceByUniqueId; 
  _ETHREAD *CurrentThread; 
  VOID **v9; 
  ULONG_PTR i; 
  AcpiDeviceByUniqueId = PopFxFindAcpiDeviceByUniqueId(a1, 0i64);
  if( AcpiDeviceByUniqueId < 0 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    v9 = 0i64;
    --*((_WORD *)CurrentThread + 242);
    ExAcquirePushLockSharedEx((UINT64)&PopFxPluginLock, 0i64);
    for( i = PopFxPluginList; (ULONG_PTR *)i != &PopFxPluginList; i = *(_QWORD *)i )
    {
      if( *(_DWORD *)(i + 16) >= 3u
        && *(_QWORD *)(i + 112)
        && (unsigned __int8)PopPluginAcpiNotificationStrict(i, 1ui64, a2)
        && *(_BYTE *)(a2 + 12) )
      {
        v9 = (VOID **)i;
        break;
      }
    }
    if( _InterlockedCompareExchange64((volatile signed __int64 *)&PopFxPluginLock, 0i64, 17i64) != 17 )
      ExfReleasePushLockShared((INT64 *)&PopFxPluginLock);
    KeAbPostRelease(&PopFxPluginLock);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
    if( v9 )
    {
      *a3 = v9;
      AcpiDeviceByUniqueId = 0;
      *a4 = 1;
    }
  }
  else
  {
    return(unsigned int)-1073741823;
  }
  return(unsigned int)AcpiDeviceByUniqueId;
}

Referenced by:

PopFxAcpiDispatchNotification