CmpLightWeightPrepareSetValueKeyUoW
__int64 __fastcall CmpLightWeightPrepareSetValueKeyUoW(
__int64 a1,
__int64 a2,
__int64 a3,
struct _LOOKASIDE_LIST_EX *a4){
_CM_UOW_SET_VALUE_LIST_DATA *v4;
PVOID p_Data;
__int64 v7;
UINT64 v8;
NTSTATUS v9;
_DWORD *v10;
_WORD *v11;
__int64 v12;
_CM_KEY_VALUE *v13;
unsigned int v14;
unsigned int v15;
void *PoolWithTag;
unsigned int v17;
unsigned int v18;
INT64 v19;
int v20;
unsigned int v21;
INT64 v23;
INT64 v24;
unsigned int a6;
_CM_UOW_SET_VALUE_LIST_DATA *Data;
PVOID P;
int v28[2];
int v29[2];
INT64 v30;
int v31[2];
INT64 v32;
_UNICODE_STRING ValueName;
INT64 p_ValueList;
char v35;
char v36;
UINT64 a5;
v4 = *(_CM_UOW_SET_VALUE_LIST_DATA **)(a1 + 104);
LODWORD(a5) = 0;
a6 = 0;
p_Data = 0i64;
v32 = 0i64;
v31[1] = 0;
v29[1] = 0;
v28[1] = 0;
v7 = *(_QWORD *)(a1 + 48);
v31[0] = -1;
v29[0] = -1;
v30 = 0xFFFFFFFFi64;
v28[0] = -1;
v8 = *(_QWORD *)(v7 + 32);
P = 0i64;
v35 = 0;
v36 = 0;
LOBYTE(p_ValueList) = 0;
Data = v4;
ValueName = 0i64;
if( !v4 )
{
v9 = CmpLightWeightCreateSetValueData((_CM_KCB_UOW *)a1, &Data);
if( v9 < 0 )
return(unsigned int)v9;
v4 = Data;
CmpLightWeightUpdateSharedSetValueData(Data, *(_CM_KEY_CONTROL_BLOCK **)(a1 + 48));
--v4->RefCount;
}
CmpAllocateTransientPoolWithTag((_HHIVE *)1, 0x10ui64, 0x77554D43ui64, (_CHILD_LIST *)a4);
v11 = v10;
if( !v10 )
return(unsigned int)-1073741670;
*((_QWORD *)v10 + 1) = 0i64;
*v10 = -1;
v10[1] = -1;
v12 = (*(__int64(__fastcall **)(UINT64, _QWORD, int *))(v8 + 8))(v8, *(unsigned int *)(a1 + 92), v31);
v13 = (_CM_KEY_VALUE *)v12;
if( v12 )
{
v14 = *(_DWORD *)(v12 + 4);
v15 = v14 + 0x80000000;
if( v14 < 0x80000000 )
v15 = v14;
LODWORD(Data) = v15;
if( v15 )
{
if( v14 >= 0x80000000 )
{
p_Data = &v13->Data;
}
else
{
if( !CmpGetValueData(
v8,
*(unsigned int *)(a1 + 92),
(INT64)v13,
(UINT64 *)&Data,
(INT64)&P,
(INT64)&p_ValueList,
(INT64)&v30) )
{
v9 = -1073741670;
LABEL_34:
(*(void(__fastcall **)(UINT64, int *))(v8 + 16))(v8, v31);
goto LABEL_35;
}
p_Data = P;
v15 = (unsigned int)Data;
v36 = p_ValueList;
v35 = 1;
}
}
if( !HvMarkCellDirty(v8, *(unsigned int *)(*(_QWORD *)(a1 + 48) + 40i64), 0) )
{
v9 = -1073741443;
LABEL_30:
if( v35 && p_Data )
{
if( v36 )
ExFreePoolWithTag(p_Data, 0);
else(*(void(__fastcall **)(UINT64, INT64 *))(v8 + 16))(v8, &v30);
}
goto LABEL_34;
}
Data = (_CM_UOW_SET_VALUE_LIST_DATA *)(*(__int64(__fastcall **)(UINT64, _QWORD, int *))(v8 + 8))(
v8,
*(unsigned int *)(*(_QWORD *)(a1 + 48) + 40i64),
v29);
*(_DWORD *)(a1 + 72) = *(_DWORD *)(*(_QWORD *)(a1 + 48) + 40i64) >> 31;
PoolWithTag = ExAllocatePoolWithTag(PagedPool, 0x8000ui64, 0x62534D43ui64);
P = PoolWithTag;
if( !PoolWithTag )
{
v9 = -1073741670;
LABEL_28:
if( Data )
(*(void(__fastcall **)(UINT64, int *))(v8 + 16))(v8, v29);
goto LABEL_30;
}
CmpInitializeValueNameString(v13, &ValueName, (WCHAR *)PoolWithTag);
p_ValueList = (INT64)&v4->ValueList;
if( !CmpFindNameInList(v8, (UINT64 *)&v4->ValueList, (WCHAR **)&ValueName, 0i64, &a5, &a6)
|| (LODWORD(v24) = *(_DWORD *)(a1 + 72),
LODWORD(v23) = v15,
v17 = CmpAddValueKeyNew((_HHIVE *)v8, &ValueName, v13->Type, p_Data, v23, v24),
v17 == -1) )
{
v9 = -1073741670;
LABEL_27:
ExFreePoolWithTag(P, 0);
goto LABEL_28;
}
v18 = a6;
if( a6 != -1 )
{
if( HvMarkCellDirty(v8, a6, 0) )
{
v19 = (*(__int64(__fastcall **)(UINT64, _QWORD, int *))(v8 + 8))(v8, v18, v28);
v32 = v19;
if( v19 )
{
if( !CmpMarkValueDataDirty(v8, v19) )
{
v9 = -1073741443;
LABEL_23:
if( v32 )
(*(void(__fastcall **)(UINT64, int *))(v8 + 16))(v8, v28);
goto LABEL_25;
}
CmpSwapValueInList((_HHIVE *)v8, v17, (unsigned int)a5, (_CHILD_LIST *)p_ValueList);
LABEL_21:
v9 = v20;
if( v20 >= 0 )
{
v9 = 0;
v11[4] = ValueName.Length;
v21 = a6;
*(_DWORD *)v11 = v17;
*((_DWORD *)v11 + 1) = v21;
*((_DWORD *)v11 + 3) = v15;
*(_QWORD *)(a1 + 112) = v11;
v11 = 0i64;
v17 = -1;
}
goto LABEL_23;
}
v9 = -1073741670;
}
else
{
v9 = -1073741443;
}
LABEL_25:
if( v17 != -1 )
CmpFreeValue(v8, v17);
goto LABEL_27;
}
v20 = CmpAddValueToList(v8, v17, (unsigned int)a5, *(unsigned int *)(a1 + 72), (UINT64 *)p_ValueList);
goto LABEL_21;
}
v9 = -1073741670;
LABEL_35:
if( v11 )
CmpFreeTransientPoolWithTag(v11, 0x77554D43ui64);
return(unsigned int)v9;
}Referenced by:
CmpProcessLightWeightUOW