CmpFindSubkeyInHashByChildCell
__int64 __fastcall CmpFindSubkeyInHashByChildCell(
unsigned __int64 a1,
unsigned __int64 a2,
__int64 a3,
unsigned int a4,
unsigned __int64 *a5){
int v5;
unsigned __int64 *v7;
unsigned __int64 v9;
__int64 v10;
__int64 v12;
INT64 v13;
int v14;
int v15;
unsigned int v16;
__int64 v17;
_CM_KEY_CONTROL_BLOCK *v18;
_CM_KEY_CONTROL_BLOCK *v19;
_CM_KEY_CONTROL_BLOCK *v21;
INT64 *v22;
_UNICODE_STRING Component;
int v24;
int v25;
__int64 v26;
v5 = *(_DWORD *)(a1 + 16);
*(_DWORD *)(&Component.MaximumLength + 1) = 0;
v7 = a5;
v24 = -1;
v9 = a1;
v25 = 0;
v10 = *(_QWORD *)(a3 + 1640);
*a5 = 0i64;
v26 = v10;
v12 = (*(__int64(__fastcall **)(__int64, _QWORD, int *))(a3 + 8))(a3, a4, &v24);
if( !v12 )
return 3221225626i64;
v13 = *(unsigned __int16 *)(v12 + 72);
v14 = 37 * v5;
if( (*(_BYTE *)(v12 + 2) & 0x20) != 0 )
{
v15 = CmpHashCompressedComponent((UINT8 *)(v12 + 76), v13);
}
else
{
Component.Buffer = (wchar_t *)(v12 + 76);
Component.Length = v13;
Component.MaximumLength = v13;
v15 = CmpHashUnicodeComponent(&Component);
}
v16 = v14 + v15;
(*(void(__fastcall **)(__int64, int *))(a3 + 16))(a3, &v24);
CmpUnlockTwoKcbs((_CM_KEY_CONTROL_BLOCK *)v9, (_CM_KEY_CONTROL_BLOCK *)a2);
v22 = (INT64 *)(v9 + 32);
CmpLockHashEntryShared(*(_QWORD *)(v9 + 32), v16);
CmpLockTwoKcbsShared((_CM_KEY_CONTROL_BLOCK *)v9, (_CM_KEY_CONTROL_BLOCK *)a2);
v17 = *(_QWORD *)(v26
+ 24
* ((unsigned int)(*(_DWORD *)(a3 + 1648) - 1) & ((101027 * (v16 ^ (v16 >> 9))) ^ ((unsigned __int64)(101027 * (v16 ^ (v16 >> 9))) >> 9)))
+ 16);
if( v17 )
{
LOBYTE(a5) = 0;
while( v16 != *(_DWORD *)v17 || a4 != *(_DWORD *)(v17 + 24) || a3 != *(_QWORD *)(v17 + 16) )
{
v17 = *(_QWORD *)(v17 + 8);
if( !v17 )
goto LABEL_13;
}
v18 = (_CM_KEY_CONTROL_BLOCK *)(v17 - 16);
if( CmpIsKcbLockAllowed(v9, (UINT64)v18, &a5) )
{
if( !a2 || CmpIsKcbLockAllowed(a2, (UINT64)v18, &a5) )
{
v9 = (unsigned __int64)v18;
}
else
{
CmpUnlockKcb(v21);
ExAcquirePushLockSharedEx(&v18->KcbPushlock, 0i64);
_InterlockedIncrement((volatile signed __int32 *)&v18->56);
v9 = a2;
}
}
else
{
CmpUnlockKcb(v19);
ExAcquirePushLockSharedEx(&v18->KcbPushlock, 0i64);
_InterlockedIncrement((volatile signed __int32 *)&v18->56);
}
ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)(v9 + 48), 0i64);
_InterlockedIncrement((volatile signed __int32 *)(v9 + 56));
CmpReferenceKeyControlBlock(v18);
*v7 = (unsigned __int64)v18;
CmpUnlockKcb(v18);
}
LABEL_13:
CmpUnlockHashEntry(*v22, v16);
return 0i64;
}Referenced by:
CmpFindSubKeyByNumberEx