diff --git a/dlls/advapi32/advapi32.spec b/dlls/advapi32/advapi32.spec index 043009a5a52..5e0b3e68eaa 100644 --- a/dlls/advapi32/advapi32.spec +++ b/dlls/advapi32/advapi32.spec @@ -201,8 +201,8 @@ @ stub RegOpenUserClassesRoot @ stdcall RegQueryInfoKeyA(long ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) RegQueryInfoKeyA @ stdcall RegQueryInfoKeyW(long ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr ptr) RegQueryInfoKeyW -@ stub RegQueryMultipleValuesA -@ stub RegQueryMultipleValuesW +@ stdcall RegQueryMultipleValuesA(long ptr long ptr ptr) RegQueryMultipleValuesA +@ stdcall RegQueryMultipleValuesW(long ptr long ptr ptr) RegQueryMultipleValuesW @ stdcall RegQueryValueA(long str ptr ptr) RegQueryValueA @ stdcall RegQueryValueExA(long str ptr ptr ptr ptr) RegQueryValueExA @ stdcall RegQueryValueExW(long wstr ptr ptr ptr ptr) RegQueryValueExW diff --git a/dlls/advapi32/registry.c b/dlls/advapi32/registry.c index 61858afd090..98e881f076d 100644 --- a/dlls/advapi32/registry.c +++ b/dlls/advapi32/registry.c @@ -510,6 +510,92 @@ DWORD WINAPI RegQueryInfoKeyW( HKEY hkey, LPWSTR class, LPDWORD class_len, LPDWO } +/****************************************************************************** + * RegQueryMultipleValuesA [ADVAPI32.@] + */ +DWORD WINAPI RegQueryMultipleValuesA(HKEY hkey, PVALENTA val_list, DWORD num_vals, + LPSTR lpValueBuf, LPDWORD ldwTotsize) +{ + int i; + DWORD maxBytes = *ldwTotsize; + HRESULT status; + LPSTR bufptr = lpValueBuf; + *ldwTotsize = 0; + + TRACE("(%x,%p,%ld,%p,%p=%ld)\n", hkey, val_list, num_vals, lpValueBuf, ldwTotsize, *ldwTotsize); + + for(i=0; i < num_vals; ++i) + { + + val_list[i].ve_valuelen=0; + status = RegQueryValueExA(hkey, val_list[i].ve_valuename, NULL, NULL, NULL, &val_list[i].ve_valuelen); + if(status != ERROR_SUCCESS) + { + return status; + } + + if(lpValueBuf != NULL && *ldwTotsize + val_list[i].ve_valuelen <= maxBytes) + { + status = RegQueryValueExA(hkey, val_list[i].ve_valuename, NULL, &val_list[i].ve_type, + bufptr, &val_list[i].ve_valuelen); + if(status != ERROR_SUCCESS) + { + return status; + } + + val_list[i].ve_valueptr = (DWORD_PTR)bufptr; + + bufptr += val_list[i].ve_valuelen; + } + + *ldwTotsize += val_list[i].ve_valuelen; + } + return lpValueBuf != NULL && *ldwTotsize <= maxBytes ? ERROR_SUCCESS : ERROR_MORE_DATA; +} + + +/****************************************************************************** + * RegQueryMultipleValuesW [ADVAPI32.@] + */ +DWORD WINAPI RegQueryMultipleValuesW(HKEY hkey, PVALENTW val_list, DWORD num_vals, + LPWSTR lpValueBuf, LPDWORD ldwTotsize) +{ + int i; + DWORD maxBytes = *ldwTotsize; + HRESULT status; + LPSTR bufptr = (LPSTR)lpValueBuf; + *ldwTotsize = 0; + + TRACE("(%x,%p,%ld,%p,%p=%ld)\n", hkey, val_list, num_vals, lpValueBuf, ldwTotsize, *ldwTotsize); + + for(i=0; i < num_vals; ++i) + { + val_list[i].ve_valuelen=0; + status = RegQueryValueExW(hkey, val_list[i].ve_valuename, NULL, NULL, NULL, &val_list[i].ve_valuelen); + if(status != ERROR_SUCCESS) + { + return status; + } + + if(lpValueBuf != NULL && *ldwTotsize + val_list[i].ve_valuelen <= maxBytes) + { + status = RegQueryValueExW(hkey, val_list[i].ve_valuename, NULL, &val_list[i].ve_type, + bufptr, &val_list[i].ve_valuelen); + if(status != ERROR_SUCCESS) + { + return status; + } + + val_list[i].ve_valueptr = (DWORD_PTR)bufptr; + + bufptr += val_list[i].ve_valuelen; + } + + *ldwTotsize += val_list[i].ve_valuelen; + } + return lpValueBuf != NULL && *ldwTotsize <= maxBytes ? ERROR_SUCCESS : ERROR_MORE_DATA; +} + /****************************************************************************** * RegQueryInfoKeyA [ADVAPI32.@] */ diff --git a/include/winreg.h b/include/winreg.h index c5e7b634b34..1d998325009 100644 --- a/include/winreg.h +++ b/include/winreg.h @@ -87,6 +87,9 @@ DWORD WINAPI RegQueryInfoKeyA(HKEY,LPSTR,LPDWORD,LPDWORD,LPDWORD, LPDWORD,LPDWORD,LPDWORD,LPDWORD,LPDWORD, LPDWORD,LPFILETIME); #define RegQueryInfoKey WINELIB_NAME_AW(RegQueryInfoKey) +DWORD WINAPI RegQueryMultipleValuesA(HKEY,PVALENTA,DWORD,LPSTR,LPDWORD); +DWORD WINAPI RegQueryMultipleValuesW(HKEY,PVALENTW,DWORD,LPWSTR,LPDWORD); +#define RegQueryMultipleValues WINELIB_NAME_AW(RegQueryMultipleValues) LONG WINAPI RegReplaceKeyA(HKEY,LPCSTR,LPCSTR,LPCSTR); LONG WINAPI RegReplaceKeyW(HKEY,LPCWSTR,LPCWSTR,LPCWSTR); #define RegReplaceKey WINELIB_NAME_AW(RegReplaceKey)