VrpFindDiffHiveEntryForMountPointWithLock
_SINGLE_LIST_ENTRY *__fastcall VrpFindDiffHiveEntryForMountPointWithLock(_UNICODE_STRING *MountPoint){
_SINGLE_LIST_ENTRY *v1;
wchar_t *Buffer;
unsigned __int64 v3;
__int64 v5;
wchar_t *v6;
__int64 v7;
__int64 v8;
__int64 v9;
_UNICODE_STRING String2[2];
unsigned __int16 v12;
__int64 v13;
v1 = 0i64;
Buffer = MountPoint->Buffer;
v3 = (unsigned __int64)MountPoint->Length >> 1;
String2[0] = 0i64;
v5 = 314159i64;
v6 = &Buffer[v3];
while( Buffer < v6 )
{
v12 = (unsigned __int16)RtlUpcaseUnicodeChar(*Buffer++);
v5 = HIBYTE(v12) + 37 * ((unsigned __int8)v12 + 37 * v5);
}
v7 = -1i64 << (dword_140C47704 & 0x1F);
v8 = v5 & v7;
if( (unsigned int)dword_140C47704 >> 5 )
{
v13 = v5 & v7;
v9 = qword_140C47708
+ 8i64
* ((37
* (BYTE6(v13)
+ 37
* (BYTE5(v13)
+ 37
* (BYTE4(v13)
+ 37 * (BYTE3(v13) + 37 * (BYTE2(v13) + 37 * (BYTE1(v13) + 37 * ((unsigned __int8)v8 + 11623883)))))))
+ HIBYTE(v13)) & (((unsigned int)dword_140C47704 >> 5) - 1));
while( 1 )
{
v9 = *(_QWORD *)v9;
if( (v9 & 1) != 0 )
break;
if( v8 == (v7 & *(_QWORD *)(v9 + 8)) )
goto LABEL_8;
}
while( 1 )
{
v9 = 0i64;
LABEL_8:
if( !v9 )
break;
String2[0].Buffer = (wchar_t *)(v9 + 68);
String2[0].Length = *(_WORD *)(v9 + 64);
String2[0].MaximumLength = String2[0].Length;
if( (unsigned __int8)RtlEqualUnicodeString(MountPoint, String2, 1u) )
return(_SINGLE_LIST_ENTRY *)v9;
while( 1 )
{
v9 = *(_QWORD *)v9;
if( (v9 & 1) != 0 )
break;
if( (v5 & v7) == (v7 & *(_QWORD *)(v9 + 8)) )
goto LABEL_8;
}
}
}
return v1;
}Referenced by:
VrpFindOrCreateDiffHiveEntryForMountPoint
VrpUnloadDifferencingHive