diff --git a/server/event.c b/server/event.c index d6c8fefc054..6aec64ab187 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 object *obj, struct thread *thread ) 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 0f1e9f825f2..410416133a7 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 object *obj, struct thread *thread ) 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 6cc1012a035..d8188984727 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_ops = 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 object *obj, struct thread *thread ) 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 7c20f19fff3..b87dd888f7f 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 object *obj, struct thread *thread ) 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;