CmpLightWeightPrepareDeleteValueKeyUoW
__int64 __fastcall CmpLightWeightPrepareDeleteValueKeyUoW(
__int64 a1,
__int64 a2,
__int64 a3,
struct _LOOKASIDE_LIST_EX *a4){
_CM_UOW_SET_VALUE_LIST_DATA *v4;
__int64 v6;
UINT64 v7;
int v8;
__int64 v9;
_DWORD *v10;
_CM_KEY_VALUE *v11;
WCHAR *PoolWithTag;
WCHAR *v13;
unsigned int v14;
INT64 v15;
_CM_UOW_SET_VALUE_LIST_DATA *Data;
_UNICODE_STRING ValueName;
UINT64 a6;
UINT64 a5;
int v21;
int v22;
int v23;
int v24;
v4 = *(_CM_UOW_SET_VALUE_LIST_DATA **)(a1 + 104);
LODWORD(a5) = 0;
LODWORD(a6) = 0;
v24 = 0;
v22 = 0;
v6 = *(_QWORD *)(a1 + 48);
v23 = -1;
v21 = -1;
Data = v4;
v7 = *(_QWORD *)(v6 + 32);
ValueName = 0i64;
if( !v4 )
{
v8 = CmpLightWeightCreateSetValueData((_CM_KCB_UOW *)a1, &Data);
if( v8 < 0 )
return(unsigned int)v8;
v4 = Data;
CmpLightWeightUpdateSharedSetValueData(Data, *(_CM_KEY_CONTROL_BLOCK **)(a1 + 48));
--v4->RefCount;
}
CmpAllocateTransientPoolWithTag((_HHIVE *)1, 0x10ui64, 0x77554D43ui64, (_CHILD_LIST *)a4);
v10 = (_DWORD *)v9;
if( v9 )
{
*(_QWORD *)(v9 + 8) = 0i64;
*(_DWORD *)v9 = -1;
*(_DWORD *)(v9 + 4) = -1;
v11 = (_CM_KEY_VALUE *)(*(__int64(__fastcall **)(UINT64, _QWORD, int *))(v7 + 8))(
v7,
*(unsigned int *)(a1 + 88),
&v23);
if( v11 )
{
PoolWithTag = (WCHAR *)ExAllocatePoolWithTag(PagedPool, 0x8000ui64, 0x62534D43ui64);
v13 = PoolWithTag;
if( PoolWithTag
&& (CmpInitializeValueNameString(v11, &ValueName, PoolWithTag),
CmpFindNameInList(v7, (UINT64 *)&v4->ValueList, (WCHAR **)&ValueName, 0i64, &a5, &a6)) )
{
v14 = a6;
v15 = (*(__int64(__fastcall **)(UINT64, _QWORD, int *))(v7 + 8))(v7, (unsigned int)a6, &v21);
if( CmpMarkValueDataDirty(v7, v15) && HvMarkCellDirty(v7, v14, 0) )
{
v8 = CmpRemoveValueFromList(v7, (unsigned int)a5, (UINT64 *)&v4->ValueList);
if( v8 >= 0 )
{
v10[1] = v14;
v8 = 0;
*(_QWORD *)(a1 + 112) = v10;
v10 = 0i64;
}
}
else
{
v8 = -1073741443;
}
if( v15 )
(*(void(__fastcall **)(UINT64, int *))(v7 + 16))(v7, &v21);
}
else
{
v8 = -1073741670;
}
(*(void(__fastcall **)(UINT64, int *))(v7 + 16))(v7, &v23);
if( v13 )
ExFreePoolWithTag(v13, 0);
}
else
{
v8 = -1073741670;
}
if( v10 )
CmpFreeTransientPoolWithTag(v10, 0x77554D43ui64);
}
else
{
return(unsigned int)-1073741670;
}
return(unsigned int)v8;
}Referenced by:
CmpProcessLightWeightUOW