Fixed a few problems with RegEnumKey*.
This commit is contained in:
parent
c7cc6f128b
commit
13d00c8dd1
145
misc/registry.c
145
misc/registry.c
|
@ -3020,55 +3020,63 @@ DWORD WINAPI RegEnumKeyExW( HKEY hkey, DWORD iSubkey, LPWSTR lpszName,
|
||||||
LPWSTR lpszClass, LPDWORD lpcchClass,
|
LPWSTR lpszClass, LPDWORD lpcchClass,
|
||||||
FILETIME *ft )
|
FILETIME *ft )
|
||||||
{
|
{
|
||||||
LPKEYSTRUCT lpkey,lpxkey;
|
LPKEYSTRUCT lpkey,lpxkey;
|
||||||
|
|
||||||
TRACE_(reg)("(%x,%ld,%p,%ld,%p,%p,%p,%p)\n",hkey,iSubkey,lpszName,
|
TRACE_(reg)("(%x,%ld,%p,%p(%ld),%p,%p,%p,%p)\n",hkey,iSubkey,lpszName,
|
||||||
*lpcchName,lpdwReserved,lpszClass,lpcchClass,ft);
|
lpcchName,lpcchName? *lpcchName : -1,lpdwReserved,lpszClass,
|
||||||
|
lpcchClass,ft);
|
||||||
|
|
||||||
lpkey = lookup_hkey( hkey );
|
lpkey = lookup_hkey( hkey );
|
||||||
if (!lpkey)
|
if (!lpkey)
|
||||||
return ERROR_INVALID_HANDLE;
|
return ERROR_INVALID_HANDLE;
|
||||||
|
|
||||||
if (!lpkey->nextsub)
|
if (!lpcchName)
|
||||||
return ERROR_NO_MORE_ITEMS;
|
return ERROR_INVALID_PARAMETER;
|
||||||
lpxkey=lpkey->nextsub;
|
|
||||||
|
if (!lpkey->nextsub)
|
||||||
|
return ERROR_NO_MORE_ITEMS;
|
||||||
|
lpxkey=lpkey->nextsub;
|
||||||
|
|
||||||
/* Traverse the subkeys */
|
/* Traverse the subkeys */
|
||||||
while (iSubkey && lpxkey) {
|
while (iSubkey && lpxkey) {
|
||||||
iSubkey--;
|
iSubkey--;
|
||||||
lpxkey=lpxkey->next;
|
lpxkey=lpxkey->next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (iSubkey || !lpxkey)
|
if (iSubkey || !lpxkey)
|
||||||
return ERROR_NO_MORE_ITEMS;
|
return ERROR_NO_MORE_ITEMS;
|
||||||
if (lstrlenW(lpxkey->keyname)+1>*lpcchName) {
|
if (lstrlenW(lpxkey->keyname)+1>*lpcchName) {
|
||||||
*lpcchName = lstrlenW(lpxkey->keyname)+1;
|
*lpcchName = lstrlenW(lpxkey->keyname);
|
||||||
return ERROR_MORE_DATA;
|
return ERROR_MORE_DATA;
|
||||||
}
|
}
|
||||||
memcpy(lpszName,lpxkey->keyname,lstrlenW(lpxkey->keyname)*2+2);
|
memcpy(lpszName,lpxkey->keyname,lstrlenW(lpxkey->keyname)*2+2);
|
||||||
|
*lpcchName = lstrlenW(lpszName);
|
||||||
|
|
||||||
if (*lpcchName)
|
if (lpszClass) {
|
||||||
*lpcchName = lstrlenW(lpszName);
|
/* FIXME: what should we write into it? */
|
||||||
|
*lpszClass = 0;
|
||||||
if (lpszClass) {
|
*lpcchClass = 2;
|
||||||
/* FIXME: what should we write into it? */
|
}
|
||||||
*lpszClass = 0;
|
return ERROR_SUCCESS;
|
||||||
*lpcchClass = 2;
|
|
||||||
}
|
|
||||||
return ERROR_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* RegEnumKey32W [ADVAPI32.140]
|
* RegEnumKeyW [ADVAPI32.140]
|
||||||
*/
|
*/
|
||||||
DWORD WINAPI RegEnumKeyW( HKEY hkey, DWORD iSubkey, LPWSTR lpszName,
|
DWORD WINAPI RegEnumKeyW( HKEY hkey, DWORD iSubkey, LPWSTR lpszName,
|
||||||
DWORD lpcchName )
|
DWORD lpcchName )
|
||||||
{
|
{
|
||||||
FILETIME ft;
|
DWORD ret;
|
||||||
|
|
||||||
TRACE_(reg)("(%x,%ld,%p,%ld)\n",hkey,iSubkey,lpszName,lpcchName);
|
TRACE_(reg)("(%x,%ld,%p,%ld)\n",hkey,iSubkey,lpszName,lpcchName);
|
||||||
return RegEnumKeyExW(hkey,iSubkey,lpszName,&lpcchName,NULL,NULL,NULL,&ft);
|
ret = RegEnumKeyExW(hkey,iSubkey,lpszName,&lpcchName,NULL,NULL,NULL,NULL);
|
||||||
|
|
||||||
|
/* If lpszName is NULL then we have a slightly different behaviour than
|
||||||
|
RegEnumKeyExW */
|
||||||
|
if(lpszName == NULL && ret == ERROR_MORE_DATA)
|
||||||
|
ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -3080,64 +3088,49 @@ DWORD WINAPI RegEnumKeyExA( HKEY hkey, DWORD iSubkey, LPSTR lpszName,
|
||||||
LPSTR lpszClass, LPDWORD lpcchClass,
|
LPSTR lpszClass, LPDWORD lpcchClass,
|
||||||
FILETIME *ft )
|
FILETIME *ft )
|
||||||
{
|
{
|
||||||
DWORD ret,lpcchNameW,lpcchClassW;
|
DWORD ret;
|
||||||
LPWSTR lpszNameW,lpszClassW;
|
LPWSTR lpszNameW, lpszClassW;
|
||||||
|
|
||||||
|
TRACE_(reg)("(%x,%ld,%p,%p(%ld),%p,%p,%p,%p)\n",
|
||||||
|
hkey,iSubkey,lpszName,lpcchName,lpcchName? *lpcchName : -1,
|
||||||
|
lpdwReserved,lpszClass,lpcchClass,ft);
|
||||||
|
|
||||||
TRACE_(reg)("(%x,%ld,%p,%ld,%p,%p,%p,%p)\n",
|
lpszNameW = lpszName ? (LPWSTR)xmalloc(*lpcchName * 2) : NULL;
|
||||||
hkey,iSubkey,lpszName,*lpcchName,lpdwReserved,lpszClass,lpcchClass,ft
|
lpszClassW = lpszClass ? (LPWSTR)xmalloc(*lpcchClass * 2) : NULL;
|
||||||
);
|
|
||||||
if (lpszName) {
|
ret = RegEnumKeyExW(hkey, iSubkey, lpszNameW, lpcchName, lpdwReserved,
|
||||||
lpszNameW = (LPWSTR)xmalloc(*lpcchName*2);
|
lpszClassW, lpcchClass, ft);
|
||||||
lpcchNameW = *lpcchName;
|
|
||||||
} else {
|
if (ret == ERROR_SUCCESS) {
|
||||||
lpszNameW = NULL;
|
lstrcpyWtoA(lpszName,lpszNameW);
|
||||||
lpcchNameW = 0;
|
|
||||||
}
|
|
||||||
if (lpszClass) {
|
|
||||||
lpszClassW = (LPWSTR)xmalloc(*lpcchClass*2);
|
|
||||||
lpcchClassW = *lpcchClass;
|
|
||||||
} else {
|
|
||||||
lpszClassW =0;
|
|
||||||
lpcchClassW=0;
|
|
||||||
}
|
|
||||||
ret=RegEnumKeyExW(
|
|
||||||
hkey,
|
|
||||||
iSubkey,
|
|
||||||
lpszNameW,
|
|
||||||
&lpcchNameW,
|
|
||||||
lpdwReserved,
|
|
||||||
lpszClassW,
|
|
||||||
&lpcchClassW,
|
|
||||||
ft
|
|
||||||
);
|
|
||||||
if (ret==ERROR_SUCCESS) {
|
|
||||||
lstrcpyWtoA(lpszName,lpszNameW);
|
|
||||||
*lpcchName=strlen(lpszName);
|
|
||||||
if (lpszClassW) {
|
|
||||||
lstrcpyWtoA(lpszClass,lpszClassW);
|
|
||||||
*lpcchClass=strlen(lpszClass);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (lpszNameW)
|
|
||||||
free(lpszNameW);
|
|
||||||
if (lpszClassW)
|
if (lpszClassW)
|
||||||
free(lpszClassW);
|
lstrcpyWtoA(lpszClass,lpszClassW);
|
||||||
return ret;
|
}
|
||||||
|
if (lpszNameW)
|
||||||
|
free(lpszNameW);
|
||||||
|
if (lpszClassW)
|
||||||
|
free(lpszClassW);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
* RegEnumKey32A [ADVAPI32.137]
|
* RegEnumKeyA [ADVAPI32.137]
|
||||||
*/
|
*/
|
||||||
DWORD WINAPI RegEnumKeyA( HKEY hkey, DWORD iSubkey, LPSTR lpszName,
|
DWORD WINAPI RegEnumKeyA( HKEY hkey, DWORD iSubkey, LPSTR lpszName,
|
||||||
DWORD lpcchName )
|
DWORD lpcchName )
|
||||||
{
|
{
|
||||||
FILETIME ft;
|
DWORD ret;
|
||||||
|
|
||||||
TRACE_(reg)("(%x,%ld,%p,%ld)\n",hkey,iSubkey,lpszName,lpcchName);
|
TRACE_(reg)("(%x,%ld,%p,%ld)\n",hkey,iSubkey,lpszName,lpcchName);
|
||||||
return RegEnumKeyExA( hkey, iSubkey, lpszName, &lpcchName, NULL, NULL,
|
ret = RegEnumKeyExA( hkey, iSubkey, lpszName, &lpcchName, NULL, NULL,
|
||||||
NULL, &ft );
|
NULL, NULL );
|
||||||
|
|
||||||
|
/* If lpszName is NULL then we have a slightly different behaviour than
|
||||||
|
RegEnumKeyExA */
|
||||||
|
if(lpszName == NULL && ret == ERROR_MORE_DATA)
|
||||||
|
ret = ERROR_SUCCESS;
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue