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