CmpAssignKeySecurity
VOID __fastcall CmpAssignKeySecurity(INT64 a1, INT64 a2){
char v4;
bool v5;
UINT64 v6;
INT64 v7;
INT64 KeyNodeForKcb;
INT64 v9[2];
__int128 v10;
bool v11;
INT64 v12;
v12 = 0xFFFFFFFFi64;
*(_OWORD *)v9 = 0i64;
WORD1(v9[0]) = -1;
v4 = 0;
v10 = 0i64;
v11 = CmpAcquireShutdownRundown();
v5 = v11;
if( v11 )
{
CmpLockRegistry();
v6 = *(_QWORD *)(a1 + 8);
v4 = 1;
v7 = *(_QWORD *)(v6 + 32);
if( (int)CmpStartKcbStackForTopLayerKcb((INT64)v9, v6) >= 0 )
{
CmpLockKcbStackExclusive((INT64)v9);
if( CmpPerformKeyBodyDeletionCheck(a1, 0i64) >= 0 )
{
HvLockHiveFlusherShared(v7);
CmLockHiveSecurityExclusive((_CMHIVE *)v7);
KeyNodeForKcb = CmpGetKeyNodeForKcb(v6, (INT64)&v12, 1);
ObAssignObjectSecurityDescriptor((PVOID)a1, 0i64);
if( !*((_BYTE *)KeGetCurrentThread() + 562) && (*(_DWORD *)(v7 + 4152) & 0x20) != 0 && *(_DWORD *)(v7 + 1864) )
a2 = *(_QWORD *)(*(_QWORD *)(v7 + 1880) + 8i64) + 32i64;
if( (int)CmpAssignSecurityDescriptor(
*(_QWORD *)(v6 + 32),
*(unsigned int *)(v6 + 40),
KeyNodeForKcb,
(VOID *)a2,
0) >= 0 )
CmpAssignSecurityToKcb(v6, *(unsigned int *)(KeyNodeForKcb + 44), 0i64, 1, 0);
if( KeyNodeForKcb )
CmpReleaseKeyNodeForKcb((_CM_KEY_CONTROL_BLOCK *)v6, (_HV_GET_CELL_CONTEXT *)&v12);
CmUnlockHiveSecurity(v7);
HvUnlockHiveFlusherShared(v7);
}
CmpUnlockKcbStack((__int64)v9);
}
v5 = v11;
}
CmpCleanupKcbStack((INT64)v9);
if( v4 )
CmpUnlockRegistry();
if( v5 )
CmpReleaseShutdownRundown();
}Referenced by:
CmpSecurityMethod