IopDeleteFileObjectExtension

VOID __fastcall IopDeleteFileObjectExtension(_UNICODE_STRING *DestinationString, const WCHAR *pszSrc){
  _DWORD *v2; 
  __int64 i; 
  _QWORD *v5; 
  _QWORD *v6; 
  void *v7; 
  _QWORD *v8; 
  struct _DMA_ADAPTER *v9; 
  int v10; 
  _QWORD *v11; 
  UINT64 v12; 
  void *v13; 
  void *v14; 
  _QWORD *v15; 
  void *v16; 
  _BYTE *v17; 
  _QWORD *v18; 
  UINT8 v19; 
  UINT8 v20; 
  _QWORD *v21; 
  _QWORD *v22; 
  char v23; 
  v2 = *(_DWORD **)&DestinationString[13].Length;
  if( v2 == (_DWORD *)IopRevocationExtension )
    return;
  for( i = 0i64; i < 9; ++i )
  {
    v5 = *(_QWORD **)&v2[2 * i + 2];
    if( !v5 )
      continue;
    if( i == 4 )
    {
      v15 = (_QWORD *)*v5;
      while( v15 != v5 )
      {
        v16 = v15;
        v15 = (_QWORD *)*v15;
        ExFreePoolWithTag(v16, 0);
      }
      goto LABEL_22;
    }
    if( !i )
    {
      v14 = (void *)v5[1];
      if( v14 )
        ObDereferenceObjectDeferDelete(v14);
      goto LABEL_22;
    }
    if( i != 5 )
    {
      switch( i )
      {
        case 1i64:
          v6 = (_QWORD *)v5[2];
          while( v6 )
          {
            v7 = v6;
            v6 = (_QWORD *)*v6;
            ExFreePoolWithTag(v7, 0);
          }
          v8 = (_QWORD *)v5[3];
          while( v8 )
          {
            v17 = (_BYTE *)v8[3];
            v18 = v8;
            v8 = (_QWORD *)*v8;
            KeAcquireSpinLockRaiseToDpc(&qword_140C45BF0, (UINT64)pszSrc);
            v20 = v19;
            v23 = v17[18];
            if( v17[16] == 1 )
              v17[17] = 1;
            else
              ExFreePoolWithTag(v17, 0);
            KeReleaseSpinLock(&qword_140C45BF0, v20);
            if( *((_DWORD *)v18 + 4) )
            {
              PspAdjustKeepAliveCountProcess((void *)v18[1], -1, (__int64)DestinationString, v23);
              HalPutDmaAdapter((PADAPTER_OBJECT)v18[1]);
            }
            ExFreePoolWithTag(v18, 0);
          }
          v9 = (struct _DMA_ADAPTER *)v5[1];
          if( v9 )
            HalPutDmaAdapter(v9);
          break;
        case 6i64:
          ExFreeToNPagedLookasideList((NPAGED_LOOKASIDE_LIST *)IopOplockFoExtLookasideList, v5);
          continue;
        case 2i64:
          v21 = (_QWORD *)v5[5];
          if( v21 )
          {
            do
            {
              v22 = (_QWORD *)v21[5];
              ExFreePoolWithTag(v21, 0);
              v21 = v22;
            }
            while( v22 );
          }
          break;
        case 7i64:
          v10 = *((_DWORD *)v5 + 1);
          if( (v10 & 1) != 0 )
          {
            v13 = (void *)v5[1];
            *((_DWORD *)v5 + 1) = v10 & 0xFFFFFFFE;
            PsReleaseSiloHardReference(v13);
          }
          v11 = (_QWORD *)v5[1];
          v12 = 1884516169i64;
LABEL_29:
          ObfDereferenceObjectWithTag(v11, v12);
          break;
        case 8i64:
          v11 = (_QWORD *)*v5;
          v12 = 1866886985i64;
          goto LABEL_29;
      }
LABEL_22:
      ExFreePoolWithTag(*(PVOID *)&v2[2 * i + 2], 0);
      continue;
    }
    FsRtlFreeExtraCreateParameter(v5);
  }
  if( (*v2 & 2) != 0 )
    IopCleanupNotifications(*((DRIVER_OBJECT **)DestinationString->Buffer + 1), DestinationString);
  ExFreePoolWithTag(v2, 0);
}

Referenced by:

IopDeleteFile
IopParseDevice