kernel32: Check NT symlink first for all devices in QueryDosDeviceW.

oldstable
Alexandre Julliard 2015-05-21 17:35:06 +09:00
parent c0ac2afb19
commit f32600d3c1
1 changed files with 19 additions and 18 deletions

View File

@ -1282,34 +1282,35 @@ DWORD WINAPI QueryDosDeviceW( LPCWSTR devname, LPWSTR target, DWORD bufsize )
{
WCHAR *p, name[5];
char *path, *link;
WCHAR *buffer;
DWORD dosdev, ret = 0;
if ((dosdev = RtlIsDosDeviceName_U( devname )))
{
memcpy( name, devname + HIWORD(dosdev)/sizeof(WCHAR), LOWORD(dosdev) );
name[LOWORD(dosdev)/sizeof(WCHAR)] = 0;
devname = name;
}
else
{
WCHAR *buffer;
if (!(buffer = HeapAlloc( GetProcessHeap(), 0, sizeof(dosdevW) + strlenW(devname)*sizeof(WCHAR) )))
{
SetLastError( ERROR_OUTOFMEMORY );
return 0;
}
memcpy( buffer, dosdevW, sizeof(dosdevW) );
strcatW( buffer, devname );
status = read_nt_symlink( buffer, target, bufsize );
HeapFree( GetProcessHeap(), 0, buffer );
if (status)
{
SetLastError( RtlNtStatusToDosError(status) );
return 0;
}
if (!(buffer = HeapAlloc( GetProcessHeap(), 0, sizeof(dosdevW) + strlenW(devname)*sizeof(WCHAR) )))
{
SetLastError( ERROR_OUTOFMEMORY );
return 0;
}
memcpy( buffer, dosdevW, sizeof(dosdevW) );
strcatW( buffer, devname );
status = read_nt_symlink( buffer, target, bufsize );
HeapFree( GetProcessHeap(), 0, buffer );
if (!status)
{
ret = strlenW( target ) + 1;
goto done;
}
if (!dosdev) /* not a special DOS device */
{
SetLastError( RtlNtStatusToDosError(status) );
return 0;
}
/* FIXME: should read NT symlink for all devices */
@ -1322,7 +1323,7 @@ DWORD WINAPI QueryDosDeviceW( LPCWSTR devname, LPWSTR target, DWORD bufsize )
ret = MultiByteToWideChar( CP_UNIXCP, 0, link, -1, target, bufsize );
HeapFree( GetProcessHeap(), 0, link );
}
else if (dosdev) /* look for device defaults */
else /* look for device defaults */
{
if (!strcmpiW( name, auxW ))
{