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