PnpShutdownDevices

__int64 PnpShutdownDevices(){
  unsigned int v0; 
  volatile signed __int32 *DeviceEventEntry; 
  _DEVICE_NODE *v3; 
  _ETHREAD *CurrentThread; 
  unsigned int UserFlags; 
  _DEVICE_NODE *Sibling; 
  PVOID P; 
  __int64 v8; 
  __int64 v9; 
  char *v10; 
  char v11; 

  P = 0i64;
  HIDWORD(v9) = 0;
  LODWORD(v8) = 0;
  KeSetEvent((PRKEVENT)((char *)&PnpReplaceEvent + 6656), 0, 0);
  v0 = 0;
  if( !*(&stru_140C452E0 + 560) && (*(&stru_140C23628 + 2336) & 0x20) == 0 )
    return v0;
  DeviceEventEntry = (volatile signed __int32 *)PnpCreateDeviceEventEntry(0x189u);
  if( !DeviceEventEntry )
    return 3221225626i64;
  KeWaitForSingleObject((UINT64)&PnpReplaceEvent + 32, 0, 0, 0, 0i64);
  KeWaitForSingleObject((UINT64)&PnpReplaceEvent + 352, 0, 0, 0, 0i64);
  v3 = (_DEVICE_NODE *)*(&PnpReplaceEvent + 831);
  v10 = &v11;
  LODWORD(v9) = 10485760;
  PipSetDevNodeUserFlags(*(&PnpReplaceEvent + 831), 0x10ui64);
  while( 2 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.KernelApcDisable;
    ExAcquireResourceSharedLite((UINT64)&PnpReplaceEvent + 6688, 1);
    v3 = v3->Child;
    while( v3 )
    {
      UserFlags = v3->UserFlags;
      if( (UserFlags & 0x20) != 0 )
      {
        if( v3 == (_DEVICE_NODE *)*(&PnpReplaceEvent + 831) )
        {
          v3 = 0i64;
          break;
        }
LABEL_17:
        Sibling = v3->Sibling;
        if( v3->Sibling )
          goto LABEL_19;
        v3 = v3->Parent;
        PipSetDevNodeUserFlags(v3, 0x20ui64);
      }
      else
      {
        if( (UserFlags & 0x10) == 0 )
          break;
        Sibling = v3->Child;
        if( !Sibling )
        {
          PipSetDevNodeUserFlags(v3, 0x20ui64);
          goto LABEL_17;
        }
LABEL_19:
        v3 = Sibling;
      }
    }
    ExReleaseResourceLite((PERESOURCE)((char *)&PnpReplaceEvent + 6688));
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
    if( v3 )
    {
      PnpInitializeTargetDeviceRemoveEvent(
        (VOID *)DeviceEventEntry,
        0x189u,
        v3->PhysicalDeviceObject,
        0,
        1,
        0,
        0,
        46,
        0,
        0i64,
        0i64,
        (__int64)&v8,
        (__int64)&v9);
      P = (PVOID)DeviceEventEntry;
      v0 = PnpProcessQueryRemoveAndEject((const VOID **)&P);
      if( P != DeviceEventEntry && _InterlockedExchangeAdd((volatile signed __int32 *)P + 16, 0xFFFFFFFF) == 1 )
        ExFreePoolWithTag(P, 0x4B706E50u);
      continue;
    }
    break;
  }
  if( _InterlockedExchangeAdd(DeviceEventEntry + 16, 0xFFFFFFFF) == 1 )
    ExFreePoolWithTag((PVOID)DeviceEventEntry, 0x4B706E50u);
  return v0;
}

Referenced by:

IoShutdownSystem