IopUncacheInterfaceInformation

VOID __stdcall IopUncacheInterfaceInformation(PDEVICE_OBJECT DeviceObject, LOGICAL AcquireLock){
  _ETHREAD *CurrentThread; 
  _QWORD *DeviceNode; 
  _QWORD *v6; 
  _QWORD *v7; 
  _QWORD *v8; 
  _QWORD *v9; 
  __int64 v10; 
  void *v11; 
  __int64 v12; 
  void *v13; 

  if( AcquireLock )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.KernelApcDisable;
    KeWaitForSingleObject((UINT64)&PnpReplaceEvent + 6016, 4, 0, 0, 0i64);
  }
  if( DeviceObject )
    DeviceNode = DeviceObject->DeviceObjectExtension->DeviceNode;
  else
    DeviceNode = 0i64;
  v6 = DeviceNode + 61;
  v7 = (_QWORD *)DeviceNode[61];
  while( v7 != v6 )
  {
    v10 = v7[3];
    v11 = v7;
    if( v10 )
    {
      (*(void(__fastcall **)(_QWORD))(v10 + 24))(*(_QWORD *)(v10 + 8));
      ExFreePoolWithTag((PVOID)v10, 0);
    }
    v7 = (_QWORD *)*v7;
    ExFreePoolWithTag(v11, 0);
  }
  v8 = DeviceNode + 63;
  v9 = (_QWORD *)DeviceNode[63];
  while( v9 != v8 )
  {
    v12 = v9[3];
    v13 = v9;
    if( v12 )
    {
      (*(void(__fastcall **)(_QWORD))(v12 + 24))(*(_QWORD *)(v12 + 8));
      ExFreePoolWithTag((PVOID)v12, 0);
    }
    v9 = (_QWORD *)*v9;
    ExFreePoolWithTag(v13, 0);
  }
  DeviceNode[62] = DeviceNode + 61;
  *v6 = v6;
  DeviceNode[64] = DeviceNode + 63;
  *v8 = v8;
  DeviceNode[65] = 0i64;
  if( AcquireLock )
  {
    KeReleaseSemaphore((_KSEMAPHORE *)&PnpReplaceEvent + 188, 0i64, 1i64, 0);
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
  }
}

Referenced by:

IopDestroyDeviceNode
IopRemoveDevice
PipProcessStartPhase1