CmLockKeyForWrite

__int64 __fastcall CmLockKeyForWrite(__int64 a1){
  _QWORD *SiloKeyLockEntry; 
  _EJOB *CurrentSilo; 
  UINT64 v4; 
  int v5; 
  _ETHREAD *CurrentThread; 
  ULONG_PTR v7; 
  UINT64 v8; 
  _QWORD *v9; 
  _QWORD *i; 
  _ETHREAD *v11; 
  UINT64 v12; 
  _QWORD *v13; 
  UINT64 j; 
  ULONG_PTR BugCheckParameter2; 
  INT64 v17; 
  SiloKeyLockEntry = 0i64;
  v17 = 0i64;
  CurrentSilo = PsGetCurrentSilo();
  BugCheckParameter2 = 0i64;
  PsGetPermanentSiloContext(CurrentSilo, *(unsigned int *)CmpSiloContextSlot, (PVOID *)&BugCheckParameter2);
  if( !BugCheckParameter2 )
    return(unsigned int)-1073741637;
  CmpLockRegistry();
  v4 = *(_QWORD *)(a1 + 8);
  CmpLockKcbExclusive(v4);
  v5 = CmpPerformKeyBodyDeletionCheck(a1, 0i64);
  if( v5 < 0 )
    goto LABEL_23;
  if( *(_QWORD *)(v4 + 32) == CmpMasterHive )
  {
    v5 = -1073741811;
    goto LABEL_23;
  }
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --*((_WORD *)CurrentThread + 242);
  v7 = BugCheckParameter2;
  ExAcquirePushLockSharedEx(BugCheckParameter2, 0i64);
  v5 = CmpPerformSiloKeyLockTrackerEnabledCheck(v7);
  if( v5 < 0 )
    goto LABEL_22;
  v9 = (_QWORD *)(v7 + 16);
  for( i = *(_QWORD **)(v7 + 16); i != v9; i = (_QWORD *)*i )
  {
    if( i[2] == v4 )
    {
      v5 = 0;
      goto LABEL_22;
    }
  }
  ExReleasePushLockEx(v8, 0i64);
  KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
  SiloKeyLockEntry = CmpCreateSiloKeyLockEntry((volatile INT64 *)v4);
  if( SiloKeyLockEntry )
  {
    v5 = CmpGlobalLockKeyForWrite(v4, &v17);
    if( v5 < 0 )
      goto LABEL_23;
    SiloKeyLockEntry[3] = v17;
    v11 = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)v11 + 242);
    v7 = BugCheckParameter2;
    ExAcquirePushLockExclusiveEx(BugCheckParameter2, 0i64);
    v5 = CmpPerformSiloKeyLockTrackerEnabledCheck(v7);
    if( v5 >= 0 )
    {
      v13 = (_QWORD *)v9[1];
      if( (_QWORD *)*v13 != v9 )
        __fastfail(3u);
      *SiloKeyLockEntry = v9;
      SiloKeyLockEntry[1] = v13;
      *v13 = SiloKeyLockEntry;
      v9[1] = SiloKeyLockEntry;
      ExReleasePushLockEx(v12, 0i64);
      KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
      CmpUnlockKcb(v4);
      for( j = *(_QWORD *)(v4 + 72); *(_QWORD *)(j + 32) != CmpMasterHive; j = *(_QWORD *)(j + 72) )
      {
        CmpLockKcbExclusive(j);
        *(_WORD *)(j + 8) |= 0x100u;
        CmpUnlockKcb(j);
      }
      v5 = 0;
      goto LABEL_17;
    }
LABEL_22:
    ExReleasePushLockEx(v7, 0i64);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
    goto LABEL_23;
  }
  v5 = -1073741670;
LABEL_23:
  CmpUnlockKcb(v4);
  if( SiloKeyLockEntry )
    CmpFreeSiloKeyLockEntry(SiloKeyLockEntry);
LABEL_17:
  CmpUnlockRegistry();
  return(unsigned int)v5;
}

Referenced by:

NtLockRegistryKey