Hi list,
Can someone help me get through the wineserver code for passing data through a buffer in response to an ioctl?
Our (slightly out of date 1.3.24 version of) Wine is getting INVALID_HANDLE_VALUE returned for FindFirstVolume. The problem is that the FindNextVolume call inside FindFirstVolume fails because it is told there are no mount points.
I have tracked the code through FindFirstVolume through NtDeviceIoControlFile to server_ioctl_file on the app side.
On the wineserver side I can see the wineserver fielding the ioctl request, and mountmgr.sys filling a buffer with 5 mount points.
But this information is being written into a buffer (address 0x12510) by the wineserver that is not making it back to FindNextVolume buffer (address 0x29820) on the app side.
Where do these buffers come from? Do they use shared memory? Or is the info passed through a pipe? I'm having trouble making my way through the wineserver code, so any tips or pointers would be appreciated!
Thank you,
Michael Ost Muse Research, Inc.
On 12/12/2012 11:00 PM, Michael Ost wrote:
Hi list,
Can someone help me get through the wineserver code for passing data through a buffer in response to an ioctl?
Our (slightly out of date 1.3.24 version of) Wine is getting INVALID_HANDLE_VALUE returned for FindFirstVolume. The problem is that the FindNextVolume call inside FindFirstVolume fails because it is told there are no mount points.
I have tracked the code through FindFirstVolume through NtDeviceIoControlFile to server_ioctl_file on the app side.
On the wineserver side I can see the wineserver fielding the ioctl request, and mountmgr.sys filling a buffer with 5 mount points.
But this information is being written into a buffer (address 0x12510) by the wineserver that is not making it back to FindNextVolume buffer (address 0x29820) on the app side.
Where do these buffers come from? Do they use shared memory? Or is the info passed through a pipe? I'm having trouble making my way through the wineserver code, so any tips or pointers would be appreciated!
Thank you,
Michael Ost Muse Research, Inc.
Hi Michael,
First, some tips: Have you tested the latest version of wine (v1.3.24 is 17 months old) ? There are some helpful debug channels which can help you like 'volume' or 'server'. I only recommend 'relay' if you're despaired (remember there is a registry key that hide some very-repetitive-and-often-useless calls)
I built a simple test case and I don't get any error. You said there is no mount points but you should at least get the C drive and the drive corresponding to /. Is your wine prefix working ? Try with a new one (WINEPREFIX=~/wine_test for instance)
I'm not used to debug wineserver issues and I'm happy with that because debugging multi-thread apps is often a mess. But after some research, it seems to be a pipe. So server_ioctl_file (ntdll/file) calls wine_server_call (ntdll/server) calling then send_request (same file) which writes to ntdll_get_thread_data()->request_fd. This one seems to be initialized in RtlCreateUserThread (ntdll/thread).
Hope it helps..