[PATCH] QueryDosDevice in handle_to_fn

Christopher Faylor cgf-use-the-mailinglist-please@cygwin.com
Sun Mar 16 15:36:00 GMT 2008

On Sun, Mar 16, 2008 at 04:22:13PM +0100, Corinna Vinschen wrote:
>On Mar 16 03:14, Brian Dessent wrote:
>>   I debugged this and found the
>> strangest thing, when you call QueryDosDevice (NULL, fnbuf, len) to get
>> the list of all DOS devices and len >= 65536, Win32 always returns 0
>> with GetLastError set to ERROR_MORE_DATA.  Since len was being set as
>> "sizeof (OBJECT_NAME_INFORMATION) + NT_MAX_PATH * sizeof (WCHAR)" this
>> always happened, causing handle_to_fn() to simply give up and copy the
>> Win32 name into the POSIX name and return.  The attached patch fixes the
>> problem by just clamping the size of the buffer to under 64k.
><insert lament here>
>> Another observation that I had while debugging this is that calling
>> strncasematch() in this function is probably wrong -- it expands to
>> cygwin_strncasecmp(), which is a wrapper that first converts both
>> arguments to temporary UNICODE strings and then calls
>> RtlCompareUnicodeString() -- we're doing this on strings that we had
>> just converted *out* of UNICODE.  I think ascii_strncasematch() is
>> probably what we want here instead, either that or try to stay in
>> unicode throughout.
>Using ascii_strncasematch here is right because the DEVICE_PREFIX is
>plain ascii anyway.  But, yes, the function should be converted to
>do everything in WCHAR/UNICODE_STRING and only convert to char *
>when creating the final posix_fn.
>> +  /* For some reason QueryDosDevice will fail with Win32 errno 234
>> +     (ERROR_MORE_DATA) if you try to pass a buffer larger than 64k  */
>> +  size_t qddlen = len < 65536 ? len : 65535;
>len is a const value.  Checking len for being < 65536 is a constant
>expression which always results in qddlen being 65535 so the ?: is
>a noop, more or less.
>Did you test if QueryDosDeviceW has the same problem as QueryDosDeviceA?
>If not, we should use that function.

This is basically my function.  I'll try to convert it to use Unicode


More information about the Cygwin-patches mailing list