advapi32:Get HW_PROFILE_INFO from registry (partially based on patch from Ben Collins) (try2)

Robert Shearman rob at codeweavers.com
Wed Oct 25 05:18:35 CDT 2006


Louis. Lenders wrote:
> diff --git a/dlls/advapi32/Makefile.in b/dlls/advapi32/Makefile.in
> index 1b4cf5b..da7aec4 100644
> --- a/dlls/advapi32/Makefile.in
> +++ b/dlls/advapi32/Makefile.in
> @@ -5,7 +5,7 @@ SRCDIR    = @srcdir@
>  VPATH     = @srcdir@
>  MODULE    = advapi32.dll
>  IMPORTLIB = libadvapi32.$(IMPLIBEXT)
> -IMPORTS   = kernel32 ntdll
> +IMPORTS   = kernel32 ntdll rpcrt4
>   

Please make this a DELAYIMPORTS if you have to import a function from 
rpcrt4.

>  
>  C_SRCS = \
>  	advapi.c \
> diff --git a/dlls/advapi32/advapi.c b/dlls/advapi32/advapi.c
> index 04a520a..fd2f576 100644
> --- a/dlls/advapi32/advapi.c
> +++ b/dlls/advapi32/advapi.c
> @@ -33,6 +33,7 @@ #include "winreg.h"
>  #include "winternl.h"
>  #include "winerror.h"
>  #include "appmgmt.h"
> +#include "rpc.h"
>  
>  #include "wine/library.h"
>  #include "wine/debug.h"
> @@ -116,11 +117,54 @@ GetUserNameW( LPWSTR lpszName, LPDWORD l
>   */
>  BOOL WINAPI GetCurrentHwProfileA(LPHW_PROFILE_INFOA pInfo)
>  {
> -	FIXME("(%p) semi-stub\n", pInfo);
> -	pInfo->dwDockInfo = DOCKINFO_DOCKED;
> -	strcpy(pInfo->szHwProfileGuid,"{12340001-1234-1234-1234-1233456789012}");
> -	strcpy(pInfo->szHwProfileName,"Wine Profile");
> -	return 1;
> +    UUID __RPC_FAR* Uuid=0;
> +    HKEY hkey;
> +    DWORD size;
> +    DWORD dockingstate = 0x00000000;
> +    CHAR profilename[] = "Wine Profile";
> +
> +    RegCreateKeyA(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Control\\IDConfigDB\\Hardware Profiles\\0001", &hkey);
> +
> +    size = HW_PROFILE_GUIDLEN;
> +    /*If the ProfileGuid is not in the registry, create it, and write it to the registry*/ 
> +    if(ERROR_SUCCESS != RegGetValueA(hkey, 0, "HwProfileGuid", RRF_RT_REG_SZ, 0, pInfo->szHwProfileGuid, &size))
> +      { 
> +      Uuid = HeapAlloc(GetProcessHeap(), 0, sizeof(*Uuid));
>   

You don't need to allocate memory for this variable.

> +
> +      if(RPC_S_OK != UuidCreate(Uuid))
> +        {
> +        ERR("UuidCreate failed to create a UUID");
> +        HeapFree( GetProcessHeap(), 0, Uuid );
> +        return FALSE;
> +        }
> +
> +      RegSetValueExA(hkey, "HwProfileGuid", 0, REG_SZ, (const BYTE*) debugstr_guid(Uuid), strlen(debugstr_guid(Uuid)));
>   

You shouldn't be using a debugging command for formating a GUID to a 
string, as the function could change its output later on and break this 
function.

> +      }
> +
> +    RegGetValueA(hkey, 0, "HwProfileGuid", RRF_RT_REG_SZ, 0, pInfo->szHwProfileGuid, &size);
> +    HeapFree( GetProcessHeap(), 0, Uuid );
> +
> +    size = MAX_PROFILE_LEN;
> +    /*If the ProfileName is not in the registry create it, and write to the registry*/ 
> +    if(ERROR_SUCCESS != RegGetValueA(hkey, 0, "FriendlyName", RRF_RT_REG_SZ, 0, pInfo->szHwProfileName, &size))
> +    RegSetValueExA(hkey, "FriendlyName", 0, REG_SZ, (const BYTE*) profilename, sizeof(profilename));
> +    RegGetValueA(hkey, 0, "FriendlyName", RRF_RT_REG_SZ, 0, pInfo->szHwProfileName, &size);
> +
> +    RegCloseKey(hkey);
> +
> +    RegCreateKeyA(HKEY_LOCAL_MACHINE, "System\\CurrentControlSet\\Control\\IDConfigDB\\CurrentDockInfo", &hkey);
> +
> +    size = sizeof(DWORD);
> +    /*If the DockingState is not in the registry create it, and write to the registry*/
> +    if(ERROR_SUCCESS != RegGetValueA(hkey, 0, "DockingState", RRF_RT_DWORD , 0, &pInfo->dwDockInfo, &size))
> +    RegSetValueExA(hkey, "DockingState", 0, REG_DWORD, (const BYTE*) &dockingstate, sizeof(DWORD));
> +    RegGetValueA(hkey, 0, "DockingState", RRF_RT_DWORD, 0, &pInfo->dwDockInfo, &size);
> +
> +    RegCloseKey(hkey);
> +
> +    TRACE("DockInfo = %x, Profile Guid = %s, Friendly Name = %s\n", pInfo->dwDockInfo, pInfo->szHwProfileGuid, pInfo->szHwProfileName);
> +
> +    return 1;
>  }
>  
>  /******************************************************************************
>   

You could also do with some error checking here.

-- 
Rob Shearman




More information about the wine-devel mailing list