HvpMarkCellDirty
UINT8 __stdcall HvpMarkCellDirty(PVOID Hive, PVOID CellIndex, UINT8 LockHeld, _CM_HIVE_DIRTY_REASON Reason){
unsigned __int64 v4;
int v6;
__int64 v9;
unsigned int *v10;
unsigned int v11;
unsigned int v12;
UINT8 v13;
int v15;
int v16;
v4 = (unsigned int)CellIndex;
v16 = 0;
v6 = *((_DWORD *)Hive + 40);
v15 = -1;
if( (v6 & 1) != 0 || (int)CellIndex < 0 )
return 1;
if( !LockHeld )
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)Hive + 10, 0i64);
v9 = (*((__int64(__fastcall **)(PVOID, _QWORD, int *))Hive + 1))(Hive, (unsigned int)v4, &v15);
if( !v9 || v9 == 4 )
{
if( !LockHeld )
{
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)Hive + 10, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)Hive + 10);
KeAbPostRelease((char *)Hive + 80);
}
}
else
{
if( !HvpGetCellMap((_HHIVE *)Hive, (unsigned int)v4) )
KeBugCheckEx(0x51u, (PVOID)1, Hive, (PVOID)v4, (PVOID)0x270);
v11 = v4 - 4;
v12 = *v10;
if( (*v10 & 0x80000000) != 0 )
v12 = -v12;
(*((void(__fastcall **)(PVOID, int *))Hive + 2))(Hive, &v15);
v13 = HvpMarkDirty((ULONG_PTR)Hive, v11, v12, Reason);
if( !LockHeld )
{
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)Hive + 10, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((_EX_PUSH_LOCK *)Hive + 10);
KeAbPostRelease((char *)Hive + 80);
}
if( v13 )
{
*((_BYTE *)Hive + 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