Alexandre Goujon <ale.goujon(a)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(a)winehq.org