FWIIW, got it to work by loading ntdll.dll and getting the proc to the wine_server_fd_to_handle() function and using it on the fd. After that I could use Win32 functions on the handle as suggested. It is kinda funny that I can use a handle to the underlying fd but I can not use the fd.
In any case, thanks for all your help.
On Sun, Dec 22, 2019 at 10:00 AM Bruno Albuquerque bga@gmail.com wrote:
Thanks.
My question is now how to access that function from my Windows program as it does not seem to be directly available (i.e. in a importable header file). In any cae, is it similar to _get_osfhandle()? I was considering using it (it is documented by Microsoft) but I also failed at including "msvcrt/io.h" (not found).
On Sun, Dec 22, 2019 at 8:12 AM Alexandre Julliard julliard@winehq.org wrote:
Zebediah Figura z.figura12@gmail.com writes:
On 12/22/19 6:40 AM, Gabriel Ivăncescu wrote:
On 12/21/19 5:34 PM, Bruno Albuquerque wrote:
Thanks. That led me to the init_user_process_params() where it seems stdin/stdout/stderr are mapped to the running Windows program. I
could
not find any code that would do anything with other inherited opened
fds
and that led me to think that there is really no special handling and
it
somehow just happens to work with a winelib program (most
likely because
it has a bigger Linux surface to it).
Based on this, I guess what I really want to know is:
1 - Does a non-winelib Windows program have access to opened fds inherited during a fork/exec of Wine? 2 - If so, is there a way to actually use those fds in the Windows
program?
Hi Bruno,
I'm not sure if this is feasible to you, but keep in mind that
"Windows
programs" ran under Wine are technically still running on Linux. So
you
still have access to Linux syscalls (but not libraries, unless you
load
them manually, which is not worth it).
One possible hack to do this in a "generic" way would be:
Use an exception handler in your app.
Call the 'uname' system call to make sure the returned sysname is
'Linux'. If the syscall results in an exception, then it's obviously
not
running on Linux (it could be running on Windows), so do the necessary thing there.
There's also wine_get_host_version(), exported from ntdll, which would probably be easier.
In order to get access to file descriptors in the first place, you can use the counterpart wine_server_handle_to_fd() [also exported from
ntdll].
Or use wine_server_fd_to_handle() and call Win32 APIs instead of direct syscalls, that's even easier...
-- Alexandre Julliard julliard@winehq.org