http://bugs.winehq.org/show_bug.cgi?id=18643
--- Comment #9 from Anastasius Focht focht@gmx.net 2009-05-30 11:31:18 --- Hello again,
handling FSCTL_PIPE_LISTEN (ps_wait_connect) synchronously seems to help - even if the pipe was created with overlapped flags - the app starts downloading updates and proceeds further. Maybe ConnectNamedPipe()'s NULL overlapped has precedence over fd options... AJ probably knows ;-)
Relevant snippet:
--- snip server/named_pipe.c ---
static obj_handle_t pipe_server_ioctl( struct fd *fd, ioctl_code_t code, const async_data_t *async_data, int blocking, const void *data, data_size_t size ) { struct pipe_server *server = get_fd_user( fd ); struct async *async; obj_handle_t wait_handle = 0;
switch(code) { case FSCTL_PIPE_LISTEN: switch(server->state) { case ps_idle_server: case ps_wait_connect: if (blocking && !is_overlapped( get_fd_options(fd) )) { async_data_t new_data = *async_data; if (!(wait_handle = alloc_wait_event( current->process ))) break; new_data.event = wait_handle; if (!(async = fd_queue_async( server->ioctl_fd, &new_data, ASYNC_TYPE_WAIT ))) { close_handle( current->process, wait_handle ); break; } } else async = fd_queue_async( server->ioctl_fd, async_data, ASYNC_TYPE_WAIT );
if (async) { set_server_state( server, ps_wait_open ); if (server->pipe->waiters) async_wake_up( server->pipe->waiters, STATUS_SUCCESS ); release_object( async ); set_error( STATUS_PENDING ); return wait_handle; } break; --- snip server/named_pipe.c ---
After that bug is fixed, another one is waiting (ShellExecuteEx) ;-)
Regards