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