VrpFindOrCreateDiffHiveEntryForMountPoint

NTSTATUS __stdcall VrpFindOrCreateDiffHiveEntryForMountPoint(PCUNICODE_STRING String1){
  _UNICODE_STRING *v1; 
  _SINGLE_LIST_ENTRY **v2; 
  _ETHREAD *CurrentThread; 
  NTSTATUS v4; 
  _SINGLE_LIST_ENTRY **v5; 
  _UNICODE_STRING *v6; 
  _VRP_DIFF_HIVE_HASH_ENTRY *DiffHiveEntry; 
  _SINGLE_LIST_ENTRY *DiffHiveEntryForMountPointWithLock; 
  _SINGLE_LIST_ENTRY *v10; 
  _ETHREAD *v11; 
  __int64 v12; 
  __int64 v13; 
  __int64 v15; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v4 = 0;
  v5 = v2;
  v6 = v1;
  DiffHiveEntry = 0i64;
  --CurrentThread->Tcb.KernelApcDisable;
  ExAcquirePushLockSharedEx(&gLoadedDiffHivesLock, 0i64);
  DiffHiveEntryForMountPointWithLock = VrpFindDiffHiveEntryForMountPointWithLock((_UNICODE_STRING *)String1);
  if( DiffHiveEntryForMountPointWithLock )
    goto LABEL_8;
  ExReleasePushLockEx((ULONG_PTR)&gLoadedDiffHivesLock, 0);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  DiffHiveEntry = VrpAllocateDiffHiveEntry((_UNICODE_STRING *)String1, v6);
  v10 = (_SINGLE_LIST_ENTRY *)DiffHiveEntry;
  if( !DiffHiveEntry )
    return -1073741670;
  v11 = (_ETHREAD *)KeGetCurrentThread();
  --v11->Tcb.KernelApcDisable;
  ExAcquirePushLockExclusiveEx(&gLoadedDiffHivesLock, 0i64);
  DiffHiveEntryForMountPointWithLock = VrpFindDiffHiveEntryForMountPointWithLock((_UNICODE_STRING *)String1);
  if( DiffHiveEntryForMountPointWithLock )
  {
LABEL_8:
    if( _InterlockedIncrement64((volatile signed __int64 *)&DiffHiveEntryForMountPointWithLock[2]) <= 1 )
      __fastfail(0xEu);
  }
  else
  {
    DiffHiveEntry = 0i64;
    v15 = (__int64)v10[1].Next & (-1i64 << (dword_140C47704 & 0x1F));
    v12 = qword_140C47708;
    v13 = (37
         * (BYTE6(v15)
          + 37
          * (BYTE5(v15)
           + 37
           * (BYTE4(v15)
            + 37 * (BYTE3(v15) + 37 * (BYTE2(v15) + 37 * (BYTE1(v15) + 37 * ((unsigned __int8)v15 + 11623883)))))))
         + HIBYTE(v15)) & (((unsigned int)dword_140C47704 >> 5) - 1);
    v10->Next = *(_SINGLE_LIST_ENTRY **)(qword_140C47708 + 8 * v13);
    *(_QWORD *)(v12 + 8 * v13) = v10;
    DiffHiveEntryForMountPointWithLock = v10;
    ++gLoadedDiffHives;
  }
  *v5 = DiffHiveEntryForMountPointWithLock;
  ExReleasePushLockEx((ULONG_PTR)&gLoadedDiffHivesLock, 0);
  KeLeaveCriticalRegionThread(KeGetCurrentThread());
  if( DiffHiveEntry )
    ExFreePoolWithTag(DiffHiveEntry, 0x67655256u);
  return v4;
}

Referenced by:

VrpLoadDifferencingHive