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