Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 1 | /* |
| 2 | * Wine server objects |
| 3 | * |
| 4 | * Copyright (C) 1998 Alexandre Julliard |
Alexandre Julliard | 0799c1a | 2002-03-09 23:29:33 +0000 | [diff] [blame] | 5 | * |
| 6 | * This library is free software; you can redistribute it and/or |
| 7 | * modify it under the terms of the GNU Lesser General Public |
| 8 | * License as published by the Free Software Foundation; either |
| 9 | * version 2.1 of the License, or (at your option) any later version. |
| 10 | * |
| 11 | * This library is distributed in the hope that it will be useful, |
| 12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
| 14 | * Lesser General Public License for more details. |
| 15 | * |
| 16 | * You should have received a copy of the GNU Lesser General Public |
| 17 | * License along with this library; if not, write to the Free Software |
| 18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 19 | */ |
| 20 | |
| 21 | #ifndef __WINE_SERVER_OBJECT_H |
| 22 | #define __WINE_SERVER_OBJECT_H |
| 23 | |
Steven Edwards | 037c8a1 | 2003-02-11 22:27:13 +0000 | [diff] [blame] | 24 | #ifdef HAVE_SYS_POLL_H |
Alexandre Julliard | 247b8ae | 1999-12-13 00:16:44 +0000 | [diff] [blame] | 25 | #include <sys/poll.h> |
Steven Edwards | 037c8a1 | 2003-02-11 22:27:13 +0000 | [diff] [blame] | 26 | #endif |
| 27 | |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 28 | #include <sys/time.h> |
Alexandre Julliard | 37ec927 | 2001-07-19 00:35:37 +0000 | [diff] [blame] | 29 | #include "wine/server_protocol.h" |
Alexandre Julliard | ef5f6c7 | 2003-09-11 20:45:17 +0000 | [diff] [blame] | 30 | #include "wine/list.h" |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 31 | |
Alexandre Julliard | 1bdd154 | 1999-06-04 19:47:04 +0000 | [diff] [blame] | 32 | #define DEBUG_OBJECTS |
| 33 | |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 34 | /* kernel objects */ |
| 35 | |
Alexandre Julliard | 526a28d | 2002-10-02 23:49:30 +0000 | [diff] [blame] | 36 | struct namespace; |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 37 | struct object; |
| 38 | struct object_name; |
Alexandre Julliard | 85ed45e | 1998-08-22 19:03:56 +0000 | [diff] [blame] | 39 | struct thread; |
Alexandre Julliard | fdc92ba | 1999-02-14 18:03:15 +0000 | [diff] [blame] | 40 | struct process; |
Mike McCormack | 36cd6f5 | 2003-07-24 00:07:00 +0000 | [diff] [blame] | 41 | struct token; |
Alexandre Julliard | a8b8d9c | 1999-01-01 16:59:27 +0000 | [diff] [blame] | 42 | struct file; |
Alexandre Julliard | c6e45ed | 1998-12-27 08:35:39 +0000 | [diff] [blame] | 43 | struct wait_queue_entry; |
Mike McCormack | 1eac191 | 2000-11-13 19:27:21 +0000 | [diff] [blame] | 44 | struct async; |
Mike McCormack | 6f011c0 | 2001-12-20 00:07:05 +0000 | [diff] [blame] | 45 | struct async_queue; |
Alexandre Julliard | c3ac57d | 2005-07-08 14:23:27 +0000 | [diff] [blame] | 46 | struct winstation; |
Vitaliy Margolen | 3c6bdcc | 2005-11-29 17:21:05 +0100 | [diff] [blame] | 47 | struct directory; |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 48 | |
Vitaliy Margolen | baffcb9 | 2005-11-22 14:55:42 +0000 | [diff] [blame] | 49 | |
| 50 | struct unicode_str |
| 51 | { |
| 52 | const WCHAR *str; |
| 53 | size_t len; |
| 54 | }; |
| 55 | |
Alexandre Julliard | 0562539 | 1999-01-03 11:55:56 +0000 | [diff] [blame] | 56 | /* operations valid on all objects */ |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 57 | struct object_ops |
| 58 | { |
Alexandre Julliard | 5bc7808 | 1999-06-22 17:26:53 +0000 | [diff] [blame] | 59 | /* size of this object type */ |
| 60 | size_t size; |
Alexandre Julliard | c6e45ed | 1998-12-27 08:35:39 +0000 | [diff] [blame] | 61 | /* dump the object (for debugging) */ |
| 62 | void (*dump)(struct object *,int); |
| 63 | /* add a thread to the object wait queue */ |
Alexandre Julliard | a8b8d9c | 1999-01-01 16:59:27 +0000 | [diff] [blame] | 64 | int (*add_queue)(struct object *,struct wait_queue_entry *); |
Alexandre Julliard | c6e45ed | 1998-12-27 08:35:39 +0000 | [diff] [blame] | 65 | /* remove a thread from the object wait queue */ |
| 66 | void (*remove_queue)(struct object *,struct wait_queue_entry *); |
| 67 | /* is object signaled? */ |
| 68 | int (*signaled)(struct object *,struct thread *); |
| 69 | /* wait satisfied; return 1 if abandoned */ |
| 70 | int (*satisfied)(struct object *,struct thread *); |
Mike McCormack | f92fff6 | 2005-04-24 17:35:52 +0000 | [diff] [blame] | 71 | /* signal an object */ |
| 72 | int (*signal)(struct object *, unsigned int); |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 73 | /* return an fd object that can be used to read/write from the object */ |
| 74 | struct fd *(*get_fd)(struct object *); |
Vitaliy Margolen | baffcb9 | 2005-11-22 14:55:42 +0000 | [diff] [blame] | 75 | /* lookup a name if an object has a namespace */ |
| 76 | struct object *(*lookup_name)(struct object *, struct unicode_str *,unsigned int); |
Alexandre Julliard | b9b1ea9 | 2005-06-09 15:39:52 +0000 | [diff] [blame] | 77 | /* close a handle to this object */ |
| 78 | int (*close_handle)(struct object *,struct process *,obj_handle_t); |
Alexandre Julliard | c6e45ed | 1998-12-27 08:35:39 +0000 | [diff] [blame] | 79 | /* destroy on refcount == 0 */ |
| 80 | void (*destroy)(struct object *); |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 81 | }; |
| 82 | |
| 83 | struct object |
| 84 | { |
Alexandre Julliard | 1dca5e2 | 2000-01-01 00:56:27 +0000 | [diff] [blame] | 85 | unsigned int refcount; /* reference count */ |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 86 | const struct object_ops *ops; |
Alexandre Julliard | aa34768 | 2005-03-01 11:49:58 +0000 | [diff] [blame] | 87 | struct list wait_queue; |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 88 | struct object_name *name; |
Alexandre Julliard | 1bdd154 | 1999-06-04 19:47:04 +0000 | [diff] [blame] | 89 | #ifdef DEBUG_OBJECTS |
Alexandre Julliard | 526a28d | 2002-10-02 23:49:30 +0000 | [diff] [blame] | 90 | struct list obj_list; |
Alexandre Julliard | 1bdd154 | 1999-06-04 19:47:04 +0000 | [diff] [blame] | 91 | #endif |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 92 | }; |
| 93 | |
Alexandre Julliard | c5e433a | 2000-05-30 19:48:18 +0000 | [diff] [blame] | 94 | struct wait_queue_entry |
| 95 | { |
Alexandre Julliard | aa34768 | 2005-03-01 11:49:58 +0000 | [diff] [blame] | 96 | struct list entry; |
| 97 | struct object *obj; |
| 98 | struct thread *thread; |
Alexandre Julliard | c5e433a | 2000-05-30 19:48:18 +0000 | [diff] [blame] | 99 | }; |
| 100 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 101 | extern void *mem_alloc( size_t size ); /* malloc wrapper */ |
Alexandre Julliard | d7e85d6 | 1999-11-23 19:39:11 +0000 | [diff] [blame] | 102 | extern void *memdup( const void *data, size_t len ); |
Alexandre Julliard | e66207e | 2003-02-19 00:33:32 +0000 | [diff] [blame] | 103 | extern void *alloc_object( const struct object_ops *ops ); |
Alexandre Julliard | 1bf96e0 | 2005-06-08 18:44:50 +0000 | [diff] [blame] | 104 | extern const WCHAR *get_object_name( struct object *obj, size_t *len ); |
Alexandre Julliard | d16319c | 1999-11-25 21:30:24 +0000 | [diff] [blame] | 105 | extern void dump_object_name( struct object *obj ); |
Vitaliy Margolen | 3c6bdcc | 2005-11-29 17:21:05 +0100 | [diff] [blame] | 106 | extern void *create_object( struct namespace *namespace, const struct object_ops *ops, |
| 107 | const struct unicode_str *name, struct object *parent ); |
Alexandre Julliard | 526a28d | 2002-10-02 23:49:30 +0000 | [diff] [blame] | 108 | extern void *create_named_object( struct namespace *namespace, const struct object_ops *ops, |
Alexandre Julliard | ead9b06 | 2005-11-18 16:31:18 +0000 | [diff] [blame] | 109 | const struct unicode_str *name, unsigned int attributes ); |
Vitaliy Margolen | 1ca6e89 | 2005-11-01 10:22:38 +0000 | [diff] [blame] | 110 | extern struct namespace *create_namespace( unsigned int hash_size ); |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 111 | /* grab/release_object can take any pointer, but you better make sure */ |
| 112 | /* that the thing pointed to starts with a struct object... */ |
| 113 | extern struct object *grab_object( void *obj ); |
| 114 | extern void release_object( void *obj ); |
Alexandre Julliard | ead9b06 | 2005-11-18 16:31:18 +0000 | [diff] [blame] | 115 | extern struct object *find_object( const struct namespace *namespace, const struct unicode_str *name, |
Vitaliy Margolen | 3585f2f | 2005-10-29 12:38:23 +0000 | [diff] [blame] | 116 | unsigned int attributes ); |
Alexandre Julliard | a8b8d9c | 1999-01-01 16:59:27 +0000 | [diff] [blame] | 117 | extern int no_add_queue( struct object *obj, struct wait_queue_entry *entry ); |
Alexandre Julliard | aa0ebd0 | 1998-12-30 12:06:45 +0000 | [diff] [blame] | 118 | extern int no_satisfied( struct object *obj, struct thread *thread ); |
Mike McCormack | f92fff6 | 2005-04-24 17:35:52 +0000 | [diff] [blame] | 119 | extern int no_signal( struct object *obj, unsigned int access ); |
Alexandre Julliard | 863637b | 2003-01-30 00:26:44 +0000 | [diff] [blame] | 120 | extern struct fd *no_get_fd( struct object *obj ); |
Vitaliy Margolen | baffcb9 | 2005-11-22 14:55:42 +0000 | [diff] [blame] | 121 | extern struct object *no_lookup_name( struct object *obj, struct unicode_str *name, unsigned int attributes ); |
Alexandre Julliard | b9b1ea9 | 2005-06-09 15:39:52 +0000 | [diff] [blame] | 122 | extern int no_close_handle( struct object *obj, struct process *process, obj_handle_t handle ); |
Alexandre Julliard | 5bc7808 | 1999-06-22 17:26:53 +0000 | [diff] [blame] | 123 | extern void no_destroy( struct object *obj ); |
Alexandre Julliard | 1bdd154 | 1999-06-04 19:47:04 +0000 | [diff] [blame] | 124 | #ifdef DEBUG_OBJECTS |
| 125 | extern void dump_objects(void); |
| 126 | #endif |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 127 | |
Alexandre Julliard | d6d994f | 1999-09-28 16:40:07 +0000 | [diff] [blame] | 128 | /* event functions */ |
| 129 | |
| 130 | struct event; |
| 131 | |
Alexandre Julliard | ead9b06 | 2005-11-18 16:31:18 +0000 | [diff] [blame] | 132 | extern struct event *create_event( const struct unicode_str *name, unsigned int attr, |
Alexandre Julliard | 6a72dc5 | 2000-04-14 13:42:00 +0000 | [diff] [blame] | 133 | int manual_reset, int initial_state ); |
Alexandre Julliard | 5188574 | 2002-05-30 20:12:58 +0000 | [diff] [blame] | 134 | extern struct event *get_event_obj( struct process *process, obj_handle_t handle, unsigned int access ); |
Alexandre Julliard | d6d994f | 1999-09-28 16:40:07 +0000 | [diff] [blame] | 135 | extern void pulse_event( struct event *event ); |
| 136 | extern void set_event( struct event *event ); |
| 137 | extern void reset_event( struct event *event ); |
| 138 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 139 | /* mutex functions */ |
| 140 | |
Alexandre Julliard | d30dfd2 | 1998-09-27 18:28:36 +0000 | [diff] [blame] | 141 | extern void abandon_mutexes( struct thread *thread ); |
| 142 | |
Mike McCormack | 1eac191 | 2000-11-13 19:27:21 +0000 | [diff] [blame] | 143 | /* serial functions */ |
| 144 | |
Michael McCormack | 1c32a46 | 2001-03-22 20:09:34 +0000 | [diff] [blame] | 145 | int get_serial_async_timeout(struct object *obj, int type, int count); |
Mike McCormack | 1eac191 | 2000-11-13 19:27:21 +0000 | [diff] [blame] | 146 | |
Martin Wilck | 15a0f0e | 2002-07-03 21:04:09 +0000 | [diff] [blame] | 147 | /* socket functions */ |
| 148 | |
| 149 | extern void sock_init(void); |
| 150 | |
Alexandre Julliard | e712e07 | 1999-05-23 19:53:30 +0000 | [diff] [blame] | 151 | /* debugger functions */ |
| 152 | |
Alexandre Julliard | ea0d028 | 2000-03-10 22:16:10 +0000 | [diff] [blame] | 153 | extern int set_process_debugger( struct process *process, struct thread *debugger ); |
Alexandre Julliard | 05f0b71 | 2000-03-09 18:18:41 +0000 | [diff] [blame] | 154 | extern void generate_debug_event( struct thread *thread, int code, void *arg ); |
Alexandre Julliard | b73421d | 2000-03-30 19:30:24 +0000 | [diff] [blame] | 155 | extern void generate_startup_debug_events( struct process *process, void *entry ); |
Alexandre Julliard | ff81d78 | 2000-03-08 12:01:30 +0000 | [diff] [blame] | 156 | extern void debug_exit_thread( struct thread *thread ); |
Alexandre Julliard | e712e07 | 1999-05-23 19:53:30 +0000 | [diff] [blame] | 157 | |
Alexandre Julliard | c76ad35 | 1999-11-13 19:49:05 +0000 | [diff] [blame] | 158 | /* mapping functions */ |
| 159 | |
| 160 | extern int get_page_size(void); |
| 161 | |
Alexandre Julliard | d7e85d6 | 1999-11-23 19:39:11 +0000 | [diff] [blame] | 162 | /* registry functions */ |
| 163 | |
Alexandre Julliard | 6c8d917 | 2000-08-26 04:40:07 +0000 | [diff] [blame] | 164 | extern void init_registry(void); |
Alexandre Julliard | 88e4261 | 2002-06-20 23:18:56 +0000 | [diff] [blame] | 165 | extern void flush_registry(void); |
Alexandre Julliard | d7e85d6 | 1999-11-23 19:39:11 +0000 | [diff] [blame] | 166 | extern void close_registry(void); |
| 167 | |
Alexandre Julliard | 9037f4b | 2003-03-26 01:32:18 +0000 | [diff] [blame] | 168 | /* signal functions */ |
| 169 | |
Alexandre Julliard | 9d99a04 | 2005-08-19 14:01:43 +0000 | [diff] [blame] | 170 | extern void start_watchdog(void); |
| 171 | extern void stop_watchdog(void); |
| 172 | extern int watchdog_triggered(void); |
Alexandre Julliard | 9037f4b | 2003-03-26 01:32:18 +0000 | [diff] [blame] | 173 | extern void init_signals(void); |
| 174 | extern void close_signals(void); |
| 175 | |
Alexandre Julliard | b849d79 | 2000-02-13 13:56:13 +0000 | [diff] [blame] | 176 | /* atom functions */ |
| 177 | |
Alexandre Julliard | c3ac57d | 2005-07-08 14:23:27 +0000 | [diff] [blame] | 178 | extern atom_t add_global_atom( struct winstation *winstation, const WCHAR *str, size_t len ); |
| 179 | extern atom_t find_global_atom( struct winstation *winstation, const WCHAR *str, size_t len ); |
| 180 | extern int grab_global_atom( struct winstation *winstation, atom_t atom ); |
| 181 | extern void release_global_atom( struct winstation *winstation, atom_t atom ); |
Alexandre Julliard | b849d79 | 2000-02-13 13:56:13 +0000 | [diff] [blame] | 182 | |
Vitaliy Margolen | 3c6bdcc | 2005-11-29 17:21:05 +0100 | [diff] [blame] | 183 | /* directory functions */ |
| 184 | |
| 185 | extern struct directory *get_directory_obj( struct process *process, obj_handle_t handle, unsigned int access ); |
| 186 | extern struct object *find_object_dir( struct directory *root, const struct unicode_str *name, |
| 187 | unsigned int attr, struct unicode_str *name_left ); |
| 188 | extern void *create_named_object_dir( struct directory *root, const struct unicode_str *name, |
| 189 | unsigned int attr, const struct object_ops *ops ); |
| 190 | extern obj_handle_t open_object_dir( struct directory *root, const struct unicode_str *name, |
| 191 | unsigned int attr, const struct object_ops *ops, |
| 192 | unsigned int access ); |
| 193 | extern void init_directories(void); |
| 194 | extern void close_directories(void); |
| 195 | |
Vitaliy Margolen | 80444df | 2005-11-30 19:22:57 +0100 | [diff] [blame] | 196 | /* symbolic link functions */ |
| 197 | |
| 198 | extern struct symlink *create_symlink( struct directory *root, const struct unicode_str *name, |
| 199 | unsigned int attr, const struct unicode_str *target ); |
| 200 | |
| 201 | |
Andreas Mohr | c941eff | 2000-09-22 22:37:56 +0000 | [diff] [blame] | 202 | /* global variables */ |
Alexandre Julliard | 2fe5777 | 2000-01-25 01:40:27 +0000 | [diff] [blame] | 203 | |
Andreas Mohr | c941eff | 2000-09-22 22:37:56 +0000 | [diff] [blame] | 204 | /* command-line options */ |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 205 | extern int debug_level; |
Alexandre Julliard | f5e0f0c | 2002-04-03 22:51:18 +0000 | [diff] [blame] | 206 | extern int master_socket_timeout; |
Alexandre Julliard | 7ad5be9 | 2003-03-14 04:08:42 +0000 | [diff] [blame] | 207 | extern int foreground; |
Alexandre Julliard | 88e4261 | 2002-06-20 23:18:56 +0000 | [diff] [blame] | 208 | extern const char *server_argv0; |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 209 | |
Andreas Mohr | c941eff | 2000-09-22 22:37:56 +0000 | [diff] [blame] | 210 | /* server start time used for GetTickCount() */ |
Alexandre Julliard | 9ad5628 | 2005-07-14 10:32:46 +0000 | [diff] [blame] | 211 | extern time_t server_start_time; |
Andreas Mohr | c941eff | 2000-09-22 22:37:56 +0000 | [diff] [blame] | 212 | |
Alexandre Julliard | 526a28d | 2002-10-02 23:49:30 +0000 | [diff] [blame] | 213 | /* name space for synchronization objects */ |
| 214 | extern struct namespace *sync_namespace; |
| 215 | |
Alexandre Julliard | 767e6f6 | 1998-08-09 12:47:43 +0000 | [diff] [blame] | 216 | #endif /* __WINE_SERVER_OBJECT_H */ |