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..
#include <stdio.h>
#include <windows.h>
int main(int argc, char **argv)
{
BOOL found;
HANDLE findHandle;
WCHAR volumeName[MAX_PATH];
findHandle = FindFirstVolumeW(volumeName, MAX_PATH);
if(findHandle == INVALID_HANDLE_VALUE)
{
printf("FindFirstVolumeW failed with %u\n", GetLastError());
return -1;
}
for(;;)
{
printf("--> '%ls'\n", volumeName);
if(!FindNextVolumeW(findHandle, volumeName, MAX_PATH))
{
if(GetLastError() != ERROR_NO_MORE_FILES)
{
printf("FindNextVolumeW failed with %u\n", GetLastError());
break;
}
break;
}
}
FindVolumeClose(findHandle);
return 0;
}