[PATCH v2 5/7] kernel32: Implement registry mapping in WritePrivateProfileSection().
Zebediah Figura
z.figura12 at gmail.com
Fri Jul 10 23:02:44 CDT 2020
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/kernel32/profile.c | 39 +++++++++++++++++++++++++++++++++++++++
1 file changed, 39 insertions(+)
diff --git a/dlls/kernel32/profile.c b/dlls/kernel32/profile.c
index 0fb4b96aedf..c21c2e3d7d4 100644
--- a/dlls/kernel32/profile.c
+++ b/dlls/kernel32/profile.c
@@ -1673,6 +1673,7 @@ BOOL WINAPI WritePrivateProfileSectionW( LPCWSTR section,
{
BOOL ret = FALSE;
LPWSTR p;
+ HKEY key, section_key;
if (!section && !string)
{
@@ -1686,6 +1687,44 @@ BOOL WINAPI WritePrivateProfileSectionW( LPCWSTR section,
}
if (!string) return PROFILE_DeleteSection( filename, section );
+ if ((key = open_file_mapping_key( filename )))
+ {
+ /* replace existing entries, but only if they are mapped, and do not
+ * delete any keys */
+
+ const WCHAR *entry, *p;
+
+ for (entry = string; *entry; entry += strlenW( entry ) + 1)
+ {
+ if ((p = strchrW( entry, '=' )))
+ {
+ WCHAR *entry_copy;
+ p++;
+ if (!(entry_copy = HeapAlloc( GetProcessHeap(), 0, (p - entry) * sizeof(WCHAR) )))
+ {
+ SetLastError( ERROR_NOT_ENOUGH_MEMORY );
+ RegCloseKey( key );
+ return FALSE;
+ }
+ lstrcpynW( entry_copy, entry, p - entry );
+ if (get_mapped_section_key( filename, section, entry_copy, TRUE, §ion_key ))
+ {
+ LSTATUS res = RegSetValueExW( section_key, entry_copy, 0, REG_SZ, (const BYTE *)p,
+ (strlenW( p ) + 1) * sizeof(WCHAR) );
+ RegCloseKey( section_key );
+ if (res)
+ {
+ SetLastError( res );
+ RegCloseKey( key );
+ return FALSE;
+ }
+ }
+ }
+ }
+ RegCloseKey( key );
+ return TRUE;
+ }
+
EnterCriticalSection( &PROFILE_CritSect );
if (PROFILE_Open( filename, TRUE ))
--
2.27.0
More information about the wine-devel
mailing list