FsRtlFindInTunnelCacheEx

BOOL __stdcall FsRtlFindInTunnelCacheEx(
        TUNNEL *Cache,
        ULONGLONG DirectoryKey,
        UNICODE_STRING *Name,
        UNICODE_STRING *ShortName,
        UNICODE_STRING *LongName,
        UINT32 Flags,
        UINT32 *DataLength,
        PVOID Data){
  BOOL result; 
  TUNNEL *v11; 
  char v12; 
  __int64 v13; 
  UNICODE_STRING *v14; 
  __int64 v15; 
  int v16; 
  UNICODE_STRING *v17; 
  unsigned __int16 *v18; 
  wchar_t *PoolWithTag; 
  unsigned __int16 v20; 
  _LIST_ENTRY FreePoolList; 
  v11 = Cache;
  v12 = 0;
  v13 = 0i64;
  if( TunnelMaxEntries )
  {
    FreePoolList.Blink = &FreePoolList;
    FreePoolList.Flink = &FreePoolList;
    ExAcquireFastMutex(&Cache->Mutex);
    FsRtlPruneTunnelCache(v11, &FreePoolList);
    v15 = (__int64)v11->Cache;
    if( v15 )
    {
      do
      {
        v13 = v15;
        v16 = FsRtlCompareNodeAndKey(v15, DirectoryKey, Name, Flags & 1);
        if( v16 > 0 )
        {
          v15 = *(_QWORD *)(v15 + 8);
        }
        else
        {
          if( v16 >= 0 )
            break;
          v15 = *(_QWORD *)(v15 + 16);
        }
      }
      while( v15 );
      v11 = Cache;
    }
    if( v15 )
    {
      RtlCopyUnicodeString(ShortName, (UNICODE_STRING *)(v13 + 80), v14);
      v18 = (unsigned __int16 *)(v13 + 64);
      if( LongName->MaximumLength < *(_WORD *)(v13 + 64) )
      {
        PoolWithTag = (wchar_t *)ExAllocatePoolWithTag((_POOL_TYPE)17, *(unsigned __int16 *)(v13 + 64), 0x346E7554ui64);
        LongName->Buffer = PoolWithTag;
        v20 = *v18;
        LongName->MaximumLength = *v18;
        LongName->Length = v20;
        memmove((UINT8 *)PoolWithTag, *(UINT8 **)(v13 + 72), *v18);
      }
      else
      {
        RtlCopyUnicodeString(LongName, (UNICODE_STRING *)(v13 + 64), v17);
      }
      memmove((UINT8 *)Data, *(UINT8 **)(v13 + 96), *(unsigned int *)(v13 + 104));
      *DataLength = *(_DWORD *)(v13 + 104);
      v12 = 1;
    }
    KeReleaseGuardedMutex(&v11->Mutex);
    FsRtlEmptyFreePoolList(&FreePoolList);
    LOBYTE(result) = v12;
  }
  else
  {
    LOBYTE(result) = 0;
  }
  return result;
}

Referenced by:

FsRtlFindInTunnelCache