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:
parent
89f8ba2129
commit
2bb013b155
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue