HvpMarkCellDirty
CHAR __fastcall HvpMarkCellDirty(UINT64 P2, UINT64 P3, CHAR a3){
ULONG_PTR v3;
int v4;
__int64 v7;
unsigned int *v8;
unsigned int v9;
unsigned int v10;
CHAR v11;
int v13;
int v14;
v3 = (unsigned int)P3;
v14 = 0;
v4 = *(_DWORD *)(P2 + 160);
v13 = -1;
if( (v4 & 1) != 0 || (P3 & 0x80000000) != 0i64 )
return 1;
if( !a3 )
ExAcquirePushLockExclusiveEx(P2 + 80, 0i64);
v7 = (*(__int64(__fastcall **)(UINT64, _QWORD, int *))(P2 + 8))(P2, (unsigned int)v3, &v13);
if( !v7 || v7 == 4 )
{
if( !a3 )
{
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(P2 + 80), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(P2 + 80));
KeAbPostRelease((PVOID)(P2 + 80));
}
}
else
{
if( !HvpGetCellMap(P2, (unsigned int)v3) )
KeBugCheckEx(0x51u, 1ui64, P2, v3, 0x270ui64);
v9 = v3 - 4;
v10 = *v8;
if( (*v8 & 0x80000000) != 0 )
v10 = -v10;
(*(void(__fastcall **)(UINT64, int *))(P2 + 16))(P2, &v13);
v11 = HvpMarkDirty(P2, v9, v10);
if( !a3 )
{
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)(P2 + 80), 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)(P2 + 80));
KeAbPostRelease((PVOID)(P2 + 80));
}
if( v11 )
{
*(_BYTE *)(P2 + 141) = 1;
return 1;
}
}
return 0;
}Referenced by:
CmpCheckAndFixSecurityCellsRefcount
CmpCheckLeaf
CmpCheckValueList
CmpClearKeyAccessBits
CmpCopySyncTree2
CmpInsertSecurityCellList
CmpLightWeightPrepareSetKeyUserFlags
CmpMarkAllChildrenDirty
CmpMarkCurrentProfileDirty
CmpMarkCurrentValueDirty
CmpMarkEntireIndexDirty
CmpMarkIndexDirty
CmpMarkKeyDirty
CmpMarkKeyParentDirty
CmpMarkKeyValuesDirty
CmpMarkValueDataDirty
CmpPartialPromoteSingleKeyFromKeyNodeStacks
CmpRemoveSubKeyCellNoCellRef
CmpUpdateHiveRootCellFlags
CmpUpdateKeyNodeAccessBits
CmpVEExecuteOpenLogic
CmpValidateHiveSecurityDescriptors
HvMarkCellDirty
HvpFindFreeCellInBin
HvpIsFreeNeighbor