Module: wine Branch: refs/heads/master Commit: 03f46e1321b4c4cbcef405f2cad2f37d5c4054a9 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=03f46e1321b4c4cbcef405f2...
Author: Alexandre Julliard julliard@winehq.org Date: Mon Dec 12 14:58:44 2005 +0100
server: Added access rights mapping to synchronization objects.
---
server/event.c | 12 +++++++++++- server/mutex.c | 12 +++++++++++- server/semaphore.c | 12 +++++++++++- server/timer.c | 12 +++++++++++- 4 files changed, 44 insertions(+), 4 deletions(-)
diff --git a/server/event.c b/server/event.c index d6c8fef..6aec64a 100644 --- a/server/event.c +++ b/server/event.c @@ -45,6 +45,7 @@ struct event static void event_dump( struct object *obj, int verbose ); static int event_signaled( struct object *obj, struct thread *thread ); static int event_satisfied( struct object *obj, struct thread *thread ); +static unsigned int event_map_access( struct object *obj, unsigned int access ); static int event_signal( struct object *obj, unsigned int access);
static const struct object_ops event_ops = @@ -57,7 +58,7 @@ static const struct object_ops event_ops event_satisfied, /* satisfied */ event_signal, /* signal */ no_get_fd, /* get_fd */ - no_map_access, /* map_access */ + event_map_access, /* map_access */ no_lookup_name, /* lookup_name */ no_close_handle, /* close_handle */ no_destroy /* destroy */ @@ -132,6 +133,15 @@ static int event_satisfied( struct objec return 0; /* Not abandoned */ }
+static unsigned int event_map_access( struct object *obj, unsigned int access ) +{ + if (access & GENERIC_READ) access |= STANDARD_RIGHTS_READ | SYNCHRONIZE | EVENT_QUERY_STATE; + if (access & GENERIC_WRITE) access |= STANDARD_RIGHTS_WRITE; + if (access & GENERIC_EXECUTE) access |= STANDARD_RIGHTS_EXECUTE; + if (access & GENERIC_ALL) access |= STANDARD_RIGHTS_ALL | EVENT_ALL_ACCESS; + return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL); +} + static int event_signal( struct object *obj, unsigned int access ) { struct event *event = (struct event *)obj; diff --git a/server/mutex.c b/server/mutex.c index 0f1e9f8..4104161 100644 --- a/server/mutex.c +++ b/server/mutex.c @@ -47,6 +47,7 @@ struct mutex static void mutex_dump( struct object *obj, int verbose ); static int mutex_signaled( struct object *obj, struct thread *thread ); static int mutex_satisfied( struct object *obj, struct thread *thread ); +static unsigned int mutex_map_access( struct object *obj, unsigned int access ); static void mutex_destroy( struct object *obj ); static int mutex_signal( struct object *obj, unsigned int access );
@@ -60,7 +61,7 @@ static const struct object_ops mutex_ops mutex_satisfied, /* satisfied */ mutex_signal, /* signal */ no_get_fd, /* get_fd */ - no_map_access, /* map_access */ + mutex_map_access, /* map_access */ no_lookup_name, /* lookup_name */ no_close_handle, /* close_handle */ mutex_destroy /* destroy */ @@ -143,6 +144,15 @@ static int mutex_satisfied( struct objec return 1; }
+static unsigned int mutex_map_access( struct object *obj, unsigned int access ) +{ + if (access & GENERIC_READ) access |= STANDARD_RIGHTS_READ | SYNCHRONIZE; + if (access & GENERIC_WRITE) access |= STANDARD_RIGHTS_WRITE | MUTEX_MODIFY_STATE; + if (access & GENERIC_EXECUTE) access |= STANDARD_RIGHTS_EXECUTE; + if (access & GENERIC_ALL) access |= STANDARD_RIGHTS_ALL | MUTEX_ALL_ACCESS; + return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL); +} + static int mutex_signal( struct object *obj, unsigned int access ) { struct mutex *mutex = (struct mutex *)obj; diff --git a/server/semaphore.c b/server/semaphore.c index 6cc1012..d818898 100644 --- a/server/semaphore.c +++ b/server/semaphore.c @@ -45,6 +45,7 @@ struct semaphore static void semaphore_dump( struct object *obj, int verbose ); static int semaphore_signaled( struct object *obj, struct thread *thread ); static int semaphore_satisfied( struct object *obj, struct thread *thread ); +static unsigned int semaphore_map_access( struct object *obj, unsigned int access ); static int semaphore_signal( struct object *obj, unsigned int access );
static const struct object_ops semaphore_ops = @@ -57,7 +58,7 @@ static const struct object_ops semaphore semaphore_satisfied, /* satisfied */ semaphore_signal, /* signal */ no_get_fd, /* get_fd */ - no_map_access, /* map_access */ + semaphore_map_access, /* map_access */ no_lookup_name, /* lookup_name */ no_close_handle, /* close_handle */ no_destroy /* destroy */ @@ -133,6 +134,15 @@ static int semaphore_satisfied( struct o return 0; /* not abandoned */ }
+static unsigned int semaphore_map_access( struct object *obj, unsigned int access ) +{ + if (access & GENERIC_READ) access |= STANDARD_RIGHTS_READ | SYNCHRONIZE; + if (access & GENERIC_WRITE) access |= STANDARD_RIGHTS_WRITE | SEMAPHORE_MODIFY_STATE; + if (access & GENERIC_EXECUTE) access |= STANDARD_RIGHTS_EXECUTE; + if (access & GENERIC_ALL) access |= STANDARD_RIGHTS_ALL | SEMAPHORE_ALL_ACCESS; + return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL); +} + static int semaphore_signal( struct object *obj, unsigned int access ) { struct semaphore *sem = (struct semaphore *)obj; diff --git a/server/timer.c b/server/timer.c index 7c20f19..b87dd88 100644 --- a/server/timer.c +++ b/server/timer.c @@ -53,6 +53,7 @@ struct timer static void timer_dump( struct object *obj, int verbose ); static int timer_signaled( struct object *obj, struct thread *thread ); static int timer_satisfied( struct object *obj, struct thread *thread ); +static unsigned int timer_map_access( struct object *obj, unsigned int access ); static void timer_destroy( struct object *obj );
static const struct object_ops timer_ops = @@ -65,7 +66,7 @@ static const struct object_ops timer_ops timer_satisfied, /* satisfied */ no_signal, /* signal */ no_get_fd, /* get_fd */ - no_map_access, /* map_access */ + timer_map_access, /* map_access */ no_lookup_name, /* lookup_name */ no_close_handle, /* close_handle */ timer_destroy /* destroy */ @@ -196,6 +197,15 @@ static int timer_satisfied( struct objec return 0; }
+static unsigned int timer_map_access( struct object *obj, unsigned int access ) +{ + if (access & GENERIC_READ) access |= STANDARD_RIGHTS_READ | SYNCHRONIZE | TIMER_QUERY_STATE; + if (access & GENERIC_WRITE) access |= STANDARD_RIGHTS_WRITE | TIMER_MODIFY_STATE; + if (access & GENERIC_EXECUTE) access |= STANDARD_RIGHTS_EXECUTE; + if (access & GENERIC_ALL) access |= TIMER_ALL_ACCESS; + return access & ~(GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | GENERIC_ALL); +} + static void timer_destroy( struct object *obj ) { struct timer *timer = (struct timer *)obj;