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 today. cgf
