VrpFindOrCreateDiffHiveEntryForMountPoint

NTSTATUS __stdcall VrpFindOrCreateDiffHiveEntryForMountPoint(PCUNICODE_STRING String1){
  const void **v1; 
  unsigned __int16 **v2; 
  _ETHREAD *CurrentThread; 
  NTSTATUS v4; 
  unsigned __int16 **v5; 
  const void **v6; 
  unsigned __int16 *DiffHiveEntry; 
  unsigned __int16 *v9; 
  unsigned __int16 *v10; 
  unsigned __int16 *v11; 
  _ETHREAD *v12; 
  unsigned __int16 *v13; 
  __int64 v14; 
  __int64 v15; 
  __int64 v17; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v4 = 0;
  v5 = v2;
  v6 = v1;
  DiffHiveEntry = 0i64;
  --*((_WORD *)CurrentThread + 242);
  ExAcquirePushLockSharedEx((UINT64)&gLoadedDiffHivesLock, 0i64);
  LODWORD(v9) = VrpFindDiffHiveEntryForMountPointWithLock(String1);
  v10 = v9;
  if( v9 )
    goto LABEL_8;
  ExReleasePushLockEx((UINT64)&gLoadedDiffHivesLock, 0i64);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  DiffHiveEntry = VrpAllocateDiffHiveEntry(&String1->Length, v6);
  v11 = DiffHiveEntry;
  if( !DiffHiveEntry )
    return -1073741670;
  v12 = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)v12 + 242);
  ExAcquirePushLockExclusiveEx((UINT64)&gLoadedDiffHivesLock, 0i64);
  LODWORD(v13) = VrpFindDiffHiveEntryForMountPointWithLock(String1);
  v10 = v13;
  if( v13 )
  {
LABEL_8:
    if( _InterlockedIncrement64((volatile signed __int64 *)v10 + 2) <= 1 )
      __fastfail(0xEu);
  }
  else
  {
    DiffHiveEntry = 0i64;
    v17 = *((_QWORD *)v11 + 1) & (-1i64 << (dword_140C47704 & 0x1F));
    v14 = qword_140C47708;
    v15 = (37
         * (BYTE6(v17)
          + 37
          * (BYTE5(v17)
           + 37
           * (BYTE4(v17)
            + 37 * (BYTE3(v17) + 37 * (BYTE2(v17) + 37 * (BYTE1(v17) + 37 * ((unsigned __int8)v17 + 11623883)))))))
         + HIBYTE(v17)) & (((unsigned int)dword_140C47704 >> 5) - 1);
    *(_QWORD *)v11 = *(_QWORD *)(qword_140C47708 + 8 * v15);
    *(_QWORD *)(v14 + 8 * v15) = v11;
    v10 = v11;
    ++gLoadedDiffHives;
  }
  *v5 = v10;
  ExReleasePushLockEx((UINT64)&gLoadedDiffHivesLock, 0i64);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  if( DiffHiveEntry )
    ExFreePoolWithTag(DiffHiveEntry, 0x67655256u);
  return v4;
}

Referenced by:

VrpLoadDifferencingHive