CmpCopyName

UINT16 __stdcall CmpCopyName(PWCHAR Destination, _UNICODE_STRING *Source){
  int Length; 
  __int64 v3; 
  wchar_t *Buffer; 

  Length = Source->Length;
  v3 = 0i64;
  if( (Length & 0xFFFFFFFE) == 0 )
    return(unsigned __int16)Length >> 1;
  while( 1 )
  {
    Buffer = Source->Buffer;
    if( Buffer[v3] > 0xFFu )
      break;
    *((_BYTE *)Destination + v3) = Buffer[v3];
    v3 = (unsigned int)(v3 + 1);
    LOWORD(Length) = Source->Length;
    if( (unsigned int)v3 >= Source->Length >> 1 )
      return(unsigned __int16)Length >> 1;
  }
  memmove(Destination, Buffer, (unsigned __int16)Length);
  return Source->Length;
}

Referenced by:

CmRenameKey
CmpAddValueKeyNew
CmpAddValueKeyTombstone
CmpCreateChild
CmpCreateHiveRootCell
CmpCreateRootNode