IopUncacheInterfaceInformation

VOID __stdcall IopUncacheInterfaceInformation(_DEVICE_OBJECT *DeviceObject, UINT64 AcquireLock){
  int v2; 
  _ETHREAD *CurrentThread; 
  _QWORD *v5; 
  _QWORD *v6; 
  _QWORD *v7; 
  _QWORD *v8; 
  _QWORD *v9; 
  __int64 v10; 
  void *v11; 
  __int64 v12; 
  void *v13; 
  v2 = AcquireLock;
  if( (_DWORD)AcquireLock )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 242);
    KeWaitForSingleObject(&PpRegistrySemaphore, DelayExecution, 0, 0, 0i64);
  }
  if( DeviceObject )
    v5 = *(_QWORD **)(*((_QWORD *)DeviceObject + 39) + 40i64);
  else
    v5 = 0i64;
  v6 = v5 + 61;
  v7 = (_QWORD *)v5[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 = v5 + 63;
  v9 = (_QWORD *)v5[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);
  }
  v5[62] = v5 + 61;
  *v6 = v6;
  v5[64] = v5 + 63;
  *v8 = v8;
  v5[65] = 0i64;
  if( v2 )
  {
    KeReleaseSemaphore(&PpRegistrySemaphore, 0i64, 1i64, 0);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  }
}

Referenced by:

IopDestroyDeviceNode
IopRemoveDevice
PipProcessStartPhase1