[PATCH] explorer: unload graphics driver and delete registry

Alexandre Julliard julliard at winehq.org
Tue Dec 4 12:13:51 CST 2018


Daniel Wendt <daniel.wendt at linux.com> writes:

> From f173066520e724b2a6b80f0097b6df715db899aa Mon Sep 17 00:00:00 2001
> From: Daniel Wendt <daniel.wendt at linux.com>
> Date: Mon, 3 Dec 2018 14:33:44 +0100
> Subject: [PATCH] explorer: unload graphics driver and delete registry
>  keys
>
> Registry keys are no longer used after the driver has been unloaded.
>
> The string constant is divided and set globally so that the created
> key and folder can be completely removed from the registry.
>
> Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46233
> ---
>  programs/explorer/desktop.c | 76 ++++++++++++++++++++++++++++++++-----
>  1 file changed, 66 insertions(+), 10 deletions(-)
>
> diff --git a/programs/explorer/desktop.c b/programs/explorer/desktop.c
> index 27b9b24901..029afd74cc 100644
> --- a/programs/explorer/desktop.c
> +++ b/programs/explorer/desktop.c
> @@ -856,6 +858,59 @@ static HMODULE load_graphics_driver( const WCHAR *driver, const GUID *guid )
>      return module;
>  }
>  
> +static void unload_graphics_driver( HMODULE graphics_driver, const GUID *guid )
> +{
> +    HKEY hkey;
> +    LONG reg_ret;
> +    WCHAR key[ARRAY_SIZE( device_keyW ) + ARRAY_SIZE( device_subkeyW ) + 39];
> +
> +    if(graphics_driver)
> +    {
> +        if (!FreeLibrary( graphics_driver ))
> +        switch (GetLastError())
> +        {
> +        default:
> +            WINE_ERR("Could not unload graphics driver: Unknown error (%u).\n", GetLastError());
> +            break;
> +        }
> +    }

Unloading the driver is not useful.

> +    sprintfW( key, device_keyW, guid->Data1, guid->Data2, guid->Data3,
> +          guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3],
> +          guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7] );
> +
> +    strcatW( key, device_subkeyW);
> +    reg_ret = RegOpenKeyW( HKEY_LOCAL_MACHINE, key, &hkey );
> +    if (reg_ret == ERROR_SUCCESS)
> +    {
> +        RegDeleteKeyW( HKEY_LOCAL_MACHINE, key );
> +        RegCloseKey( hkey );
> +    }
> +    reg_ret = RegOpenKeyW( HKEY_CURRENT_CONFIG, key, &hkey );
> +    if (reg_ret == ERROR_SUCCESS)
> +    {
> +        RegDeleteKeyW( HKEY_CURRENT_CONFIG, key );
> +        RegCloseKey( hkey );
> +    }
> +
> +    sprintfW( key, device_keyW, guid->Data1, guid->Data2, guid->Data3,
> +          guid->Data4[0], guid->Data4[1], guid->Data4[2], guid->Data4[3],
> +          guid->Data4[4], guid->Data4[5], guid->Data4[6], guid->Data4[7] );
> +
> +    reg_ret = RegOpenKeyW( HKEY_LOCAL_MACHINE, key, &hkey );
> +    if (reg_ret == ERROR_SUCCESS)
> +    {
> +        RegDeleteKeyW( HKEY_LOCAL_MACHINE, key );
> +        RegCloseKey( hkey );
> +    }
> +    reg_ret = RegOpenKeyW( HKEY_CURRENT_CONFIG, key, &hkey );
> +    if (reg_ret == ERROR_SUCCESS)
> +    {
> +        RegDeleteKeyW( HKEY_CURRENT_CONFIG, key );
> +        RegCloseKey( hkey );
> +    }

You should avoid duplicating all this code. Also the HKEY_CURRENT_CONFIG
key probably shouldn't exist in the first place.

-- 
Alexandre Julliard
julliard at winehq.org



More information about the wine-devel mailing list