CmpCompareNewValueDataAgainstKCBCache
__int64 __fastcall CmpCompareNewValueDataAgainstKCBCache(
_CM_KEY_CONTROL_BLOCK *KeyControlBlock,
_UNICODE_STRING *ValueName,
unsigned int Type,
void *Data,
unsigned int DataSize){
char v8;
_CELL_DATA *v9;
unsigned int v10;
_CM_KEY_VALUE *v11;
unsigned int LowPart;
unsigned int v13;
VOID *p_Data;
unsigned int v15;
bool ValueData;
unsigned int ValueCell;
unsigned int ValueCell_4;
INT64 v20;
INT64 v21;
int v22[2];
INT64 v23;
LOBYTE(v23) = 0;
v20 = 0i64;
ValueCell = 0;
v22[1] = 0;
v21 = 0xFFFFFFFFi64;
v22[0] = -1;
v8 = 0;
if( (int)CmpFindNameInListWithStatus(
KeyControlBlock->KeyHash.KeyHive,
&KeyControlBlock->ValueList,
ValueName,
0,
0i64,
&ValueCell) < 0 )
return 2;
v9 = KeyControlBlock->KeyHash.KeyHive->GetCellRoutine(KeyControlBlock->KeyHash.KeyHive, ValueCell, v22);
v10 = 2;
v11 = (_CM_KEY_VALUE *)v9;
if( (v9->u.KeyString[8] & 2) == 0 && Type == v9->u.KeyValue.Type )
{
LowPart = v9->u.KeyNode.LastWriteTime.anonymous_0.LowPart;
if( DataSize == (LowPart & 0x7FFFFFFF) )
{
if( DataSize )
{
v13 = LowPart + 0x80000000;
if( LowPart < 0x80000000 )
v13 = LowPart;
ValueCell_4 = v13;
if( LowPart < 0x80000000 )
{
v8 = 1;
ValueData = CmpGetValueData(
KeyControlBlock->KeyHash.KeyHive,
ValueCell,
v11,
&ValueCell_4,
(void **)&v20,
(unsigned __int8 *)&v23,
(_HV_GET_CELL_CONTEXT *)&v21);
p_Data = (VOID *)v20;
if( !ValueData )
goto LABEL_11;
}
else
{
p_Data = &v11->Data;
}
v15 = (unsigned int)RtlCompareMemory(p_Data, Data, DataSize & 0x7FFFFFFF);
v10 = DataSize != v15 ? 2 : 0;
LABEL_11:
if( p_Data && v8 )
{
if( (_BYTE)v23 == 1 )
ExFreePoolWithTag(p_Data, 0);
else
KeyControlBlock->KeyHash.KeyHive->ReleaseCellRoutine(
KeyControlBlock->KeyHash.KeyHive,
(_HV_GET_CELL_CONTEXT *)&v21);
}
goto LABEL_13;
}
v10 = 0;
}
}
LABEL_13:
((void(__fastcall *)(_HHIVE *, int *, _CM_KEY_VALUE *))KeyControlBlock->KeyHash.KeyHive->ReleaseCellRoutine)(
KeyControlBlock->KeyHash.KeyHive,
v22,
v11);
return v10;
}Referenced by:
CmSetValueKey