- Send whole OBJECT_ATTRIBUTES.Attributes to the server not just an

inherit flag.
- Pass DesiredAccess to the server when creating mailslot.
oldstable
Vitaliy Margolen 2005-10-27 18:30:37 +00:00 committed by Alexandre Julliard
parent a0fb866294
commit a996000ad5
16 changed files with 98 additions and 80 deletions

View File

@ -164,8 +164,8 @@ NTSTATUS WINAPI NtCreateFile( PHANDLE handle, ACCESS_MASK access, POBJECT_ATTRIB
SERVER_START_REQ( open_named_pipe ) SERVER_START_REQ( open_named_pipe )
{ {
req->access = access; req->access = access;
req->attributes = (attr) ? attr->Attributes : 0;
req->flags = options; req->flags = options;
req->inherit = (attr->Attributes & OBJ_INHERIT) != 0;
wine_server_add_data( req, attr->ObjectName->Buffer + 4, wine_server_add_data( req, attr->ObjectName->Buffer + 4,
attr->ObjectName->Length - 4*sizeof(WCHAR) ); attr->ObjectName->Length - 4*sizeof(WCHAR) );
io->u.Status = wine_server_call( req ); io->u.Status = wine_server_call( req );
@ -183,8 +183,8 @@ NTSTATUS WINAPI NtCreateFile( PHANDLE handle, ACCESS_MASK access, POBJECT_ATTRIB
SERVER_START_REQ( open_mailslot ) SERVER_START_REQ( open_mailslot )
{ {
req->access = access & GENERIC_WRITE; req->access = access & GENERIC_WRITE;
req->attributes = (attr) ? attr->Attributes : 0;
req->sharing = sharing; req->sharing = sharing;
req->inherit = (attr->Attributes & OBJ_INHERIT) != 0;
wine_server_add_data( req, attr->ObjectName->Buffer + 4, wine_server_add_data( req, attr->ObjectName->Buffer + 4,
attr->ObjectName->Length - 4*sizeof(WCHAR) ); attr->ObjectName->Length - 4*sizeof(WCHAR) );
io->u.Status = wine_server_call( req ); io->u.Status = wine_server_call( req );
@ -1941,6 +1941,7 @@ NTSTATUS WINAPI NtCreateNamedPipeFile( PHANDLE handle, ULONG access,
SERVER_START_REQ( create_named_pipe ) SERVER_START_REQ( create_named_pipe )
{ {
req->access = access; req->access = access;
req->attributes = (attr) ? attr->Attributes : 0;
req->options = options; req->options = options;
req->flags = req->flags =
(pipe_type) ? NAMED_PIPE_MESSAGE_STREAM_WRITE : 0 | (pipe_type) ? NAMED_PIPE_MESSAGE_STREAM_WRITE : 0 |
@ -1950,7 +1951,6 @@ NTSTATUS WINAPI NtCreateNamedPipeFile( PHANDLE handle, ULONG access,
req->outsize = outbound_quota; req->outsize = outbound_quota;
req->insize = inbound_quota; req->insize = inbound_quota;
req->timeout = timeout->QuadPart / -10000; req->timeout = timeout->QuadPart / -10000;
req->inherit = (attr->Attributes & OBJ_INHERIT) != 0;
wine_server_add_data( req, attr->ObjectName->Buffer + 4, wine_server_add_data( req, attr->ObjectName->Buffer + 4,
attr->ObjectName->Length - 4 * sizeof(WCHAR) ); attr->ObjectName->Length - 4 * sizeof(WCHAR) );
status = wine_server_call( req ); status = wine_server_call( req );
@ -2045,9 +2045,10 @@ NTSTATUS WINAPI NtCreateMailslotFile(PHANDLE pHandle, ULONG DesiredAccess,
SERVER_START_REQ( create_mailslot ) SERVER_START_REQ( create_mailslot )
{ {
req->access = DesiredAccess;
req->attributes = (attr) ? attr->Attributes : 0;
req->max_msgsize = MaxMessageSize; req->max_msgsize = MaxMessageSize;
req->read_timeout = TimeOut->QuadPart / -10000; req->read_timeout = TimeOut->QuadPart / -10000;
req->inherit = (attr->Attributes & OBJ_INHERIT) != 0;
wine_server_add_data( req, attr->ObjectName->Buffer + 4, wine_server_add_data( req, attr->ObjectName->Buffer + 4,
attr->ObjectName->Length - 4*sizeof(WCHAR) ); attr->ObjectName->Length - 4*sizeof(WCHAR) );
ret = wine_server_call( req ); ret = wine_server_call( req );

View File

@ -82,9 +82,9 @@ NTSTATUS WINAPI NtCreateSemaphore( OUT PHANDLE SemaphoreHandle,
SERVER_START_REQ( create_semaphore ) SERVER_START_REQ( create_semaphore )
{ {
req->access = access; req->access = access;
req->attributes = (attr) ? attr->Attributes : 0;
req->initial = InitialCount; req->initial = InitialCount;
req->max = MaximumCount; req->max = MaximumCount;
req->inherit = attr && (attr->Attributes & OBJ_INHERIT);
if (len) wine_server_add_data( req, attr->ObjectName->Buffer, len ); if (len) wine_server_add_data( req, attr->ObjectName->Buffer, len );
ret = wine_server_call( req ); ret = wine_server_call( req );
*SemaphoreHandle = reply->handle; *SemaphoreHandle = reply->handle;
@ -108,7 +108,7 @@ NTSTATUS WINAPI NtOpenSemaphore( OUT PHANDLE SemaphoreHandle,
SERVER_START_REQ( open_semaphore ) SERVER_START_REQ( open_semaphore )
{ {
req->access = access; req->access = access;
req->inherit = attr && (attr->Attributes & OBJ_INHERIT); req->attributes = (attr) ? attr->Attributes : 0;
if (len) wine_server_add_data( req, attr->ObjectName->Buffer, len ); if (len) wine_server_add_data( req, attr->ObjectName->Buffer, len );
ret = wine_server_call( req ); ret = wine_server_call( req );
*SemaphoreHandle = reply->handle; *SemaphoreHandle = reply->handle;
@ -174,9 +174,9 @@ NTSTATUS WINAPI NtCreateEvent(
SERVER_START_REQ( create_event ) SERVER_START_REQ( create_event )
{ {
req->access = DesiredAccess; req->access = DesiredAccess;
req->attributes = (attr) ? attr->Attributes : 0;
req->manual_reset = ManualReset; req->manual_reset = ManualReset;
req->initial_state = InitialState; req->initial_state = InitialState;
req->inherit = attr && (attr->Attributes & OBJ_INHERIT);
if (len) wine_server_add_data( req, attr->ObjectName->Buffer, len ); if (len) wine_server_add_data( req, attr->ObjectName->Buffer, len );
ret = wine_server_call( req ); ret = wine_server_call( req );
*EventHandle = reply->handle; *EventHandle = reply->handle;
@ -202,7 +202,7 @@ NTSTATUS WINAPI NtOpenEvent(
SERVER_START_REQ( open_event ) SERVER_START_REQ( open_event )
{ {
req->access = DesiredAccess; req->access = DesiredAccess;
req->inherit = attr && (attr->Attributes & OBJ_INHERIT); req->attributes = (attr) ? attr->Attributes : 0;
if (len) wine_server_add_data( req, attr->ObjectName->Buffer, len ); if (len) wine_server_add_data( req, attr->ObjectName->Buffer, len );
ret = wine_server_call( req ); ret = wine_server_call( req );
*EventHandle = reply->handle; *EventHandle = reply->handle;
@ -321,8 +321,8 @@ NTSTATUS WINAPI NtCreateMutant(OUT HANDLE* MutantHandle,
SERVER_START_REQ( create_mutex ) SERVER_START_REQ( create_mutex )
{ {
req->access = access; req->access = access;
req->attributes = (attr) ? attr->Attributes : 0;
req->owned = InitialOwner; req->owned = InitialOwner;
req->inherit = attr && (attr->Attributes & OBJ_INHERIT);
if (len) wine_server_add_data( req, attr->ObjectName->Buffer, len ); if (len) wine_server_add_data( req, attr->ObjectName->Buffer, len );
status = wine_server_call( req ); status = wine_server_call( req );
*MutantHandle = reply->handle; *MutantHandle = reply->handle;
@ -347,7 +347,7 @@ NTSTATUS WINAPI NtOpenMutant(OUT HANDLE* MutantHandle,
SERVER_START_REQ( open_mutex ) SERVER_START_REQ( open_mutex )
{ {
req->access = access; req->access = access;
req->inherit = attr && (attr->Attributes & OBJ_INHERIT); req->attributes = (attr) ? attr->Attributes : 0;
if (len) wine_server_add_data( req, attr->ObjectName->Buffer, len ); if (len) wine_server_add_data( req, attr->ObjectName->Buffer, len );
status = wine_server_call( req ); status = wine_server_call( req );
*MutantHandle = reply->handle; *MutantHandle = reply->handle;
@ -413,8 +413,8 @@ NTSTATUS WINAPI NtCreateTimer(OUT HANDLE *handle,
SERVER_START_REQ( create_timer ) SERVER_START_REQ( create_timer )
{ {
req->access = access; req->access = access;
req->attributes = (attr) ? attr->Attributes : 0;
req->manual = (timer_type == NotificationTimer) ? TRUE : FALSE; req->manual = (timer_type == NotificationTimer) ? TRUE : FALSE;
req->inherit = attr && (attr->Attributes & OBJ_INHERIT);
if (len) wine_server_add_data( req, attr->ObjectName->Buffer, len ); if (len) wine_server_add_data( req, attr->ObjectName->Buffer, len );
status = wine_server_call( req ); status = wine_server_call( req );
*handle = reply->handle; *handle = reply->handle;
@ -440,7 +440,7 @@ NTSTATUS WINAPI NtOpenTimer(OUT PHANDLE handle,
SERVER_START_REQ( open_timer ) SERVER_START_REQ( open_timer )
{ {
req->access = access; req->access = access;
req->inherit = attr && (attr->Attributes & OBJ_INHERIT); req->attributes = (attr) ? attr->Attributes : 0;
if (len) wine_server_add_data( req, attr->ObjectName->Buffer, len ); if (len) wine_server_add_data( req, attr->ObjectName->Buffer, len );
status = wine_server_call( req ); status = wine_server_call( req );
*handle = reply->handle; *handle = reply->handle;

View File

@ -1654,12 +1654,12 @@ NTSTATUS WINAPI NtCreateSection( HANDLE *handle, ACCESS_MASK access, const OBJEC
SERVER_START_REQ( create_mapping ) SERVER_START_REQ( create_mapping )
{ {
req->access = access;
req->attributes = (attr) ? attr->Attributes : 0;
req->file_handle = file; req->file_handle = file;
req->size_high = size ? size->u.HighPart : 0; req->size_high = size ? size->u.HighPart : 0;
req->size_low = size ? size->u.LowPart : 0; req->size_low = size ? size->u.LowPart : 0;
req->protect = vprot; req->protect = vprot;
req->access = access;
req->inherit = (attr && (attr->Attributes & OBJ_INHERIT) != 0);
if (len) wine_server_add_data( req, attr->ObjectName->Buffer, len ); if (len) wine_server_add_data( req, attr->ObjectName->Buffer, len );
ret = wine_server_call( req ); ret = wine_server_call( req );
*handle = reply->handle; *handle = reply->handle;
@ -1683,7 +1683,7 @@ NTSTATUS WINAPI NtOpenSection( HANDLE *handle, ACCESS_MASK access, const OBJECT_
SERVER_START_REQ( open_mapping ) SERVER_START_REQ( open_mapping )
{ {
req->access = access; req->access = access;
req->inherit = (attr->Attributes & OBJ_INHERIT) != 0; req->attributes = (attr) ? attr->Attributes : 0;
wine_server_add_data( req, attr->ObjectName->Buffer, len ); wine_server_add_data( req, attr->ObjectName->Buffer, len );
if (!(ret = wine_server_call( req ))) *handle = reply->handle; if (!(ret = wine_server_call( req ))) *handle = reply->handle;
} }

View File

@ -613,9 +613,9 @@ struct create_event_request
{ {
struct request_header __header; struct request_header __header;
unsigned int access; unsigned int access;
unsigned int attributes;
int manual_reset; int manual_reset;
int initial_state; int initial_state;
int inherit;
/* VARARG(name,unicode_str); */ /* VARARG(name,unicode_str); */
}; };
struct create_event_reply struct create_event_reply
@ -643,7 +643,7 @@ struct open_event_request
{ {
struct request_header __header; struct request_header __header;
unsigned int access; unsigned int access;
int inherit; unsigned int attributes;
/* VARARG(name,unicode_str); */ /* VARARG(name,unicode_str); */
}; };
struct open_event_reply struct open_event_reply
@ -658,8 +658,8 @@ struct create_mutex_request
{ {
struct request_header __header; struct request_header __header;
unsigned int access; unsigned int access;
unsigned int attributes;
int owned; int owned;
int inherit;
/* VARARG(name,unicode_str); */ /* VARARG(name,unicode_str); */
}; };
struct create_mutex_reply struct create_mutex_reply
@ -687,7 +687,7 @@ struct open_mutex_request
{ {
struct request_header __header; struct request_header __header;
unsigned int access; unsigned int access;
int inherit; unsigned int attributes;
/* VARARG(name,unicode_str); */ /* VARARG(name,unicode_str); */
}; };
struct open_mutex_reply struct open_mutex_reply
@ -702,9 +702,9 @@ struct create_semaphore_request
{ {
struct request_header __header; struct request_header __header;
unsigned int access; unsigned int access;
unsigned int attributes;
unsigned int initial; unsigned int initial;
unsigned int max; unsigned int max;
int inherit;
/* VARARG(name,unicode_str); */ /* VARARG(name,unicode_str); */
}; };
struct create_semaphore_reply struct create_semaphore_reply
@ -733,7 +733,7 @@ struct open_semaphore_request
{ {
struct request_header __header; struct request_header __header;
unsigned int access; unsigned int access;
int inherit; unsigned int attributes;
/* VARARG(name,unicode_str); */ /* VARARG(name,unicode_str); */
}; };
struct open_semaphore_reply struct open_semaphore_reply
@ -1399,11 +1399,11 @@ struct next_change_notification_reply
struct create_mapping_request struct create_mapping_request
{ {
struct request_header __header; struct request_header __header;
unsigned int access;
unsigned int attributes;
int size_high; int size_high;
int size_low; int size_low;
int protect; int protect;
unsigned int access;
int inherit;
obj_handle_t file_handle; obj_handle_t file_handle;
/* VARARG(name,unicode_str); */ /* VARARG(name,unicode_str); */
}; };
@ -1428,7 +1428,7 @@ struct open_mapping_request
{ {
struct request_header __header; struct request_header __header;
unsigned int access; unsigned int access;
int inherit; unsigned int attributes;
/* VARARG(name,unicode_str); */ /* VARARG(name,unicode_str); */
}; };
struct open_mapping_reply struct open_mapping_reply
@ -1879,7 +1879,7 @@ struct create_timer_request
{ {
struct request_header __header; struct request_header __header;
unsigned int access; unsigned int access;
int inherit; unsigned int attributes;
int manual; int manual;
/* VARARG(name,unicode_str); */ /* VARARG(name,unicode_str); */
}; };
@ -1895,7 +1895,7 @@ struct open_timer_request
{ {
struct request_header __header; struct request_header __header;
unsigned int access; unsigned int access;
int inherit; unsigned int attributes;
/* VARARG(name,unicode_str); */ /* VARARG(name,unicode_str); */
}; };
struct open_timer_reply struct open_timer_reply
@ -2366,13 +2366,13 @@ struct create_named_pipe_request
{ {
struct request_header __header; struct request_header __header;
unsigned int access; unsigned int access;
unsigned int attributes;
unsigned int options; unsigned int options;
unsigned int flags; unsigned int flags;
unsigned int maxinstances; unsigned int maxinstances;
unsigned int outsize; unsigned int outsize;
unsigned int insize; unsigned int insize;
unsigned int timeout; unsigned int timeout;
int inherit;
/* VARARG(name,unicode_str); */ /* VARARG(name,unicode_str); */
}; };
struct create_named_pipe_reply struct create_named_pipe_reply
@ -2392,8 +2392,8 @@ struct open_named_pipe_request
{ {
struct request_header __header; struct request_header __header;
unsigned int access; unsigned int access;
unsigned int attributes;
unsigned int flags; unsigned int flags;
int inherit;
/* VARARG(name,unicode_str); */ /* VARARG(name,unicode_str); */
}; };
struct open_named_pipe_reply struct open_named_pipe_reply
@ -3528,9 +3528,10 @@ struct get_token_user_reply
struct create_mailslot_request struct create_mailslot_request
{ {
struct request_header __header; struct request_header __header;
unsigned int access;
unsigned int attributes;
unsigned int max_msgsize; unsigned int max_msgsize;
unsigned int read_timeout; unsigned int read_timeout;
int inherit;
/* VARARG(name,unicode_str); */ /* VARARG(name,unicode_str); */
}; };
struct create_mailslot_reply struct create_mailslot_reply
@ -3545,7 +3546,7 @@ struct open_mailslot_request
{ {
struct request_header __header; struct request_header __header;
unsigned int access; unsigned int access;
int inherit; unsigned int attributes;
unsigned int sharing; unsigned int sharing;
/* VARARG(name,unicode_str); */ /* VARARG(name,unicode_str); */
}; };
@ -4206,6 +4207,6 @@ union generic_reply
struct set_mailslot_info_reply set_mailslot_info_reply; struct set_mailslot_info_reply set_mailslot_info_reply;
}; };
#define SERVER_PROTOCOL_VERSION 194 #define SERVER_PROTOCOL_VERSION 195
#endif /* __WINE_WINE_SERVER_PROTOCOL_H */ #endif /* __WINE_WINE_SERVER_PROTOCOL_H */

View File

@ -26,6 +26,7 @@
#include <stdlib.h> #include <stdlib.h>
#include "windef.h" #include "windef.h"
#include "winternl.h"
#include "handle.h" #include "handle.h"
#include "thread.h" #include "thread.h"
@ -149,7 +150,8 @@ DECL_HANDLER(create_event)
if ((event = create_event( get_req_data(), get_req_data_size(), if ((event = create_event( get_req_data(), get_req_data_size(),
req->manual_reset, req->initial_state ))) req->manual_reset, req->initial_state )))
{ {
reply->handle = alloc_handle( current->process, event, req->access, req->inherit ); reply->handle = alloc_handle( current->process, event, req->access,
req->attributes & OBJ_INHERIT );
release_object( event ); release_object( event );
} }
} }
@ -158,7 +160,7 @@ DECL_HANDLER(create_event)
DECL_HANDLER(open_event) DECL_HANDLER(open_event)
{ {
reply->handle = open_object( sync_namespace, get_req_data(), get_req_data_size(), reply->handle = open_object( sync_namespace, get_req_data(), get_req_data_size(),
&event_ops, req->access, req->inherit ); &event_ops, req->access, req->attributes );
} }
/* do an event operation */ /* do an event operation */

View File

@ -29,6 +29,7 @@
#include <stdlib.h> #include <stdlib.h>
#include "windef.h" #include "windef.h"
#include "winternl.h"
#include "handle.h" #include "handle.h"
#include "process.h" #include "process.h"
@ -521,7 +522,7 @@ obj_handle_t duplicate_handle( struct process *src, obj_handle_t src_handle, str
/* open a new handle to an existing object */ /* open a new handle to an existing object */
obj_handle_t open_object( const struct namespace *namespace, const WCHAR *name, size_t len, obj_handle_t open_object( const struct namespace *namespace, const WCHAR *name, size_t len,
const struct object_ops *ops, unsigned int access, int inherit ) const struct object_ops *ops, unsigned int access, unsigned int attr )
{ {
obj_handle_t handle = 0; obj_handle_t handle = 0;
struct object *obj = find_object( namespace, name, len ); struct object *obj = find_object( namespace, name, len );
@ -530,7 +531,7 @@ obj_handle_t open_object( const struct namespace *namespace, const WCHAR *name,
if (ops && obj->ops != ops) if (ops && obj->ops != ops)
set_error( STATUS_OBJECT_TYPE_MISMATCH ); set_error( STATUS_OBJECT_TYPE_MISMATCH );
else else
handle = alloc_handle( current->process, obj, access, inherit ); handle = alloc_handle( current->process, obj, access, attr & OBJ_INHERIT );
release_object( obj ); release_object( obj );
} }
else else

View File

@ -44,7 +44,7 @@ extern int set_handle_unix_fd( struct process *process, obj_handle_t handle, int
extern obj_handle_t duplicate_handle( struct process *src, obj_handle_t src_handle, struct process *dst, extern obj_handle_t duplicate_handle( struct process *src, obj_handle_t src_handle, struct process *dst,
unsigned int access, int inherit, int options ); unsigned int access, int inherit, int options );
extern obj_handle_t open_object( const struct namespace *namespace, const WCHAR *name, size_t len, extern obj_handle_t open_object( const struct namespace *namespace, const WCHAR *name, size_t len,
const struct object_ops *ops, unsigned int access, int inherit ); const struct object_ops *ops, unsigned int access, unsigned int attr );
extern obj_handle_t find_inherited_handle( struct process *process, const struct object_ops *ops ); extern obj_handle_t find_inherited_handle( struct process *process, const struct object_ops *ops );
extern struct handle_table *alloc_handle_table( struct process *process, int count ); extern struct handle_table *alloc_handle_table( struct process *process, int count );
extern struct handle_table *copy_handle_table( struct process *process, struct process *parent ); extern struct handle_table *copy_handle_table( struct process *process, struct process *parent );

View File

@ -43,6 +43,7 @@
#include <sys/filio.h> #include <sys/filio.h>
#endif #endif
#include "windef.h" #include "windef.h"
#include "winternl.h"
#include "file.h" #include "file.h"
#include "handle.h" #include "handle.h"
@ -356,7 +357,7 @@ DECL_HANDLER(create_mailslot)
if (mailslot) if (mailslot)
{ {
reply->handle = alloc_handle( current->process, mailslot, reply->handle = alloc_handle( current->process, mailslot,
GENERIC_READ, req->inherit ); req->access, req->attributes & OBJ_INHERIT );
release_object( mailslot ); release_object( mailslot );
} }
} }
@ -384,7 +385,7 @@ DECL_HANDLER(open_mailslot)
if (writer) if (writer)
{ {
reply->handle = alloc_handle( current->process, writer, reply->handle = alloc_handle( current->process, writer,
req->access, req->inherit ); req->access, req->attributes & OBJ_INHERIT );
release_object( writer ); release_object( writer );
} }
release_object( mailslot ); release_object( mailslot );

View File

@ -29,6 +29,7 @@
#include <unistd.h> #include <unistd.h>
#include "windef.h" #include "windef.h"
#include "winternl.h"
#include "file.h" #include "file.h"
#include "handle.h" #include "handle.h"
@ -379,7 +380,8 @@ DECL_HANDLER(create_mapping)
if ((obj = create_mapping( size, req->protect, req->file_handle, if ((obj = create_mapping( size, req->protect, req->file_handle,
get_req_data(), get_req_data_size() ))) get_req_data(), get_req_data_size() )))
{ {
reply->handle = alloc_handle( current->process, obj, req->access, req->inherit ); reply->handle = alloc_handle( current->process, obj, req->access,
req->attributes & OBJ_INHERIT );
release_object( obj ); release_object( obj );
} }
} }
@ -388,7 +390,7 @@ DECL_HANDLER(create_mapping)
DECL_HANDLER(open_mapping) DECL_HANDLER(open_mapping)
{ {
reply->handle = open_object( sync_namespace, get_req_data(), get_req_data_size(), reply->handle = open_object( sync_namespace, get_req_data(), get_req_data_size(),
&mapping_ops, req->access, req->inherit ); &mapping_ops, req->access, req->attributes );
} }
/* get a mapping information */ /* get a mapping information */

View File

@ -26,6 +26,7 @@
#include <stdlib.h> #include <stdlib.h>
#include "windef.h" #include "windef.h"
#include "winternl.h"
#include "handle.h" #include "handle.h"
#include "thread.h" #include "thread.h"
@ -173,7 +174,8 @@ DECL_HANDLER(create_mutex)
reply->handle = 0; reply->handle = 0;
if ((mutex = create_mutex( get_req_data(), get_req_data_size(), req->owned ))) if ((mutex = create_mutex( get_req_data(), get_req_data_size(), req->owned )))
{ {
reply->handle = alloc_handle( current->process, mutex, req->access, req->inherit ); reply->handle = alloc_handle( current->process, mutex, req->access,
req->attributes & OBJ_INHERIT );
release_object( mutex ); release_object( mutex );
} }
} }
@ -182,7 +184,7 @@ DECL_HANDLER(create_mutex)
DECL_HANDLER(open_mutex) DECL_HANDLER(open_mutex)
{ {
reply->handle = open_object( sync_namespace, get_req_data(), get_req_data_size(), reply->handle = open_object( sync_namespace, get_req_data(), get_req_data_size(),
&mutex_ops, req->access, req->inherit ); &mutex_ops, req->access, req->attributes );
} }
/* release a mutex */ /* release a mutex */

View File

@ -583,7 +583,7 @@ DECL_HANDLER(create_named_pipe)
if (server) if (server)
{ {
reply->handle = alloc_handle( current->process, server, reply->handle = alloc_handle( current->process, server,
req->access, req->inherit ); req->access, req->attributes & OBJ_INHERIT );
server->pipe->instances++; server->pipe->instances++;
release_object( server ); release_object( server );
} }
@ -645,7 +645,7 @@ DECL_HANDLER(open_named_pipe)
server->client = client; server->client = client;
client->server = server; client->server = server;
reply->handle = alloc_handle( current->process, client, reply->handle = alloc_handle( current->process, client,
req->access, req->inherit ); req->access, req->attributes & OBJ_INHERIT );
} }
} }
else else

View File

@ -495,9 +495,9 @@ enum apc_type { APC_NONE, APC_USER, APC_TIMER, APC_ASYNC_IO };
/* Create an event */ /* Create an event */
@REQ(create_event) @REQ(create_event)
unsigned int access; /* wanted access rights */ unsigned int access; /* wanted access rights */
unsigned int attributes; /* object attributes */
int manual_reset; /* manual reset event */ int manual_reset; /* manual reset event */
int initial_state; /* initial state of the event */ int initial_state; /* initial state of the event */
int inherit; /* inherit flag */
VARARG(name,unicode_str); /* object name */ VARARG(name,unicode_str); /* object name */
@REPLY @REPLY
obj_handle_t handle; /* handle to the event */ obj_handle_t handle; /* handle to the event */
@ -514,7 +514,7 @@ enum event_op { PULSE_EVENT, SET_EVENT, RESET_EVENT };
/* Open an event */ /* Open an event */
@REQ(open_event) @REQ(open_event)
unsigned int access; /* wanted access rights */ unsigned int access; /* wanted access rights */
int inherit; /* inherit flag */ unsigned int attributes; /* object attributes */
VARARG(name,unicode_str); /* object name */ VARARG(name,unicode_str); /* object name */
@REPLY @REPLY
obj_handle_t handle; /* handle to the event */ obj_handle_t handle; /* handle to the event */
@ -524,8 +524,8 @@ enum event_op { PULSE_EVENT, SET_EVENT, RESET_EVENT };
/* Create a mutex */ /* Create a mutex */
@REQ(create_mutex) @REQ(create_mutex)
unsigned int access; /* wanted access rights */ unsigned int access; /* wanted access rights */
unsigned int attributes; /* object attributes */
int owned; /* initially owned? */ int owned; /* initially owned? */
int inherit; /* inherit flag */
VARARG(name,unicode_str); /* object name */ VARARG(name,unicode_str); /* object name */
@REPLY @REPLY
obj_handle_t handle; /* handle to the mutex */ obj_handle_t handle; /* handle to the mutex */
@ -543,7 +543,7 @@ enum event_op { PULSE_EVENT, SET_EVENT, RESET_EVENT };
/* Open a mutex */ /* Open a mutex */
@REQ(open_mutex) @REQ(open_mutex)
unsigned int access; /* wanted access rights */ unsigned int access; /* wanted access rights */
int inherit; /* inherit flag */ unsigned int attributes; /* object attributes */
VARARG(name,unicode_str); /* object name */ VARARG(name,unicode_str); /* object name */
@REPLY @REPLY
obj_handle_t handle; /* handle to the mutex */ obj_handle_t handle; /* handle to the mutex */
@ -553,9 +553,9 @@ enum event_op { PULSE_EVENT, SET_EVENT, RESET_EVENT };
/* Create a semaphore */ /* Create a semaphore */
@REQ(create_semaphore) @REQ(create_semaphore)
unsigned int access; /* wanted access rights */ unsigned int access; /* wanted access rights */
unsigned int attributes; /* object attributes */
unsigned int initial; /* initial count */ unsigned int initial; /* initial count */
unsigned int max; /* maximum count */ unsigned int max; /* maximum count */
int inherit; /* inherit flag */
VARARG(name,unicode_str); /* object name */ VARARG(name,unicode_str); /* object name */
@REPLY @REPLY
obj_handle_t handle; /* handle to the semaphore */ obj_handle_t handle; /* handle to the semaphore */
@ -574,7 +574,7 @@ enum event_op { PULSE_EVENT, SET_EVENT, RESET_EVENT };
/* Open a semaphore */ /* Open a semaphore */
@REQ(open_semaphore) @REQ(open_semaphore)
unsigned int access; /* wanted access rights */ unsigned int access; /* wanted access rights */
int inherit; /* inherit flag */ unsigned int attributes; /* object attributes */
VARARG(name,unicode_str); /* object name */ VARARG(name,unicode_str); /* object name */
@REPLY @REPLY
obj_handle_t handle; /* handle to the semaphore */ obj_handle_t handle; /* handle to the semaphore */
@ -1037,11 +1037,11 @@ enum char_info_mode
/* Create a file mapping */ /* Create a file mapping */
@REQ(create_mapping) @REQ(create_mapping)
unsigned int access; /* wanted access rights */
unsigned int attributes; /* object attributes */
int size_high; /* mapping size */ int size_high; /* mapping size */
int size_low; /* mapping size */ int size_low; /* mapping size */
int protect; /* protection flags (see below) */ int protect; /* protection flags (see below) */
unsigned int access; /* wanted access rights */
int inherit; /* inherit flag */
obj_handle_t file_handle; /* file handle */ obj_handle_t file_handle; /* file handle */
VARARG(name,unicode_str); /* object name */ VARARG(name,unicode_str); /* object name */
@REPLY @REPLY
@ -1061,7 +1061,7 @@ enum char_info_mode
/* Open a mapping */ /* Open a mapping */
@REQ(open_mapping) @REQ(open_mapping)
unsigned int access; /* wanted access rights */ unsigned int access; /* wanted access rights */
int inherit; /* inherit flag */ unsigned int attributes; /* object attributes */
VARARG(name,unicode_str); /* object name */ VARARG(name,unicode_str); /* object name */
@REPLY @REPLY
obj_handle_t handle; /* handle to the mapping */ obj_handle_t handle; /* handle to the mapping */
@ -1354,7 +1354,7 @@ enum char_info_mode
/* Create a waitable timer */ /* Create a waitable timer */
@REQ(create_timer) @REQ(create_timer)
unsigned int access; /* wanted access rights */ unsigned int access; /* wanted access rights */
int inherit; /* inherit flag */ unsigned int attributes; /* object attributes */
int manual; /* manual reset */ int manual; /* manual reset */
VARARG(name,unicode_str); /* object name */ VARARG(name,unicode_str); /* object name */
@REPLY @REPLY
@ -1365,7 +1365,7 @@ enum char_info_mode
/* Open a waitable timer */ /* Open a waitable timer */
@REQ(open_timer) @REQ(open_timer)
unsigned int access; /* wanted access rights */ unsigned int access; /* wanted access rights */
int inherit; /* inherit flag */ unsigned int attributes; /* object attributes */
VARARG(name,unicode_str); /* object name */ VARARG(name,unicode_str); /* object name */
@REPLY @REPLY
obj_handle_t handle; /* handle to the timer */ obj_handle_t handle; /* handle to the timer */
@ -1680,13 +1680,13 @@ enum message_type
/* Create a named pipe */ /* Create a named pipe */
@REQ(create_named_pipe) @REQ(create_named_pipe)
unsigned int access; unsigned int access;
unsigned int attributes; /* object attributes */
unsigned int options; unsigned int options;
unsigned int flags; unsigned int flags;
unsigned int maxinstances; unsigned int maxinstances;
unsigned int outsize; unsigned int outsize;
unsigned int insize; unsigned int insize;
unsigned int timeout; unsigned int timeout;
int inherit; /* inherit flag */
VARARG(name,unicode_str); /* pipe name */ VARARG(name,unicode_str); /* pipe name */
@REPLY @REPLY
obj_handle_t handle; /* handle to the pipe */ obj_handle_t handle; /* handle to the pipe */
@ -1701,8 +1701,8 @@ enum message_type
/* Open an existing named pipe */ /* Open an existing named pipe */
@REQ(open_named_pipe) @REQ(open_named_pipe)
unsigned int access; unsigned int access;
unsigned int attributes; /* object attributes */
unsigned int flags; /* file flags */ unsigned int flags; /* file flags */
int inherit; /* inherit flag */
VARARG(name,unicode_str); /* pipe name */ VARARG(name,unicode_str); /* pipe name */
@REPLY @REPLY
obj_handle_t handle; /* handle to the pipe */ obj_handle_t handle; /* handle to the pipe */
@ -2471,9 +2471,10 @@ enum message_type
/* Create a mailslot */ /* Create a mailslot */
@REQ(create_mailslot) @REQ(create_mailslot)
unsigned int access; /* wanted access rights */
unsigned int attributes; /* object attributes */
unsigned int max_msgsize; unsigned int max_msgsize;
unsigned int read_timeout; unsigned int read_timeout;
int inherit;
VARARG(name,unicode_str); /* mailslot name */ VARARG(name,unicode_str); /* mailslot name */
@REPLY @REPLY
obj_handle_t handle; /* handle to the mailslot */ obj_handle_t handle; /* handle to the mailslot */
@ -2483,7 +2484,7 @@ enum message_type
/* Open an existing mailslot */ /* Open an existing mailslot */
@REQ(open_mailslot) @REQ(open_mailslot)
unsigned int access; unsigned int access;
int inherit; /* inherit flag */ unsigned int attributes; /* object attributes */
unsigned int sharing; /* sharing mode */ unsigned int sharing; /* sharing mode */
VARARG(name,unicode_str); /* mailslot name */ VARARG(name,unicode_str); /* mailslot name */
@REPLY @REPLY

View File

@ -26,6 +26,7 @@
#include <stdlib.h> #include <stdlib.h>
#include "windef.h" #include "windef.h"
#include "winternl.h"
#include "handle.h" #include "handle.h"
#include "thread.h" #include "thread.h"
@ -149,7 +150,8 @@ DECL_HANDLER(create_semaphore)
if ((sem = create_semaphore( get_req_data(), get_req_data_size(), if ((sem = create_semaphore( get_req_data(), get_req_data_size(),
req->initial, req->max ))) req->initial, req->max )))
{ {
reply->handle = alloc_handle( current->process, sem, req->access, req->inherit ); reply->handle = alloc_handle( current->process, sem, req->access,
req->attributes & OBJ_INHERIT );
release_object( sem ); release_object( sem );
} }
} }
@ -158,7 +160,7 @@ DECL_HANDLER(create_semaphore)
DECL_HANDLER(open_semaphore) DECL_HANDLER(open_semaphore)
{ {
reply->handle = open_object( sync_namespace, get_req_data(), get_req_data_size(), reply->handle = open_object( sync_namespace, get_req_data(), get_req_data_size(),
&semaphore_ops, req->access, req->inherit ); &semaphore_ops, req->access, req->attributes );
} }
/* release a semaphore */ /* release a semaphore */

View File

@ -28,6 +28,7 @@
#include <sys/types.h> #include <sys/types.h>
#include "windef.h" #include "windef.h"
#include "winternl.h"
#include "file.h" #include "file.h"
#include "handle.h" #include "handle.h"
@ -206,7 +207,8 @@ DECL_HANDLER(create_timer)
reply->handle = 0; reply->handle = 0;
if ((timer = create_timer( get_req_data(), get_req_data_size(), req->manual ))) if ((timer = create_timer( get_req_data(), get_req_data_size(), req->manual )))
{ {
reply->handle = alloc_handle( current->process, timer, req->access, req->inherit ); reply->handle = alloc_handle( current->process, timer, req->access,
req->attributes & OBJ_INHERIT );
release_object( timer ); release_object( timer );
} }
} }
@ -215,7 +217,7 @@ DECL_HANDLER(create_timer)
DECL_HANDLER(open_timer) DECL_HANDLER(open_timer)
{ {
reply->handle = open_object( sync_namespace, get_req_data(), get_req_data_size(), reply->handle = open_object( sync_namespace, get_req_data(), get_req_data_size(),
&timer_ops, req->access, req->inherit ); &timer_ops, req->access, req->attributes );
} }
/* set a waitable timer */ /* set a waitable timer */

View File

@ -890,9 +890,9 @@ static void dump_select_request( const struct select_request *req )
static void dump_create_event_request( const struct create_event_request *req ) static void dump_create_event_request( const struct create_event_request *req )
{ {
fprintf( stderr, " access=%08x,", req->access ); fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " attributes=%08x,", req->attributes );
fprintf( stderr, " manual_reset=%d,", req->manual_reset ); fprintf( stderr, " manual_reset=%d,", req->manual_reset );
fprintf( stderr, " initial_state=%d,", req->initial_state ); fprintf( stderr, " initial_state=%d,", req->initial_state );
fprintf( stderr, " inherit=%d,", req->inherit );
fprintf( stderr, " name=" ); fprintf( stderr, " name=" );
dump_varargs_unicode_str( cur_size ); dump_varargs_unicode_str( cur_size );
} }
@ -911,7 +911,7 @@ static void dump_event_op_request( const struct event_op_request *req )
static void dump_open_event_request( const struct open_event_request *req ) static void dump_open_event_request( const struct open_event_request *req )
{ {
fprintf( stderr, " access=%08x,", req->access ); fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d,", req->inherit ); fprintf( stderr, " attributes=%08x,", req->attributes );
fprintf( stderr, " name=" ); fprintf( stderr, " name=" );
dump_varargs_unicode_str( cur_size ); dump_varargs_unicode_str( cur_size );
} }
@ -924,8 +924,8 @@ static void dump_open_event_reply( const struct open_event_reply *req )
static void dump_create_mutex_request( const struct create_mutex_request *req ) static void dump_create_mutex_request( const struct create_mutex_request *req )
{ {
fprintf( stderr, " access=%08x,", req->access ); fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " attributes=%08x,", req->attributes );
fprintf( stderr, " owned=%d,", req->owned ); fprintf( stderr, " owned=%d,", req->owned );
fprintf( stderr, " inherit=%d,", req->inherit );
fprintf( stderr, " name=" ); fprintf( stderr, " name=" );
dump_varargs_unicode_str( cur_size ); dump_varargs_unicode_str( cur_size );
} }
@ -948,7 +948,7 @@ static void dump_release_mutex_reply( const struct release_mutex_reply *req )
static void dump_open_mutex_request( const struct open_mutex_request *req ) static void dump_open_mutex_request( const struct open_mutex_request *req )
{ {
fprintf( stderr, " access=%08x,", req->access ); fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d,", req->inherit ); fprintf( stderr, " attributes=%08x,", req->attributes );
fprintf( stderr, " name=" ); fprintf( stderr, " name=" );
dump_varargs_unicode_str( cur_size ); dump_varargs_unicode_str( cur_size );
} }
@ -961,9 +961,9 @@ static void dump_open_mutex_reply( const struct open_mutex_reply *req )
static void dump_create_semaphore_request( const struct create_semaphore_request *req ) static void dump_create_semaphore_request( const struct create_semaphore_request *req )
{ {
fprintf( stderr, " access=%08x,", req->access ); fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " attributes=%08x,", req->attributes );
fprintf( stderr, " initial=%08x,", req->initial ); fprintf( stderr, " initial=%08x,", req->initial );
fprintf( stderr, " max=%08x,", req->max ); fprintf( stderr, " max=%08x,", req->max );
fprintf( stderr, " inherit=%d,", req->inherit );
fprintf( stderr, " name=" ); fprintf( stderr, " name=" );
dump_varargs_unicode_str( cur_size ); dump_varargs_unicode_str( cur_size );
} }
@ -987,7 +987,7 @@ static void dump_release_semaphore_reply( const struct release_semaphore_reply *
static void dump_open_semaphore_request( const struct open_semaphore_request *req ) static void dump_open_semaphore_request( const struct open_semaphore_request *req )
{ {
fprintf( stderr, " access=%08x,", req->access ); fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d,", req->inherit ); fprintf( stderr, " attributes=%08x,", req->attributes );
fprintf( stderr, " name=" ); fprintf( stderr, " name=" );
dump_varargs_unicode_str( cur_size ); dump_varargs_unicode_str( cur_size );
} }
@ -1438,11 +1438,11 @@ static void dump_next_change_notification_request( const struct next_change_noti
static void dump_create_mapping_request( const struct create_mapping_request *req ) static void dump_create_mapping_request( const struct create_mapping_request *req )
{ {
fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " attributes=%08x,", req->attributes );
fprintf( stderr, " size_high=%d,", req->size_high ); fprintf( stderr, " size_high=%d,", req->size_high );
fprintf( stderr, " size_low=%d,", req->size_low ); fprintf( stderr, " size_low=%d,", req->size_low );
fprintf( stderr, " protect=%d,", req->protect ); fprintf( stderr, " protect=%d,", req->protect );
fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d,", req->inherit );
fprintf( stderr, " file_handle=%p,", req->file_handle ); fprintf( stderr, " file_handle=%p,", req->file_handle );
fprintf( stderr, " name=" ); fprintf( stderr, " name=" );
dump_varargs_unicode_str( cur_size ); dump_varargs_unicode_str( cur_size );
@ -1456,7 +1456,7 @@ static void dump_create_mapping_reply( const struct create_mapping_reply *req )
static void dump_open_mapping_request( const struct open_mapping_request *req ) static void dump_open_mapping_request( const struct open_mapping_request *req )
{ {
fprintf( stderr, " access=%08x,", req->access ); fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d,", req->inherit ); fprintf( stderr, " attributes=%08x,", req->attributes );
fprintf( stderr, " name=" ); fprintf( stderr, " name=" );
dump_varargs_unicode_str( cur_size ); dump_varargs_unicode_str( cur_size );
} }
@ -1790,7 +1790,7 @@ static void dump_set_registry_notification_request( const struct set_registry_no
static void dump_create_timer_request( const struct create_timer_request *req ) static void dump_create_timer_request( const struct create_timer_request *req )
{ {
fprintf( stderr, " access=%08x,", req->access ); fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d,", req->inherit ); fprintf( stderr, " attributes=%08x,", req->attributes );
fprintf( stderr, " manual=%d,", req->manual ); fprintf( stderr, " manual=%d,", req->manual );
fprintf( stderr, " name=" ); fprintf( stderr, " name=" );
dump_varargs_unicode_str( cur_size ); dump_varargs_unicode_str( cur_size );
@ -1804,7 +1804,7 @@ static void dump_create_timer_reply( const struct create_timer_reply *req )
static void dump_open_timer_request( const struct open_timer_request *req ) static void dump_open_timer_request( const struct open_timer_request *req )
{ {
fprintf( stderr, " access=%08x,", req->access ); fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d,", req->inherit ); fprintf( stderr, " attributes=%08x,", req->attributes );
fprintf( stderr, " name=" ); fprintf( stderr, " name=" );
dump_varargs_unicode_str( cur_size ); dump_varargs_unicode_str( cur_size );
} }
@ -2140,13 +2140,13 @@ static void dump_cancel_async_request( const struct cancel_async_request *req )
static void dump_create_named_pipe_request( const struct create_named_pipe_request *req ) static void dump_create_named_pipe_request( const struct create_named_pipe_request *req )
{ {
fprintf( stderr, " access=%08x,", req->access ); fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " attributes=%08x,", req->attributes );
fprintf( stderr, " options=%08x,", req->options ); fprintf( stderr, " options=%08x,", req->options );
fprintf( stderr, " flags=%08x,", req->flags ); fprintf( stderr, " flags=%08x,", req->flags );
fprintf( stderr, " maxinstances=%08x,", req->maxinstances ); fprintf( stderr, " maxinstances=%08x,", req->maxinstances );
fprintf( stderr, " outsize=%08x,", req->outsize ); fprintf( stderr, " outsize=%08x,", req->outsize );
fprintf( stderr, " insize=%08x,", req->insize ); fprintf( stderr, " insize=%08x,", req->insize );
fprintf( stderr, " timeout=%08x,", req->timeout ); fprintf( stderr, " timeout=%08x,", req->timeout );
fprintf( stderr, " inherit=%d,", req->inherit );
fprintf( stderr, " name=" ); fprintf( stderr, " name=" );
dump_varargs_unicode_str( cur_size ); dump_varargs_unicode_str( cur_size );
} }
@ -2159,8 +2159,8 @@ static void dump_create_named_pipe_reply( const struct create_named_pipe_reply *
static void dump_open_named_pipe_request( const struct open_named_pipe_request *req ) static void dump_open_named_pipe_request( const struct open_named_pipe_request *req )
{ {
fprintf( stderr, " access=%08x,", req->access ); fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " attributes=%08x,", req->attributes );
fprintf( stderr, " flags=%08x,", req->flags ); fprintf( stderr, " flags=%08x,", req->flags );
fprintf( stderr, " inherit=%d,", req->inherit );
fprintf( stderr, " name=" ); fprintf( stderr, " name=" );
dump_varargs_unicode_str( cur_size ); dump_varargs_unicode_str( cur_size );
} }
@ -3048,9 +3048,10 @@ static void dump_get_token_user_reply( const struct get_token_user_reply *req )
static void dump_create_mailslot_request( const struct create_mailslot_request *req ) static void dump_create_mailslot_request( const struct create_mailslot_request *req )
{ {
fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " attributes=%08x,", req->attributes );
fprintf( stderr, " max_msgsize=%08x,", req->max_msgsize ); fprintf( stderr, " max_msgsize=%08x,", req->max_msgsize );
fprintf( stderr, " read_timeout=%08x,", req->read_timeout ); fprintf( stderr, " read_timeout=%08x,", req->read_timeout );
fprintf( stderr, " inherit=%d,", req->inherit );
fprintf( stderr, " name=" ); fprintf( stderr, " name=" );
dump_varargs_unicode_str( cur_size ); dump_varargs_unicode_str( cur_size );
} }
@ -3063,7 +3064,7 @@ static void dump_create_mailslot_reply( const struct create_mailslot_reply *req
static void dump_open_mailslot_request( const struct open_mailslot_request *req ) static void dump_open_mailslot_request( const struct open_mailslot_request *req )
{ {
fprintf( stderr, " access=%08x,", req->access ); fprintf( stderr, " access=%08x,", req->access );
fprintf( stderr, " inherit=%d,", req->inherit ); fprintf( stderr, " attributes=%08x,", req->attributes );
fprintf( stderr, " sharing=%08x,", req->sharing ); fprintf( stderr, " sharing=%08x,", req->sharing );
fprintf( stderr, " name=" ); fprintf( stderr, " name=" );
dump_varargs_unicode_str( cur_size ); dump_varargs_unicode_str( cur_size );

View File

@ -27,6 +27,7 @@
#include "windef.h" #include "windef.h"
#include "winbase.h" #include "winbase.h"
#include "winuser.h" #include "winuser.h"
#include "winternl.h"
#include "object.h" #include "object.h"
#include "handle.h" #include "handle.h"
@ -322,7 +323,7 @@ DECL_HANDLER(open_winstation)
{ {
if (winstation_namespace) if (winstation_namespace)
reply->handle = open_object( winstation_namespace, get_req_data(), get_req_data_size(), reply->handle = open_object( winstation_namespace, get_req_data(), get_req_data_size(),
&winstation_ops, req->access, req->inherit ); &winstation_ops, req->access, (req->inherit) ? OBJ_INHERIT:0 );
else else
set_error( STATUS_OBJECT_NAME_NOT_FOUND ); set_error( STATUS_OBJECT_NAME_NOT_FOUND );
} }
@ -396,7 +397,8 @@ DECL_HANDLER(open_desktop)
winstation, &full_len ))) winstation, &full_len )))
{ {
reply->handle = open_object( winstation_namespace, full_name, full_len, reply->handle = open_object( winstation_namespace, full_name, full_len,
&desktop_ops, req->access, req->inherit ); &desktop_ops, req->access,
(req->inherit) ? OBJ_INHERIT:0 );
free( full_name ); free( full_name );
} }
release_object( winstation ); release_object( winstation );