CmSetKeyFlags
__int64 __fastcall CmSetKeyFlags(__int64 a1, int a2, int a3){
_CM_KEY_BODY *v3;
ULONG_PTR v5;
int v7;
__int64 v8;
INT64 KeyControlBlock;
_CM_TRANS *v10;
_CM_TRANS *v11;
INT64 v12;
INT64 v13;
int v14;
INT64 v15;
INT64 KeyNodeForKcb;
INT64 v17;
int v18;
int v19;
int v20;
__int16 v21;
unsigned int v22;
_CM_KCB_UOW *UnitOfWork;
int v24;
_CM_TRANS *CmTrans;
INT64 v27;
int a1a;
_CM_KEY_BODY *v29;
UINT64 v30[2];
INT64 v31[2];
__int128 v32;
KAPC_STATE ApcState;
v29 = (_CM_KEY_BODY *)a1;
v3 = (_CM_KEY_BODY *)a1;
v5 = 0i64;
v27 = 0xFFFFFFFFi64;
*(_OWORD *)v31 = 0i64;
WORD1(v31[0]) = -1;
CmTrans = 0i64;
a1a = 0;
memset(&ApcState, 0, sizeof(ApcState));
v32 = 0i64;
*(_OWORD *)v30 = 0i64;
CmpAttachToRegistryProcess(&ApcState);
if( a2 == 1 && (a3 & 0xFFFFFFF0) != 0 )
{
v7 = -1073741811;
}
else
{
while( (CmpShutdownRundown & 1) == 0 )
{
v8 = *(_QWORD *)&KUSER_SHARED_DATA.SystemTime.LowPart;
CmpLockRegistry();
KeyControlBlock = (INT64)v3->KeyControlBlock;
CmpStartKcbStackForTopLayerKcb((INT64)v31, KeyControlBlock);
CmpLockKcbStackTopExclusiveRestShared((__int64)v31);
v7 = CmpPerformKeyBodyDeletionCheck((__int64)v3, 0i64);
if( v7 < 0 )
goto LABEL_55;
if( *(_QWORD *)&v3->Trans.0 || v3->KtmUow )
{
v7 = CmpTransSearchAddTransFromKeyBody(v3, &CmTrans);
if( v7 < 0 )
goto LABEL_55;
if( (*(_DWORD *)(*(_QWORD *)(KeyControlBlock + 32) + 160i64) & 2) != 0 )
{
v7 = -1072103423;
goto LABEL_55;
}
v10 = CmTrans;
v7 = CmpPerformKeyBodyDeletionCheck((__int64)v29, (__int64)CmTrans);
if( v7 < 0 )
goto LABEL_55;
}
else
{
v10 = CmTrans;
}
if( (unsigned int)CmpGetEffectiveKcbSemantics((_CM_KEY_CONTROL_BLOCK *)KeyControlBlock) == 1 )
{
v7 = -1073741790;
goto LABEL_55;
}
if( (unsigned int)(a2 - 2) <= 2 )
v10 = v11;
CmTrans = v10;
if( v10 )
{
UnitOfWork = CmpAllocateUnitOfWork();
v5 = (ULONG_PTR)UnitOfWork;
if( UnitOfWork )
{
CmpTransEnlistUowInKcb(UnitOfWork, KeyControlBlock);
CmpTransEnlistUowInCmTrans((_CM_KCB_UOW *)v5, v10);
v7 = v24;
if( v24 < 0 )
goto LABEL_43;
if( !CmpLockIXLockIntent((UINT64 *)(KeyControlBlock + 248), v5)
|| !CmpLockIXLockExclusive(KeyControlBlock + 264, (_QWORD *)v5, 1) )
{
v7 = -1072103423;
goto LABEL_43;
}
*(_DWORD *)(v5 + 68) = 7;
*(_DWORD *)(v5 + 88) = a3;
v7 = CmAddLogForAction(v5, 1u);
if( v7 < 0 )
goto LABEL_43;
v7 = 0;
}
else
{
v7 = -1073741670;
}
LABEL_55:
CmpUnlockKcbStack((__int64)v31);
LABEL_56:
CmpUnlockRegistry();
goto LABEL_58;
}
v14 = CmpTryAcquireKcbIXLocks(v12, 0, v13, v30);
v7 = v14;
if( v14 == -1073741267 )
{
CmpLogTransactionAbortedForRollbackPacket(KeyControlBlock, 3i64, v30, v15);
CmpUnlockKcbStack((__int64)v31);
CmpUnlockRegistry();
v7 = CmpAbortRollbackPacket((INT64)v30);
if( v7 < 0 )
goto LABEL_58;
CmpRetryBackOff(&a1a);
CmpCleanupRollbackPacket((INT64)v30);
*(_OWORD *)v30 = 0i64;
}
else
{
if( v14 < 0 )
goto LABEL_55;
if( *(_DWORD *)(KeyControlBlock + 40) != -1 )
{
HvLockHiveFlusherShared(*(_QWORD *)(KeyControlBlock + 32));
if( HvMarkCellDirty(*(_QWORD *)(KeyControlBlock + 32), *(unsigned int *)(KeyControlBlock + 40), 0) )
{
KeyNodeForKcb = CmpGetKeyNodeForKcb(KeyControlBlock, (INT64)&v27, 1);
v17 = KeyNodeForKcb;
v18 = a2 - 1;
if( v18 )
{
v19 = v18 - 1;
if( v19 )
{
v20 = v19 - 1;
if( v20 )
{
if( v20 == 1 )
{
*(_BYTE *)(KeyNodeForKcb + 55) = a3;
*(_BYTE *)(KeyControlBlock + 185) = a3;
}
}
else
{
v21 = *(_WORD *)(KeyNodeForKcb + 2);
if( (a3 & 4) != 0 )
{
*(_WORD *)(v17 + 2) = v21 | 0x80;
*(_WORD *)(KeyControlBlock + 186) |= 0x80u;
}
else
{
if( (a3 & 1) != 0 )
{
*(_WORD *)(v17 + 2) = v21 | 0x300;
*(_WORD *)(KeyControlBlock + 186) |= 0x300u;
}
else
{
*(_WORD *)(v17 + 2) = v21 & 0xFEFF;
*(_WORD *)(KeyControlBlock + 186) &= ~0x100u;
}
if( (a3 & 2) != 0 )
{
*(_WORD *)(v17 + 2) |= 0x200u;
*(_WORD *)(KeyControlBlock + 186) |= 0x200u;
}
}
}
}
else
{
*(_DWORD *)(KeyNodeForKcb + 52) ^= (*(_DWORD *)(KeyNodeForKcb + 52) ^ (a3 << 20)) & 0xF00000;
*(_DWORD *)(KeyControlBlock + 184) ^= (*(_DWORD *)(KeyControlBlock + 184) ^ *(unsigned __int16 *)(KeyNodeForKcb + 54)) & 0xF0;
if( (a3 & 2) != 0 )
{
*(_WORD *)(KeyNodeForKcb + 2) &= ~0x80u;
*(_WORD *)(KeyControlBlock + 186) = *(_WORD *)(KeyNodeForKcb + 2);
}
}
}
else
{
v22 = *(_DWORD *)(KeyNodeForKcb + 52) ^ (*(_DWORD *)(KeyNodeForKcb + 52) ^ (a3 << 16)) & 0xF0000;
*(_DWORD *)(KeyNodeForKcb + 52) = v22;
*(_DWORD *)(KeyControlBlock + 184) ^= (*(_DWORD *)(KeyControlBlock + 184) ^ HIWORD(v22)) & 0xF;
}
*(_QWORD *)(v17 + 4) = v8;
++*(_QWORD *)(KeyControlBlock + 304);
*(_QWORD *)(KeyControlBlock + 168) = v8;
v7 = 0;
CmpReleaseKeyNodeForKcb((_CM_KEY_CONTROL_BLOCK *)KeyControlBlock, (_HV_GET_CELL_CONTEXT *)&v27);
}
else
{
v7 = -1073741443;
}
HvUnlockHiveFlusherShared(*(_QWORD *)(KeyControlBlock + 32));
LABEL_43:
if( v5 )
{
CmpRundownUnitOfWork(v5);
CmpFreeUnitOfWork((void *)v5);
}
goto LABEL_55;
}
CmpUnlockKcbStack((__int64)v31);
v7 = CmpPromoteKey((__int64)v31, 0, 0);
if( v7 < 0 )
goto LABEL_56;
CmpUnlockRegistry();
CmpCleanupKcbStack((INT64)v31);
*(_OWORD *)v31 = 0i64;
WORD1(v31[0]) = -1;
v32 = 0i64;
}
v3 = v29;
}
v7 = -1073741431;
}
LABEL_58:
CmpDetachFromRegistryProcess(&ApcState);
CmpCleanupKcbStack((INT64)v31);
CmpCleanupRollbackPacket((INT64)v30);
return(unsigned int)v7;
}Referenced by:
NtSetInformationKey