Get rid of wrong/confusing _strdupnA usage.

diff --git a/misc/registry.c b/misc/registry.c
index 21ed173..438376a 100644
--- a/misc/registry.c
+++ b/misc/registry.c
@@ -92,15 +92,15 @@
     return res;
 }
 
-/* _strdupnA [Internal] */
-static LPSTR _strdupnA(LPCSTR str,size_t len)
+/* _xstrdup [Internal] */
+static LPSTR _xstrdup(LPCSTR str)
 {
     LPSTR ret;
+    size_t len = strlen(str) + 1;
 
     if (!str) return NULL;
-    ret = _xmalloc( len + 1 );
+    ret = _xmalloc( len );
     memcpy( ret, str, len );
-    ret[len] = 0x00;
     return ret;
 }
 
@@ -698,9 +698,12 @@
 
     if (level <= 0) {
         /* create new subkey name */
-        new_key_name = _strdupnA(key_name,strlen(key_name)+dkh->keynamelen+1);
-        if (strcmp(new_key_name,"") != 0) strcat(new_key_name,"\\");
-        strncat(new_key_name,dkh->name,dkh->keynamelen);
+        size_t len = strlen(key_name);
+        new_key_name = _xmalloc(len+dkh->keynamelen+2);
+        memcpy( new_key_name, key_name, len );
+        if (len) new_key_name[len++] = '\\';
+        memcpy( new_key_name + len, dkh->name, dkh->keynamelen );
+        new_key_name[len + dkh->keynamelen] = 0;
 
         /* walk sibling keys */
         if (dke->next != 0xffffffff ) {
@@ -730,7 +733,7 @@
             _dump_strAtoW(new_key_name,strlen(new_key_name),f,"[]");
             fprintf(f,"]\n");
         }
-    } else new_key_name = _strdupnA(key_name,strlen(key_name));
+    } else new_key_name = _xstrdup(key_name);
 
     /* next sub key */
     if (dke->nextsub != 0xffffffff) {
@@ -1008,9 +1011,12 @@
     /* create the new key */
     if (level <= 0) {
         /* create new subkey name */
-        new_key_name = _strdupnA(key_name,strlen(key_name)+nk->name_len+1);
-        if (strcmp(new_key_name,"") != 0) strcat(new_key_name,"\\");
-        strncat(new_key_name,nk->name,nk->name_len);
+        size_t len = strlen(key_name);
+        new_key_name = _xmalloc( len+nk->name_len+2 );
+        memcpy( new_key_name, key_name, len );
+        if (len) new_key_name[len++] = '\\';
+        memcpy( new_key_name + len, nk->name, nk->name_len );
+        new_key_name[len + nk->name_len] = 0;
 
         /* write the key path (something like [Software\\Microsoft\\..]) only if:
            1) key has some values
@@ -1038,7 +1044,7 @@
                 return FALSE;
             }
         }
-    } else new_key_name = _strdupnA(key_name,strlen(key_name));
+    } else new_key_name = _xstrdup(key_name);
 
     /* loop through the subkeys */
     if (nk->nr_subkeys) {