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