Fix wide character functions to return character count in character

quantities not byte quantities.  Make RegQueryInfoKey and
RegQueryInfoKey behave correctly in win95 mode.
This commit is contained in:
John Richardson 1998-11-06 17:36:13 +00:00 committed by Alexandre Julliard
parent 89f8ba2129
commit 2bb013b155
1 changed files with 40 additions and 16 deletions

View File

@ -38,6 +38,7 @@
#include "debug.h" #include "debug.h"
#include "xmalloc.h" #include "xmalloc.h"
#include "winreg.h" #include "winreg.h"
#include "winversion.h"
static void REGISTRY_Init(); static void REGISTRY_Init();
/* FIXME: following defines should be configured global ... */ /* FIXME: following defines should be configured global ... */
@ -2660,7 +2661,7 @@ DWORD WINAPI RegEnumKeyEx32W( HKEY hkey, DWORD iSubkey, LPWSTR lpszName,
if (iSubkey || !lpxkey) if (iSubkey || !lpxkey)
return ERROR_NO_MORE_ITEMS; return ERROR_NO_MORE_ITEMS;
if (2*lstrlen32W(lpxkey->keyname)+2>*lpcchName) if (lstrlen32W(lpxkey->keyname)+1>*lpcchName)
return ERROR_MORE_DATA; return ERROR_MORE_DATA;
memcpy(lpszName,lpxkey->keyname,lstrlen32W(lpxkey->keyname)*2+2); memcpy(lpszName,lpxkey->keyname,lstrlen32W(lpxkey->keyname)*2+2);
@ -2789,6 +2790,9 @@ DWORD WINAPI RegEnumKey16( HKEY hkey, DWORD iSubkey, LPSTR lpszName,
* lpdwType [O] Type code * lpdwType [O] Type code
* lpbData [O] Value data * lpbData [O] Value data
* lpcbData [O] Size of data buffer * lpcbData [O] Size of data buffer
*
* Note: wide character functions that take and/or return "character counts"
* use TCHAR (that is unsigned short or char) not byte counts.
*/ */
DWORD WINAPI RegEnumValue32W( HKEY hkey, DWORD iValue, LPWSTR lpszValue, DWORD WINAPI RegEnumValue32W( HKEY hkey, DWORD iValue, LPWSTR lpszValue,
LPDWORD lpcchValue, LPDWORD lpdReserved, LPDWORD lpcchValue, LPDWORD lpdReserved,
@ -2812,12 +2816,12 @@ DWORD WINAPI RegEnumValue32W( HKEY hkey, DWORD iValue, LPWSTR lpszValue,
val = lpkey->values + iValue; val = lpkey->values + iValue;
if (val->name) { if (val->name) {
if (lstrlen32W(val->name)*2+2>*lpcchValue) { if (lstrlen32W(val->name)+1>*lpcchValue) {
*lpcchValue = lstrlen32W(val->name)*2+2; *lpcchValue = lstrlen32W(val->name)+1;
return ERROR_MORE_DATA; return ERROR_MORE_DATA;
} }
memcpy(lpszValue,val->name,2*lstrlen32W(val->name)+2); memcpy(lpszValue,val->name,2*lstrlen32W(val->name)+2);
*lpcchValue=lstrlen32W(val->name)*2+2; *lpcchValue=lstrlen32W(val->name);
} else { } else {
*lpszValue = 0; *lpszValue = 0;
*lpcchValue = 0; *lpcchValue = 0;
@ -3182,6 +3186,11 @@ DWORD WINAPI RegFlushKey( HKEY hkey )
* lpccbMaxValueData [O] Buffer for longest value data length * lpccbMaxValueData [O] Buffer for longest value data length
* lpcbSecurityDescriptor [O] Buffer for security descriptor length * lpcbSecurityDescriptor [O] Buffer for security descriptor length
* ft * ft
* - win95 allows lpszClass to be valid and lpcchClass to be NULL
* - winnt returns ERROR_INVALID_PARAMETER if lpszClass is valid and
* lpcchClass is NULL
* - both allow lpszClass to be NULL and lpcchClass to be NULL
* (it's hard to test validity, so test !NULL instead)
*/ */
DWORD WINAPI RegQueryInfoKey32W( HKEY hkey, LPWSTR lpszClass, DWORD WINAPI RegQueryInfoKey32W( HKEY hkey, LPWSTR lpszClass,
LPDWORD lpcchClass, LPDWORD lpdwReserved, LPDWORD lpcchClass, LPDWORD lpdwReserved,
@ -3200,20 +3209,29 @@ DWORD WINAPI RegQueryInfoKey32W( HKEY hkey, LPWSTR lpszClass,
if (!lpkey) if (!lpkey)
return ERROR_INVALID_HANDLE; return ERROR_INVALID_HANDLE;
if (lpszClass) { if (lpszClass) {
if (VERSION_GetVersion() == NT40 && lpcchClass == NULL) {
return ERROR_INVALID_PARAMETER;
}
/* either lpcchClass is valid or this is win95 and lpcchClass
could be invalid */
if (lpkey->class) { if (lpkey->class) {
if (lstrlen32W(lpkey->class)*2+2>*lpcchClass) { DWORD classLen = lstrlen32W(lpkey->class);
*lpcchClass=lstrlen32W(lpkey->class)*2;
if (lpcchClass && classLen+1>*lpcchClass) {
*lpcchClass=classLen+1;
return ERROR_MORE_DATA; return ERROR_MORE_DATA;
} }
*lpcchClass=lstrlen32W(lpkey->class)*2; if (lpcchClass)
memcpy(lpszClass,lpkey->class,lstrlen32W(lpkey->class)); *lpcchClass=classLen;
memcpy(lpszClass,lpkey->class, classLen*2 + 2);
} else { } else {
*lpszClass = 0; *lpszClass = 0;
*lpcchClass = 0; if (lpcchClass)
*lpcchClass = 0;
} }
} else { } else {
if (lpcchClass) if (lpcchClass)
*lpcchClass = lstrlen32W(lpkey->class)*2; *lpcchClass = lstrlen32W(lpkey->class);
} }
lpxkey=lpkey->nextsub; lpxkey=lpkey->nextsub;
nrofkeys=maxsubkey=maxclass=maxvname=maxvdata=0; nrofkeys=maxsubkey=maxclass=maxvname=maxvdata=0;
@ -3240,9 +3258,9 @@ DWORD WINAPI RegQueryInfoKey32W( HKEY hkey, LPWSTR lpszClass,
if (lpcSubKeys) if (lpcSubKeys)
*lpcSubKeys = nrofkeys; *lpcSubKeys = nrofkeys;
if (lpcchMaxSubkey) if (lpcchMaxSubkey)
*lpcchMaxSubkey = maxsubkey*2; *lpcchMaxSubkey = maxsubkey;
if (lpcchMaxClass) if (lpcchMaxClass)
*lpcchMaxClass = maxclass*2; *lpcchMaxClass = maxclass;
if (lpcchMaxValueName) if (lpcchMaxValueName)
*lpcchMaxValueName= maxvname; *lpcchMaxValueName= maxvname;
if (lpccbMaxValueData) if (lpccbMaxValueData)
@ -3261,13 +3279,19 @@ DWORD WINAPI RegQueryInfoKey32A( HKEY hkey, LPSTR lpszClass, LPDWORD lpcchClass,
LPDWORD lpccbMaxValueData, LPDWORD lpccbMaxValueData,
LPDWORD lpcbSecurityDescriptor, FILETIME *ft ) LPDWORD lpcbSecurityDescriptor, FILETIME *ft )
{ {
LPWSTR lpszClassW; LPWSTR lpszClassW = NULL;
DWORD ret; DWORD ret;
TRACE(reg,"(%x,......)\n",hkey); TRACE(reg,"(%x,%p,%p......)\n",hkey, lpszClass, lpcchClass);
if (lpszClass) { if (lpszClass) {
*lpcchClass*= 2; if (lpcchClass) {
lpszClassW = (LPWSTR)xmalloc(*lpcchClass); lpszClassW = (LPWSTR)xmalloc((*lpcchClass) * 2);
} else if (VERSION_GetVersion() == WIN95) {
/* win95 allows lpcchClass to be null */
/* we don't know how big lpszClass is, would
MAX_PATHNAME_LEN be the correct default? */
lpszClassW = (LPWSTR)xmalloc(MAX_PATHNAME_LEN*2);
}
} else } else
lpszClassW = NULL; lpszClassW = NULL;