- FIXME("%s %s %s %p %d %s\n", debugstr_a(lpszSection), debugstr_a(lpszEntry),
- debugstr_a(lpszDefault), RetBuffer, cbRetBuffer,
- debugstr_a(lpszFilename));
- SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
- return FALSE;
+
+ if (buff_len <= 0)
+ return 0;
+
+ if (buff)
+ buff[0] = 0;
+
+ if (!section || !defvalue || !buff)
+ return 0;
+
+ sectionW = heap_strdupAtoW(section);
+ filenameW = heap_strdupAtoW(filename);
+
+ sectionkey = get_privateprofile_sectionkey(sectionW, filenameW);
+
+ heap_free(sectionW);
+ heap_free(filenameW);
+
+ if (sectionkey)
+ {
+ DWORD type, size;
+
+ if (entry)
+ {
+ size = buff_len * sizeof(*buff);
+ if (RegGetValueA(sectionkey, NULL, entry, RRF_RT_REG_SZ, &type, buff, &size) == ERROR_SUCCESS)
+ {
+ usedefault = FALSE;
+ ret = (size / sizeof(*buff)) - 1;
+ }
+ }
+ else
+ {
+ char name[MAX_PATH] = {0};
+ DWORD index = 0;
+ DWORD namelen;
+
+ usedefault = FALSE;
+
+ memset(buff, 0, buff_len);
+
+ namelen = sizeof(name);
+ while (RegEnumValueA(sectionkey, index, name, &namelen, NULL, NULL, NULL, NULL) == ERROR_SUCCESS)
+ {
+ if ((ret + namelen+1) > buff_len)
+ break;
+
+ lstrcpyA(buff+ret, name);
+
+ ret += namelen+1;
+ namelen = sizeof(name);
+ index++;
+ }
+ }
+
+ RegCloseKey(sectionkey);
+ }
+ else
+ usedefault = entry != NULL;
+
+ if (usedefault)
+ {
+ lstrcpynA(buff, defvalue, buff_len);
+ ret = strlen(buff);
+ }
+
+ return ret;