PopDirectedDripsUmMarkTestDevices

VOID __stdcall PopDirectedDripsUmMarkTestDevices(){
  signed __int32 v0; 
  signed __int32 v1; 
  _ETHREAD *CurrentThread; 
  INT64 v3; 
  INT64 v4; 
  _QWORD *v5; 
  _QWORD *i; 
  __int64 v7; 
  _QWORD *v8; 
  INT64 v9; 
  INT64 v10; 
  int Buffer[2]; 
  __int64 v12; 
  INT64 v13; 
  _m_prefetchw(&PopDirectedDripsUmTestDeviceCount);
  v0 = PopDirectedDripsUmTestDeviceCount;
  do
  {
    v1 = v0;
    v0 = _InterlockedCompareExchange(&PopDirectedDripsUmTestDeviceCount, v0, v0);
  }
  while( v1 != v0 );
  if( v0 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 242);
    ExAcquirePushLockSharedEx((UINT64)&PopDirectedDripsUmLock, 0i64);
    v13 = PopWnfCsEnterScenarioId;
    PopDirectedDripsNotify(PopDirectedDripsUmTestPermissive != 0 ? 4 : 2, &v13, v3, v4);
    IoLockUnlockPnpDeviceTree(1);
    v5 = IopRootDeviceNode;
    for( i = (_QWORD *)*((_QWORD *)IopRootDeviceNode + 1); i; i = (_QWORD *)i[1] )
      v5 = i;
    while( v5 != IopRootDeviceNode )
    {
      if( v5[10] )
      {
        Buffer[1] = *((unsigned __int16 *)v5 + 20) >> 1;
        v12 = v5[6];
        Buffer[0] = 1;
        LODWORD(v7) = RtlLookupElementGenericTableAvl(&PopDirectedDripsUmTestDeviceTable, Buffer);
        if( v7 )
          PopDirectedDripsMarkCandidateDevice(v5[10]);
      }
      v8 = (_QWORD *)*v5;
      if( *v5 )
      {
        do
        {
          v5 = v8;
          v8 = (_QWORD *)v8[1];
        }
        while( v8 );
      }
      else
      {
        v5 = (_QWORD *)v5[2];
      }
    }
    IoLockUnlockPnpDeviceTree(0);
    PopDirectedDripsNotify(PopDirectedDripsUmTestPermissive != 0 ? 5 : 3, &v13, v9, v10);
    PopReleaseRwLock((UINT64)&PopDirectedDripsUmLock);
  }
}

Referenced by:

PopDirectedDripsIdleResiliencyCallback