CmKeyBodyRemapToVirtual

__int64 __fastcall CmKeyBodyRemapToVirtual(
        __int64 *a1,
        char a2,
        unsigned int a3,
        _SECURITY_SUBJECT_CONTEXT *a4,
        _DWORD *a5){
  __int64 v8; 
  _CM_KEY_CONTROL_BLOCK *v9; 
  int v10; 
  __int32 bf_b8; 
  _UNICODE_STRING *v12; 
  __int64 v14; 
  unsigned int v15; 
  _GENERIC_MAPPING *GenericMapping; 
  __int64 v18; 
  _UNICODE_STRING DestinationString; 
  _OBJECT_ATTRIBUTES v20; 
  INT64 v21[38]; 
  _KAPC_STATE ApcState; 
  int v23[40]; 
  _AUX_ACCESS_DATA AuxData; 

  DestinationString = 0i64;
  memset(v23, 0i64, sizeof(v23));
  memset(&AuxData, 0i64, sizeof(AuxData));
  *(&v20.Length + 1) = 0;
  *(&v20.Attributes + 1) = 0;
  RtlInitUnicodeString(&DestinationString, 0i64);
  memset(&ApcState, 0, sizeof(ApcState));
  memset(v21, 0i64, 0x128u);
  LODWORD(v21[12]) = -1;
  v21[19] = (INT64)&v21[18];
  v21[18] = (INT64)&v21[18];
  memset(&v21[27], 0i64, 0x50u);
  v8 = *a1;
  v18 = 0i64;
  v9 = *(_CM_KEY_CONTROL_BLOCK **)(v8 + 8);
  if( v9->LayerHeight
    || (*(_DWORD *)(v8 + 48) & 0x10) != 0
    || !KCBNeedsVirtualImage(*(_QWORD *)(v8 + 8))
    || (bf_b8 = v9->_bf_b8, (bf_b8 & 0x800000) == 0)
    || (bf_b8 & 0x20) != 0 )
  {
    v10 = -1073741790;
    goto LABEL_12;
  }
  CmpAttachToRegistryProcess(&ApcState);
  CmpLockRegistry();
  CmpLockKcbShared(v9);
  v10 = CmpPerformKeyBodyDeletionCheck((CM_KEY_BODY *)v8, 0i64);
  if( v10 >= 0 )
  {
    if( (unsigned __int8)CmpReparseToVirtualPath(v9, v12, (_UNICODE_STRING *)a4) )
    {
      CmpUnlockKcb(*(_CM_KEY_CONTROL_BLOCK **)(*a1 + 8));
      CmpUnlockRegistry();
      LODWORD(v21[2]) = *a5;
      LODWORD(v21[0]) = 8;
      v21[9] = *(_QWORD *)(v8 + 56);
      v10 = SeCreateAccessStateFromSubjectContext(
              a4,
              (_ACCESS_STATE *)v23,
              &AuxData,
              a3,
              (_GENERIC_MAPPING *)((char *)CmKeyObjectType + 76));
      if( v10 >= 0 )
      {
        v20.RootDirectory = 0i64;
        v15 = 1600;
        v20.Length = 48;
        if( a2 != 1 )
          v15 = 576;
        v20.Attributes = v15;
        v20.ObjectName = &DestinationString;
        LOBYTE(GenericMapping) = 0;
        *(_OWORD *)&v20.SecurityDescriptor = 0i64;
        if( (int)CmObReferenceObjectByName(
                    &v20,
                    (_ACCESS_STATE *)v23,
                    a3,
                    v14,
                    (INT64)GenericMapping,
                    (__int64)v21,
                    (__int64)&v18) >= 0 )
        {
          *a1 = v18;
          HalPutDmaAdapter((PADAPTER_OBJECT)v8);
          v10 = 0;
        }
        else
        {
          v10 = -1073741790;
        }
        SeDeleteAccessState((_ACCESS_STATE *)v23);
      }
      goto LABEL_11;
    }
    v10 = -1073741790;
  }
  CmpUnlockKcb(v9);
  CmpUnlockRegistry();
LABEL_11:
  CmpDetachFromRegistryProcess(&ApcState);
LABEL_12:
  if( DestinationString.Buffer )
    RtlFreeAnsiString(&DestinationString);
  CmpCleanupParseContext((INT64)v21, 0);
  return(unsigned int)v10;
}

Referenced by:

NtDeleteKey
NtDeleteValueKey