CmpCompareNewValueDataAgainstKCBCache
INT64 __fastcall CmpCompareNewValueDataAgainstKCBCache(
INT64 a1,
const UNICODE_STRING *a2,
INT64 a3,
const VOID *a4,
UINT64 a5){
int v6;
char v8;
__int64 v9;
unsigned int v10;
INT64 v11;
unsigned int v12;
unsigned int v13;
VOID *v14;
SIZE_T v15;
int v16;
bool ValueData;
INT64 v19;
INT64 v20;
INT64 v21;
int v22[2];
INT64 v23;
LOBYTE(v23) = 0;
v20 = 0i64;
LODWORD(v19) = 0;
v6 = a3;
v22[1] = 0;
v21 = 0xFFFFFFFFi64;
v22[0] = -1;
v8 = 0;
if( (int)CmpFindNameInListWithStatus(
*(_HHIVE **)(a1 + 32),
(_CHILD_LIST *)(a1 + 96),
(_UNICODE_STRING *)a2,
0i64,
0i64,
(UINT64 *)&v19) < 0 )
return 2;
v9 = (*(__int64(__fastcall **)(_QWORD, _QWORD, int *))(*(_QWORD *)(a1 + 32) + 8i64))(
*(_QWORD *)(a1 + 32),
(unsigned int)v19,
v22);
v10 = 2;
v11 = v9;
if( (*(_BYTE *)(v9 + 16) & 2) == 0 && v6 == *(_DWORD *)(v9 + 12) )
{
v12 = *(_DWORD *)(v9 + 4);
if( (_DWORD)a5 == (v12 & 0x7FFFFFFF) )
{
if( (_DWORD)a5 )
{
v13 = v12 + 0x80000000;
if( v12 < 0x80000000 )
v13 = v12;
HIDWORD(v19) = v13;
if( v12 < 0x80000000 )
{
v8 = 1;
ValueData = CmpGetValueData(
*(_QWORD *)(a1 + 32),
(unsigned int)v19,
v11,
(UINT64 *)((char *)&v19 + 4),
(INT64)&v20,
(INT64)&v23,
(INT64)&v21);
v14 = (VOID *)v20;
if( !ValueData )
goto LABEL_11;
}
else
{
v14 = (VOID *)(v11 + 8);
}
v15 = (unsigned int)a5;
LODWORD(v15) = a5 & 0x7FFFFFFF;
v16 = RtlCompareMemory(v14, (VOID *)a4, v15);
v10 = (_DWORD)a5 != v16 ? 2 : 0;
LABEL_11:
if( v14 && v8 )
{
if( (_BYTE)v23 == 1 )
ExFreePoolWithTag(v14, 0);
else(*(void(__fastcall **)(_QWORD, INT64 *))(*(_QWORD *)(a1 + 32) + 16i64))(*(_QWORD *)(a1 + 32), &v21);
}
goto LABEL_13;
}
v10 = 0;
}
}
LABEL_13:
(*(void(__fastcall **)(_QWORD, int *, INT64))(*(_QWORD *)(a1 + 32) + 16i64))(*(_QWORD *)(a1 + 32), v22, v11);
return v10;
}Referenced by:
CmSetValueKey