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