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