kernel32: Reimplement GetLogicalDrives using QueryDosDevice

Alexandre Goujon ale.goujon at gmail.com
Tue Jul 24 14:54:28 CDT 2012


Superseeds patch #88499
---
 dlls/kernel32/volume.c |   45 +++++++++++++++++++++++++++------------------
 1 file changed, 27 insertions(+), 18 deletions(-)

diff --git a/dlls/kernel32/volume.c b/dlls/kernel32/volume.c
index 8377e41..dc76c15 100644
--- a/dlls/kernel32/volume.c
+++ b/dlls/kernel32/volume.c
@@ -1435,28 +1435,37 @@ 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;
-    int i;
+    DWORD res, size=MAX_PATH, bitmask=0;
+    char *buffer=NULL, *p;
 
-    if (!(buffer = HeapAlloc( GetProcessHeap(), 0, strlen(config_dir) + sizeof("/dosdevices/a:") )))
+    do
     {
-        SetLastError( ERROR_NOT_ENOUGH_MEMORY );
-        return 0;
-    }
-    strcpy( buffer, config_dir );
-    strcat( buffer, "/dosdevices/a:" );
-    dev = buffer + strlen(buffer) - 2;
+        buffer = HeapAlloc( GetProcessHeap(), 0, size );
+        if(!buffer)
+        {
+            SetLastError(ERROR_INSUFFICIENT_BUFFER);
+            return 0;
+        }
 
-    for (i = 0; i < 26; i++)
-    {
-        *dev = 'a' + i;
-        if (!stat( buffer, &st )) ret |= (1 << i);
+        res = QueryDosDeviceA(NULL, buffer, size);
+        if(!res)
+        {
+            if(GetLastError() == ERROR_INSUFFICIENT_BUFFER)
+            {
+                size *=  2;
+                HeapFree( GetProcessHeap(), 0, buffer);
+            }
+            else
+                return 0;
+        }
     }
-    HeapFree( GetProcessHeap(), 0, buffer );
-    return ret;
+    while(!res && GetLastError() == ERROR_INSUFFICIENT_BUFFER);
+
+    for(p=buffer; p-buffer<res; p += strlen(p)+1)
+        if(strlen(p)==2 && p[1]==':')
+            bitmask |= 1 << (p[0]-'A');
+
+    return bitmask;
 }
 
 
-- 
1.7.9.5




More information about the wine-patches mailing list