From: Elizabeth Figura zfigura@codeweavers.com
--- dlls/kernel32/sync.c | 4 ++-- dlls/kernel32/tests/mailslot.c | 4 ++-- dlls/ntdll/unix/file.c | 1 + server/mailslot.c | 7 +++---- server/protocol.def | 1 + 5 files changed, 9 insertions(+), 8 deletions(-)
diff --git a/dlls/kernel32/sync.c b/dlls/kernel32/sync.c index 53419cd4618..44fd01002d4 100644 --- a/dlls/kernel32/sync.c +++ b/dlls/kernel32/sync.c @@ -692,8 +692,8 @@ HANDLE WINAPI CreateMailslotW( LPCWSTR lpName, DWORD nMaxMessageSize, else timeout.QuadPart = ((LONGLONG)0x7fffffff << 32) | 0xffffffff;
- if (!set_ntstatus( NtCreateMailslotFile( &handle, GENERIC_READ | SYNCHRONIZE, &attr, - &iosb, 0, 0, nMaxMessageSize, &timeout ))) + if (!set_ntstatus( NtCreateMailslotFile( &handle, GENERIC_READ | SYNCHRONIZE, &attr, &iosb, + FILE_SYNCHRONOUS_IO_NONALERT, 0, nMaxMessageSize, &timeout ))) handle = INVALID_HANDLE_VALUE;
RtlFreeUnicodeString( &nameW ); diff --git a/dlls/kernel32/tests/mailslot.c b/dlls/kernel32/tests/mailslot.c index f21d3a3076f..c27401e01c5 100644 --- a/dlls/kernel32/tests/mailslot.c +++ b/dlls/kernel32/tests/mailslot.c @@ -410,12 +410,12 @@ static int mailslot_test(void) io.Status = 0xdeadbeef; io.Information = 0xdeadbeef; ret = NtReadFile( hSlot, NULL, NULL, NULL, &io, buffer, sizeof(buffer), NULL, NULL ); - todo_wine ok( ret == STATUS_PENDING, "got %#x\n", ret ); + ok( ret == STATUS_PENDING, "got %#x\n", ret ); ok( io.Status == 0xdeadbeef, "got status %#lx\n", io.Status ); ok( io.Information == 0xdeadbeef, "got size %Iu\n", io.Information );
ret = WaitForSingleObject( hSlot, 0 ); - todo_wine ok( ret == WAIT_TIMEOUT, "got %d\n", ret ); + ok( ret == WAIT_TIMEOUT, "got %d\n", ret );
hWriter = CreateFileA( szmspath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL ); ok( hWriter != INVALID_HANDLE_VALUE, "got err %lu\n", GetLastError() ); diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c index 15fdf2cb021..f0bcf72f108 100644 --- a/dlls/ntdll/unix/file.c +++ b/dlls/ntdll/unix/file.c @@ -4175,6 +4175,7 @@ NTSTATUS WINAPI NtCreateMailslotFile( HANDLE *handle, ULONG access, OBJECT_ATTRI SERVER_START_REQ( create_mailslot ) { req->access = access; + req->options = options; req->max_msgsize = msg_size; req->read_timeout = timeout ? timeout->QuadPart : -1; wine_server_add_data( req, objattr, len ); diff --git a/server/mailslot.c b/server/mailslot.c index 2d8697ec9bd..b8a48c66bed 100644 --- a/server/mailslot.c +++ b/server/mailslot.c @@ -474,7 +474,7 @@ static enum server_fd_type mailslot_device_file_get_fd_type( struct fd *fd )
static struct mailslot *create_mailslot( struct object *root, const struct unicode_str *name, unsigned int attr, - int max_msgsize, timeout_t read_timeout, + unsigned int options, int max_msgsize, timeout_t read_timeout, const struct security_descriptor *sd ) { struct mailslot *mailslot; @@ -494,8 +494,7 @@ static struct mailslot *create_mailslot( struct object *root, fcntl( fds[1], F_SETFL, O_NONBLOCK ); shutdown( fds[0], SHUT_RD ); mailslot->write_fd = fds[0]; - if ((mailslot->fd = create_anonymous_fd( &mailslot_fd_ops, fds[1], &mailslot->obj, - FILE_SYNCHRONOUS_IO_NONALERT ))) + if ((mailslot->fd = create_anonymous_fd( &mailslot_fd_ops, fds[1], &mailslot->obj, options ))) { allow_fd_caching( mailslot->fd ); return mailslot; @@ -566,7 +565,7 @@ DECL_HANDLER(create_mailslot) if (!(root = get_directory_obj( current->process, objattr->rootdir ))) return; }
- if ((mailslot = create_mailslot( root, &name, objattr->attributes, req->max_msgsize, + if ((mailslot = create_mailslot( root, &name, objattr->attributes, req->options, req->max_msgsize, req->read_timeout, sd ))) { reply->handle = alloc_handle( current->process, mailslot, req->access, objattr->attributes ); diff --git a/server/protocol.def b/server/protocol.def index 3c6596aebe2..97cf762a467 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -3431,6 +3431,7 @@ struct handle_info /* Create a mailslot */ @REQ(create_mailslot) unsigned int access; /* wanted access rights */ + unsigned int options; timeout_t read_timeout; unsigned int max_msgsize; VARARG(objattr,object_attributes); /* object attributes */