ERROR_MORE_DATA requires to write the needed number of bytes into the
lpcchX value (verified against NT3.51 advapi32.dll).

diff --git a/misc/registry.c b/misc/registry.c
index b58d157..bdfdcb6 100644
--- a/misc/registry.c
+++ b/misc/registry.c
@@ -2504,8 +2504,10 @@
 	if (lpbData)					/* data required ?*/
 	{ if (*lpcbData >= lpkey->values[i].len)	/* buffer large enought ?*/
 	    memcpy(lpbData,lpkey->values[i].data,lpkey->values[i].len);
-	  else
+	  else {
+	    *lpcbData = lpkey->values[i].len;
 	    ret = ERROR_MORE_DATA;
+	  }
 	}
 
 	if (lpcbData) 					/* size required ?*/
@@ -2956,8 +2958,10 @@
 
 	if (iSubkey || !lpxkey)
 		return ERROR_NO_MORE_ITEMS;
-	if (lstrlenW(lpxkey->keyname)+1>*lpcchName)
+	if (lstrlenW(lpxkey->keyname)+1>*lpcchName) {
+		*lpcchName = lstrlenW(lpxkey->keyname)+1;
 		return ERROR_MORE_DATA;
+	}
 	memcpy(lpszName,lpxkey->keyname,lstrlenW(lpxkey->keyname)*2+2);
 
         if (*lpcchName)
@@ -3130,8 +3134,10 @@
 		*lpdwType = val->type;
 
 	if (lpbData) {
-		if (val->len>*lpcbData)
+		if (val->len>*lpcbData) {
+			*lpcbData = val->len;
 			return ERROR_MORE_DATA;
+		}
 		memcpy(lpbData,val->data,val->len);
 		*lpcbData = val->len;
 	}
@@ -3176,9 +3182,10 @@
 			if ((1<<dwType) & UNICONVMASK) {
 				lstrcpyWtoA(lpbData,(LPWSTR)lpbDataW);
 			} else {
-				if (lpcbDataW > *lpcbData)
+				if (lpcbDataW > *lpcbData) {
+					*lpcbData = lpcbDataW;
 					ret	= ERROR_MORE_DATA;
-				else
+				} else
 					memcpy(lpbData,lpbDataW,lpcbDataW);
 			}
 			*lpcbData = lpcbDataW;