kernel32: Reimplement GetLogicalDrives using the mountmgr

Alexandre Julliard julliard at winehq.org
Mon Jul 23 08:03:17 CDT 2012


Alexandre Goujon <ale.goujon at gmail.com> writes:

> Previous approach was patch #88280
> ---
>  dlls/kernel32/volume.c |   18 +++---------------
>  1 file changed, 3 insertions(+), 15 deletions(-)
>
> diff --git a/dlls/kernel32/volume.c b/dlls/kernel32/volume.c
> index 8377e41..57453bb 100644
> --- a/dlls/kernel32/volume.c
> +++ b/dlls/kernel32/volume.c
> @@ -1435,27 +1435,15 @@ DWORD WINAPI QueryDosDeviceA( LPCSTR devname, LPSTR target, DWORD bufsize )
>   */
>  DWORD WINAPI GetLogicalDrives(void)
>  {
> -    const char *config_dir = wine_get_config_dir();
> -    struct stat st;
> -    char *buffer, *dev;
>      DWORD ret = 0;
> +    WCHAR drive;
>      int i;
>  
> -    if (!(buffer = HeapAlloc( GetProcessHeap(), 0, strlen(config_dir) + sizeof("/dosdevices/a:") )))
> -    {
> -        SetLastError( ERROR_NOT_ENOUGH_MEMORY );
> -        return 0;
> -    }
> -    strcpy( buffer, config_dir );
> -    strcat( buffer, "/dosdevices/a:" );
> -    dev = buffer + strlen(buffer) - 2;
> -
>      for (i = 0; i < 26; i++)
>      {
> -        *dev = 'a' + i;
> -        if (!stat( buffer, &st )) ret |= (1 << i);
> +        drive = 'A'+i;
> +        if (get_mountmgr_drive_type(&drive) != DRIVE_UNKNOWN) ret |= (1 << i);
>      }

That's very inefficient. There are better way of enumerating drives,
check for instance QueryDosDevice.

-- 
Alexandre Julliard
julliard at winehq.org



More information about the wine-devel mailing list