CmpPerformSingleKcbCacheLookup
INT64 __fastcall CmpPerformSingleKcbCacheLookup(
volatile INT64 *BugCheckParameter2,
PVOID P,
UINT64 a3,
UINT64 a4,
INT64 a5,
INT64 a6,
INT64 a7,
INT64 a8){
unsigned int v8;
volatile INT64 *v10;
__int16 v11;
char v12;
signed __int64 v13;
unsigned int v14;
_UNICODE_STRING *v15;
int v16;
__int64 v17;
unsigned int v18;
signed __int32 v19;
signed __int32 v20;
__int64 v21;
__int64 v22;
__int64 v23;
UINT64 v24;
INT64 result;
__int64 v26;
__int64 v27;
unsigned __int8 *v28;
unsigned __int16 v29;
UINT16 *Buffer;
unsigned __int16 v31;
UINT16 v32;
int v33;
int v34;
signed __int64 v35;
signed __int64 v36;
unsigned int v37;
UINT64 v38;
_BYTE *v39;
_BYTE *v40;
unsigned __int8 CurrentIrql;
char v42;
__int64 v43;
_BYTE *v44;
_QWORD *v45;
unsigned __int64 OldIrql_low;
unsigned __int32 v47;
bool v48;
int v49[8];
char v50;
__int16 v51;
unsigned int v52;
unsigned int v53;
_UNICODE_STRING DestName;
volatile signed __int64 *v55;
unsigned int v56;
v56 = a4;
v55 = BugCheckParameter2;
v8 = a3;
v10 = BugCheckParameter2;
v11 = 0;
v12 = 0;
v51 = 0;
v50 = 0;
v13 = _InterlockedIncrement64(v10);
if( !v13 )
KeBugCheckEx(0x51u, 0x24ui64, (ULONG_PTR)v10, 0i64, 0i64);
if( v13 == 1 )
KeBugCheckEx(0x51u, 0x15ui64, 0i64, 0i64, 0i64);
v14 = *((_DWORD *)v10 + 4);
if( (unsigned int)a3 < (unsigned int)a4 )
{
LABEL_4:
if( v8 >= 8 )
v15 = (_UNICODE_STRING *)(*(_QWORD *)(a5 + 160) + 16 * (v8 - 8 + 6i64));
else
v15 = (_UNICODE_STRING *)(a5 + 16 * (v8 + 2i64));
if( v8 >= 8 )
v16 = *(_DWORD *)(*(_QWORD *)(a5 + 160) + 4i64 * (v8 - 8));
else
v16 = *(_DWORD *)(a5 + 4i64 * v8);
v14 = v16 + 37 * v14;
v53 = v14 ^ (v14 >> 9);
v17 = *((_QWORD *)P + 205);
v52 = 101027 * v53;
v18 = v52 ^ (v52 >> 9);
ExAcquirePushLockSharedEx(v17 + 24i64 * (v18 & (*((_DWORD *)P + 412) - 1)), 0i64);
_m_prefetchw((char *)P + 4272);
v19 = *((_DWORD *)P + 1068);
if( !v19 )
LABEL_83:
KeBugCheckEx(0x51u, 0x17ui64, (ULONG_PTR)P, 9ui64, v14);
while( 1 )
{
v20 = v19;
v19 = _InterlockedCompareExchange((volatile signed __int32 *)P + 1068, v19 + 1, v19);
if( v20 == v19 )
break;
if( !v19 )
goto LABEL_83;
}
v21 = *((_QWORD *)P + 205);
v22 = v18 & (*((_DWORD *)P + 412) - 1);
DestName = 0i64;
v23 = *(_QWORD *)(v21 + 24 * v22 + 16);
if( !v23 )
{
LABEL_13:
v24 = *((_QWORD *)P + 205)
+ 24 * ((unsigned int)(*((_DWORD *)P + 412) - 1) & ((101027 * v53) ^ ((unsigned __int64)(101027 * v53) >> 9)));
*(_QWORD *)(v24 + 8) = 0i64;
ExReleasePushLockEx(v24, 0i64);
if( _InterlockedExchangeAdd((volatile signed __int32 *)P + 1068, 0xFFFFFFFF) == 1 )
CmpDeleteHive(P);
v10 = v55;
goto LABEL_16;
}
while( 1 )
{
if( *(_DWORD *)v23 == v14 )
{
v26 = v23 - 16;
if( *(volatile INT64 **)(v23 + 56) == v10 )
{
v27 = *(_QWORD *)(v26 + 80);
v28 = (unsigned __int8 *)(v27 + 26);
if( (*(_DWORD *)v27 & 1) != 0 )
{
v29 = v15->Length >> 1;
Buffer = v15->Buffer;
v31 = *(_WORD *)(v27 + 24);
if( v29 )
{
while( v31 )
{
v32 = *Buffer++;
v33 = *v28++;
if( v32 != (_WORD)v33 )
{
if( v32 >= 0x61u )
{
if( v32 > 0x7Au )
v32 = NLS_UPCASE(v32);
else
v32 -= 32;
}
v34 = v32 - v33;
if( v32 != v33 )
goto LABEL_29;
}
--v31;
if( !--v29 )
break;
}
}
v34 = v29 - v31;
LABEL_29:
if( !v34 )
{
LABEL_30:
if( v23 == 16 )
goto LABEL_13;
v35 = *(_QWORD *)v26;
if( *(_QWORD *)v26 )
{
while( v35 != -1 )
{
v36 = v35;
v35 = _InterlockedCompareExchange64((volatile signed __int64 *)v26, v35 + 1, v35);
if( v36 == v35 )
goto LABEL_34;
if( !v35 )
goto LABEL_43;
}
LABEL_81:
KeBugCheckEx(0x51u, 0x24ui64, v23 - 16, 0i64, 0i64);
}
LABEL_43:
ExAcquirePushLockSharedEx(v26 + 48, 0i64);
_InterlockedIncrement((volatile signed __int32 *)(v26 + 56));
if( (*(_DWORD *)(v26 + 8) & 0x80000) != 0 )
KeBugCheckEx(0x51u, 0x20ui64, v23 - 16, 0i64, 0i64);
if( !_InterlockedIncrement64((volatile signed __int64 *)v26) )
goto LABEL_81;
if( (*(_BYTE *)(v26 + 64) & 2) != 0 )
{
LODWORD(v39) = KeAbPreAcquire(&CmpDelayedCloseTableLock, 0i64, 0i64);
v40 = v39;
CurrentIrql = KeGetCurrentIrql();
__writecr8(1ui64);
if( !_interlockedbittestandreset((volatile signed __int32 *)&CmpDelayedCloseTableLock, 0) )
ExpAcquireFastMutexContended(&CmpDelayedCloseTableLock, v39);
if( v40 )
v40[26] |= 1u;
CmpDelayedCloseTableLock.Owner = KeGetCurrentThread();
CmpDelayedCloseTableLock.OldIrql = CurrentIrql;
v42 = *(_BYTE *)(v26 + 64);
if( (v42 & 2) != 0 )
{
v43 = v26 + 224;
if( (v42 & 4) != 0 )
{
**(_BYTE **)v43 = 1;
*(_BYTE *)(v26 + 64) &= ~4u;
}
else
{
v44 = *(_BYTE **)v43;
v45 = *(_QWORD **)(v26 + 232);
if( *(_QWORD *)(*(_QWORD *)v43 + 8i64) != v43 || *v45 != v43 )
__fastfail(3u);
--CmpDelayedCloseElements;
*v45 = v44;
*((_QWORD *)v44 + 1) = v45;
--qword_140D2DF88;
}
*(_QWORD *)(v26 + 232) = v26 + 224;
*(_QWORD *)v43 = v43;
_InterlockedOr(v49, 0);
*(_BYTE *)(v26 + 64) &= ~2u;
}
OldIrql_low = LOBYTE(CmpDelayedCloseTableLock.OldIrql);
CmpDelayedCloseTableLock.Owner = 0i64;
v47 = _InterlockedCompareExchange((volatile signed __int32 *)&CmpDelayedCloseTableLock, 1, 0);
if( v47 )
ExpReleaseFastMutexContended(&CmpDelayedCloseTableLock, v47);
__writecr8(OldIrql_low);
KeAbPostRelease(&CmpDelayedCloseTableLock);
}
v48 = (*(_DWORD *)(v26 + 8) & 0x80000) != 0;
if( *(struct _KTHREAD **)(v26 + 56) == KeGetCurrentThread() )
*(_QWORD *)(v26 + 56) = 0i64;
else
_InterlockedDecrement((volatile signed __int32 *)(v26 + 56));
ExReleasePushLockEx(v26 + 48, 0i64);
if( v48 && (*(_DWORD *)(v26 + 8) & 0x80000) != 0 )
CmpFreeKeyControlBlock((_CM_KEY_CONTROL_BLOCK *)(v23 - 16));
LABEL_34:
v37 = v56;
if( v8 == v56 - 1 )
{
v50 = 1;
}
else
{
v38 = *((_QWORD *)P + 205)
+ 24 * ((unsigned int)(*((_DWORD *)P + 412) - 1) & (v52 ^ ((unsigned __int64)v52 >> 9)));
*(_QWORD *)(v38 + 8) = 0i64;
ExReleasePushLockEx(v38, 0i64);
if( _InterlockedExchangeAdd((volatile signed __int32 *)P + 1068, 0xFFFFFFFF) == 1 )
CmpDeleteHive(P);
v37 = v56;
}
if( _InterlockedExchangeAdd64(v55, 0xFFFFFFFFFFFFFFFFui64) == 1 )
KeBugCheckEx(0x51u, 0x1Fui64, 0i64, 0i64, 0i64);
++v51;
v10 = (volatile INT64 *)(v23 - 16);
v55 = (volatile signed __int64 *)(v23 - 16);
if( (*(_DWORD *)(v26 + 184) & 0x100000) != 0 || (++v8, v8 >= v37) )
{
LABEL_16:
v12 = v50;
v11 = v51;
break;
}
goto LABEL_4;
}
}
else
{
DestName.Length = *(_WORD *)(v27 + 24);
DestName.MaximumLength = DestName.Length;
DestName.Buffer = (wchar_t *)(v27 + 26);
if( !CmpCompareUnicodeString(v15, &DestName, 2ui64) )
goto LABEL_30;
}
v10 = v55;
}
}
v23 = *(_QWORD *)(v23 + 8);
if( !v23 )
goto LABEL_13;
}
}
*(_QWORD *)a6 = v10;
*(_BYTE *)a7 = v12;
result = a8;
*(_WORD *)a8 = v11;
return result;
}Referenced by:
CmpPerformCompleteKcbCacheLookup