CmReplaceKey

__int64 __fastcall CmReplaceKey(INT64 a1, __int64 a2, _UNICODE_STRING *a3, _LOOKASIDE_LIST_EX *a4){
  char v7; 
  char v8; 
  _PRIVILEGE_SET *TransientPoolWithTag; 
  int v10; 
  int v11; 
  _HHIVE *v12; 
  UINT64 CheckFlags; 
  UINT64 SupplementalFlags; 
  char Allocate[8]; 
  _HHIVE *Hive; 
  _IO_STATUS_BLOCK IoStatusBlock; 
  _KAPC_STATE ApcState; 
  _UNICODE_STRING ObjectInformation[32]; 

  Allocate[0] = 0;
  Hive = 0i64;
  IoStatusBlock = 0i64;
  v7 = 0;
  v8 = 0;
  memset(&ApcState, 0, sizeof(ApcState));
  TransientPoolWithTag = (_PRIVILEGE_SET *)CmpAllocateTransientPoolWithTag(1ui64, 0x1B0ui64);
  if( !TransientPoolWithTag )
    return(unsigned int)-1073741670;
  LODWORD(SupplementalFlags) = 0;
  LODWORD(CheckFlags) = 17825793;
  v11 = CmpCmdHiveOpen(a3, 0, (UINT8 *)Allocate, (CMHIVE **)&Hive, CheckFlags, SupplementalFlags, 0i64);
  v12 = Hive;
  v10 = v11;
  if( v11 >= 0 )
  {
    CmpAttachToRegistryProcess(&ApcState);
    v7 = 1;
    CmpLockRegistry();
    HvLockHiveFlusherExclusive(a1);
    if( (*(_DWORD *)(a1 + 160) & 4) != 0 )
    {
LABEL_5:
      v10 = -1073741611;
      goto LABEL_18;
    }
    if( (*(_DWORD *)(a1 + 4152) & 0x20) != 0 )
      goto LABEL_7;
    if( a1 == *(&stru_140C00F40 + 70) )
    {
      v10 = CmpPreserveSystemHiveData(a1, (__int64)v12);
      if( v10 < 0 )
      {
LABEL_18:
        HvUnlockHiveFlusherExclusive(a1);
        CmpUnlockRegistry();
        if( v8 )
          CmpFinishBeingActiveFlusherAndReconciler((_EX_PUSH_LOCK *)a1);
        goto LABEL_20;
      }
    }
    HvUnlockHiveFlusherExclusive(a1);
    CmpUnlockRegistry();
    v10 = CmpFlushHive((CMHIVE *)v12, 0xCui64);
    if( v10 >= 0 )
    {
      CmpDetachFromRegistryProcess(&ApcState);
      v7 = 0;
      CmpBecomeActiveFlusherAndReconciler((PCMHIVE)a1);
      v8 = 1;
      CmpLockRegistry();
      HvLockHiveFlusherExclusive(a1);
      if( (*(_DWORD *)(a1 + 160) & 4) != 0 )
        goto LABEL_5;
      if( (*(_DWORD *)(a1 + 4152) & 0x20) == 0 )
      {
        v10 = CmpCmdRenameHive(
                *(PVOID *)(a1 + 1536),
                (_OBJECT_NAME_INFORMATION *)ObjectInformation,
                (_UNICODE_STRING *)a4,
                0x200ui64,
                0);
        if( v10 >= 0 )
        {
          *(_DWORD *)(a1 + 160) |= 4u;
          v10 = CmpCmdRenameHive(*(PVOID *)&v12[1].Signature, 0i64, ObjectInformation, 0i64, 0);
          if( v10 < 0 || (v10 = ZwFlushBuffersFile(*(VOID **)&v12[1].Signature, &IoStatusBlock), v10 < 0) )
          {
            if( (int)CmpCmdRenameHive(*(PVOID *)(a1 + 1536), 0i64, ObjectInformation, 0i64, 0) < 0 )
              v10 = -1073741492;
          }
        }
        goto LABEL_18;
      }
LABEL_7:
      v10 = -1073741811;
      goto LABEL_18;
    }
  }
LABEL_20:
  if( v12 )
  {
    if( !v7 )
    {
      CmpAttachToRegistryProcess(&ApcState);
      v7 = 1;
    }
    if( v10 >= 0 )
    {
      *(_OWORD *)&v12[1].Signature = 0i64;
      *(_OWORD *)&v12[1].ReleaseCellRoutine = 0i64;
      *(_OWORD *)&v12[1].Free = 0i64;
    }
    CmpDestroyHive(v12);
  }
  if( v7 )
    CmpDetachFromRegistryProcess(&ApcState);
  CmSiFreeMemory(TransientPoolWithTag);
  return(unsigned int)v10;
}

Referenced by:

NtReplaceKey