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;