Commit c6f2aacb authored by Alexandre Julliard's avatar Alexandre Julliard

server: Add a type descriptor to all server objects.

parent 928a22cd
......@@ -65,8 +65,8 @@ static void async_destroy( struct object *obj );
static const struct object_ops async_ops =
{
sizeof(struct async), /* size */
&no_type, /* type */
async_dump, /* dump */
no_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
async_signaled, /* signaled */
......@@ -479,8 +479,8 @@ static void iosb_destroy( struct object *obj );
static const struct object_ops iosb_ops =
{
sizeof(struct iosb), /* size */
&no_type, /* type */
iosb_dump, /* dump */
no_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......
......@@ -75,8 +75,8 @@ static void atom_table_destroy( struct object *obj );
static const struct object_ops atom_table_ops =
{
sizeof(struct atom_table), /* size */
&no_type, /* type */
atom_table_dump, /* dump */
no_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......
......@@ -103,15 +103,14 @@ static struct security_descriptor *dir_get_sd( struct object *obj );
static int dir_set_sd( struct object *obj, const struct security_descriptor *sd,
unsigned int set_info );
static void dir_dump( struct object *obj, int verbose );
static struct object_type *dir_get_type( struct object *obj );
static int dir_close_handle( struct object *obj, struct process *process, obj_handle_t handle );
static void dir_destroy( struct object *obj );
static const struct object_ops dir_ops =
{
sizeof(struct dir), /* size */
&file_type, /* type */
dir_dump, /* dump */
dir_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
......@@ -292,13 +291,6 @@ static void dir_dump( struct object *obj, int verbose )
fprintf( stderr, "Dirfile fd=%p filter=%08x\n", dir->fd, dir->filter );
}
static struct object_type *dir_get_type( struct object *obj )
{
static const WCHAR name[] = {'F','i','l','e'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
}
/* enter here directly from SIGIO signal handler */
void do_change_notify( int unix_fd )
{
......
......@@ -72,8 +72,8 @@ static void clipboard_destroy( struct object *obj );
static const struct object_ops clipboard_ops =
{
sizeof(struct clipboard), /* size */
&no_type, /* type */
clipboard_dump, /* dump */
no_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......
......@@ -43,6 +43,13 @@
#include "request.h"
static const WCHAR completion_name[] = {'I','o','C','o','m','p','l','e','t','i','o','n'};
struct type_descr completion_type =
{
{ completion_name, sizeof(completion_name) }, /* name */
};
struct completion
{
struct object obj;
......@@ -51,7 +58,6 @@ struct completion
};
static void completion_dump( struct object*, int );
static struct object_type *completion_get_type( struct object *obj );
static int completion_signaled( struct object *obj, struct wait_queue_entry *entry );
static unsigned int completion_map_access( struct object *obj, unsigned int access );
static void completion_destroy( struct object * );
......@@ -59,8 +65,8 @@ static void completion_destroy( struct object * );
static const struct object_ops completion_ops =
{
sizeof(struct completion), /* size */
&completion_type, /* type */
completion_dump, /* dump */
completion_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
completion_signaled, /* signaled */
......@@ -108,13 +114,6 @@ static void completion_dump( struct object *obj, int verbose )
fprintf( stderr, "Completion depth=%u\n", completion->depth );
}
static struct object_type *completion_get_type( struct object *obj )
{
static const WCHAR name[] = {'I','o','C','o','m','p','l','e','t','i','o','n'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
}
static int completion_signaled( struct object *obj, struct wait_queue_entry *entry )
{
struct completion *completion = (struct completion *)obj;
......
......@@ -76,8 +76,8 @@ static struct object *console_open_file( struct object *obj, unsigned int access
static const struct object_ops console_ops =
{
sizeof(struct console), /* size */
&file_type, /* type */
console_dump, /* dump */
no_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
console_signaled, /* signaled */
......@@ -151,8 +151,8 @@ static struct object *console_server_open_file( struct object *obj, unsigned int
static const struct object_ops console_server_ops =
{
sizeof(struct console_server), /* size */
&file_type, /* type */
console_server_dump, /* dump */
no_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
console_server_signaled, /* signaled */
......@@ -219,8 +219,8 @@ static struct object *screen_buffer_open_file( struct object *obj, unsigned int
static const struct object_ops screen_buffer_ops =
{
sizeof(struct screen_buffer), /* size */
&file_type, /* type */
screen_buffer_dump, /* dump */
no_get_type, /* get_type */
screen_buffer_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -258,7 +258,6 @@ static const struct fd_ops screen_buffer_fd_ops =
default_fd_reselect_async /* reselect_async */
};
static struct object_type *console_device_get_type( struct object *obj );
static void console_device_dump( struct object *obj, int verbose );
static struct object *console_device_lookup_name( struct object *obj, struct unicode_str *name,
unsigned int attr, struct object *root );
......@@ -268,8 +267,8 @@ static struct object *console_device_open_file( struct object *obj, unsigned int
static const struct object_ops console_device_ops =
{
sizeof(struct object), /* size */
&device_type, /* type */
console_device_dump, /* dump */
console_device_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -305,8 +304,8 @@ static void console_input_destroy( struct object *obj );
static const struct object_ops console_input_ops =
{
sizeof(struct console_input), /* size */
&device_type, /* type */
console_input_dump, /* dump */
console_device_get_type, /* get_type */
console_input_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -361,8 +360,8 @@ static void console_output_destroy( struct object *obj );
static const struct object_ops console_output_ops =
{
sizeof(struct console_output), /* size */
&device_type, /* type */
console_output_dump, /* dump */
console_device_get_type, /* get_type */
console_output_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -418,8 +417,8 @@ static void console_connection_destroy( struct object *obj );
static const struct object_ops console_connection_ops =
{
sizeof(struct console_connection),/* size */
&device_type, /* type */
console_connection_dump, /* dump */
console_device_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -1192,13 +1191,6 @@ static void console_connection_destroy( struct object *obj )
if (connection->fd) release_object( connection->fd );
}
static struct object_type *console_device_get_type( struct object *obj )
{
static const WCHAR name[] = {'D','e','v','i','c','e'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
}
static void console_device_dump( struct object *obj, int verbose )
{
fputs( "Console device\n", stderr );
......
......@@ -52,6 +52,13 @@ struct debug_event
debug_event_t data; /* event data */
};
static const WCHAR debug_obj_name[] = {'D','e','b','u','g','O','b','j','e','c','t'};
struct type_descr debug_obj_type =
{
{ debug_obj_name, sizeof(debug_obj_name) }, /* name */
};
/* debug object */
struct debug_obj
{
......@@ -68,8 +75,8 @@ static void debug_event_destroy( struct object *obj );
static const struct object_ops debug_event_ops =
{
sizeof(struct debug_event), /* size */
&no_type, /* type */
debug_event_dump, /* dump */
no_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
debug_event_signaled, /* signaled */
......@@ -90,7 +97,6 @@ static const struct object_ops debug_event_ops =
};
static void debug_obj_dump( struct object *obj, int verbose );
static struct object_type *debug_obj_get_type( struct object *obj );
static int debug_obj_signaled( struct object *obj, struct wait_queue_entry *entry );
static unsigned int debug_obj_map_access( struct object *obj, unsigned int access );
static void debug_obj_destroy( struct object *obj );
......@@ -98,8 +104,8 @@ static void debug_obj_destroy( struct object *obj );
static const struct object_ops debug_obj_ops =
{
sizeof(struct debug_obj), /* size */
&debug_obj_type, /* type */
debug_obj_dump, /* dump */
debug_obj_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
debug_obj_signaled, /* signaled */
......@@ -307,13 +313,6 @@ static void debug_obj_dump( struct object *obj, int verbose )
debug_obj->event_queue.next, debug_obj->event_queue.prev );
}
static struct object_type *debug_obj_get_type( struct object *obj )
{
static const WCHAR name[] = {'D','e','b','u','g','O','b','j','e','c','t'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
}
static int debug_obj_signaled( struct object *obj, struct wait_queue_entry *entry )
{
struct debug_obj *debug_obj = (struct debug_obj *)obj;
......
......@@ -63,8 +63,8 @@ static void irp_call_destroy( struct object *obj );
static const struct object_ops irp_call_ops =
{
sizeof(struct irp_call), /* size */
&no_type, /* type */
irp_call_dump, /* dump */
no_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
irp_call_signaled, /* signaled */
......@@ -103,8 +103,8 @@ static void device_manager_destroy( struct object *obj );
static const struct object_ops device_manager_ops =
{
sizeof(struct device_manager), /* size */
&no_type, /* type */
device_manager_dump, /* dump */
no_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
device_manager_signaled, /* signaled */
......@@ -127,6 +127,13 @@ static const struct object_ops device_manager_ops =
/* device (a single device object) */
static const WCHAR device_name[] = {'D','e','v','i','c','e'};
struct type_descr device_type =
{
{ device_name, sizeof(device_name) }, /* name */
};
struct device
{
struct object obj; /* object header */
......@@ -138,7 +145,6 @@ struct device
};
static void device_dump( struct object *obj, int verbose );
static struct object_type *device_get_type( struct object *obj );
static void device_destroy( struct object *obj );
static struct object *device_open_file( struct object *obj, unsigned int access,
unsigned int sharing, unsigned int options );
......@@ -147,8 +153,8 @@ static struct list *device_get_kernel_obj_list( struct object *obj );
static const struct object_ops device_ops =
{
sizeof(struct device), /* size */
&device_type, /* type */
device_dump, /* dump */
device_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -198,8 +204,8 @@ static void device_file_reselect_async( struct fd *fd, struct async_queue *queue
static const struct object_ops device_file_ops =
{
sizeof(struct device_file), /* size */
&file_type, /* type */
device_file_dump, /* dump */
file_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
......@@ -409,13 +415,6 @@ static void device_dump( struct object *obj, int verbose )
fputs( "Device\n", stderr );
}
static struct object_type *device_get_type( struct object *obj )
{
static const WCHAR name[] = {'D','e','v','i','c','e'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
}
static void device_destroy( struct object *obj )
{
struct device *device = (struct device *)obj;
......
......@@ -41,19 +41,25 @@
#define HASH_SIZE 7 /* default hash size */
static const WCHAR objtype_name[] = {'T','y','p','e'};
struct type_descr objtype_type =
{
{ objtype_name, sizeof(objtype_name) }, /* name */
};
struct object_type
{
struct object obj; /* object header */
};
static void object_type_dump( struct object *obj, int verbose );
static struct object_type *object_type_get_type( struct object *obj );
static const struct object_ops object_type_ops =
{
sizeof(struct object_type), /* size */
&objtype_type, /* type */
object_type_dump, /* dump */
object_type_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -74,6 +80,13 @@ static const struct object_ops object_type_ops =
};
static const WCHAR directory_name[] = {'D','i','r','e','c','t','o','r','y'};
struct type_descr directory_type =
{
{ directory_name, sizeof(directory_name) }, /* name */
};
struct directory
{
struct object obj; /* object header */
......@@ -81,7 +94,6 @@ struct directory
};
static void directory_dump( struct object *obj, int verbose );
static struct object_type *directory_get_type( struct object *obj );
static struct object *directory_lookup_name( struct object *obj, struct unicode_str *name,
unsigned int attr, struct object *root );
static void directory_destroy( struct object *obj );
......@@ -89,8 +101,8 @@ static void directory_destroy( struct object *obj );
static const struct object_ops directory_ops =
{
sizeof(struct directory), /* size */
&directory_type, /* type */
directory_dump, /* dump */
directory_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -114,16 +126,46 @@ static struct directory *root_directory;
static struct directory *dir_objtype;
static struct type_descr *types[] =
{
&objtype_type,
&directory_type,
&symlink_type,
&token_type,
&job_type,
&process_type,
&thread_type,
&debug_obj_type,
&event_type,
&mutex_type,
&semaphore_type,
&timer_type,
&keyed_event_type,
&winstation_type,
&desktop_type,
&device_type,
&completion_type,
&file_type,
&mapping_type,
&key_type,
};
static void object_type_dump( struct object *obj, int verbose )
{
fputs( "Object type\n", stderr );
}
static struct object_type *object_type_get_type( struct object *obj )
static struct object_type *create_object_type( struct object *root, unsigned int index,
unsigned int attr, const struct security_descriptor *sd )
{
static const WCHAR name[] = {'O','b','j','e','c','t','T','y','p','e'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
struct type_descr *descr = types[index];
struct object_type *type;
if ((type = create_named_object( root, &object_type_ops, &descr->name, attr, sd )))
{
descr->index = index;
}
return type;
}
static void directory_dump( struct object *obj, int verbose )
......@@ -131,13 +173,6 @@ static void directory_dump( struct object *obj, int verbose )
fputs( "Directory\n", stderr );
}
static struct object_type *directory_get_type( struct object *obj )
{
static const WCHAR name[] = {'D','i','r','e','c','t','o','r','y'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
}
static struct object *directory_lookup_name( struct object *obj, struct unicode_str *name,
unsigned int attr, struct object *root )
{
......@@ -229,17 +264,6 @@ struct object *get_directory_obj( struct process *process, obj_handle_t handle )
return get_handle_obj( process, handle, 0, &directory_ops );
}
/* retrieve an object type, creating it if needed */
struct object_type *get_object_type( const struct unicode_str *name )
{
struct object_type *type;
if ((type = create_named_object( &dir_objtype->obj, &object_type_ops, name,
OBJ_OPENIF | OBJ_PERMANENT, NULL )))
clear_error();
return type;
}
/* Global initialization */
static void create_session( unsigned int id )
......@@ -426,6 +450,11 @@ void init_directories( struct fd *intl_fd )
create_session( 0 );
create_session( 1 );
/* object types */
for (i = 0; i < ARRAY_SIZE(types); i++)
release_object( create_object_type( &dir_objtype->obj, i, OBJ_PERMANENT, NULL ));
/* symlinks */
release_object( create_obj_symlink( &root_directory->obj, &link_dosdev_str, OBJ_PERMANENT, &dir_global->obj, NULL ));
release_object( create_obj_symlink( &dir_global->obj, &link_global_str, OBJ_PERMANENT, &dir_global->obj, NULL ));
......@@ -497,26 +526,22 @@ DECL_HANDLER(get_directory_entry)
struct object *obj = find_object_index( dir->entries, req->index );
if (obj)
{
data_size_t name_len, type_len = 0;
const WCHAR *type_name = NULL;
data_size_t name_len;
const struct unicode_str *type_name = &obj->ops->type->name;
const WCHAR *name = get_object_name( obj, &name_len );
struct object_type *type = obj->ops->get_type( obj );
if (type) type_name = get_object_name( &type->obj, &type_len );
if (name_len + type_len <= get_reply_max_size())
if (name_len + type_name->len <= get_reply_max_size())
{
void *ptr = set_reply_data_size( name_len + type_len );
void *ptr = set_reply_data_size( name_len + type_name->len );
if (ptr)
{
reply->name_len = name_len;
memcpy( ptr, name, name_len );
memcpy( (char *)ptr + name_len, type_name, type_len );
memcpy( (char *)ptr + name_len, type_name->str, type_name->len );
}
}
else set_error( STATUS_BUFFER_OVERFLOW );
if (type) release_object( type );
release_object( obj );
}
release_object( dir );
......@@ -527,16 +552,12 @@ DECL_HANDLER(get_directory_entry)
DECL_HANDLER(get_object_type)
{
struct object *obj;
struct object_type *type;
const WCHAR *name;
struct type_descr *type;
if (!(obj = get_handle_obj( current->process, req->handle, 0, NULL ))) return;
if ((type = obj->ops->get_type( obj )))
{
if ((name = get_object_name( &type->obj, &reply->total )))
set_reply_data( name, min( reply->total, get_reply_max_size() ) );
release_object( type );
}
type = obj->ops->type;
reply->total = type->name.len;
set_reply_data( type->name.str, min( reply->total, get_reply_max_size() ) );
release_object( obj );
}
......@@ -36,6 +36,13 @@
#include "request.h"
#include "security.h"
static const WCHAR event_name[] = {'E','v','e','n','t'};
struct type_descr event_type =
{
{ event_name, sizeof(event_name) }, /* name */
};
struct event
{
struct object obj; /* object header */
......@@ -45,7 +52,6 @@ struct event
};
static void event_dump( struct object *obj, int verbose );
static struct object_type *event_get_type( struct object *obj );
static int event_signaled( struct object *obj, struct wait_queue_entry *entry );
static void event_satisfied( struct object *obj, struct wait_queue_entry *entry );
static unsigned int event_map_access( struct object *obj, unsigned int access );
......@@ -55,8 +61,8 @@ static struct list *event_get_kernel_obj_list( struct object *obj );
static const struct object_ops event_ops =
{
sizeof(struct event), /* size */
&event_type, /* type */
event_dump, /* dump */
event_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
event_signaled, /* signaled */
......@@ -77,21 +83,27 @@ static const struct object_ops event_ops =
};
static const WCHAR keyed_event_name[] = {'K','e','y','e','d','E','v','e','n','t'};
struct type_descr keyed_event_type =
{
{ keyed_event_name, sizeof(keyed_event_name) }, /* name */
};
struct keyed_event
{
struct object obj; /* object header */
};
static void keyed_event_dump( struct object *obj, int verbose );
static struct object_type *keyed_event_get_type( struct object *obj );
static int keyed_event_signaled( struct object *obj, struct wait_queue_entry *entry );
static unsigned int keyed_event_map_access( struct object *obj, unsigned int access );
static const struct object_ops keyed_event_ops =
{
sizeof(struct keyed_event), /* size */
&keyed_event_type, /* type */
keyed_event_dump, /* dump */
keyed_event_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
keyed_event_signaled, /* signaled */
......@@ -164,13 +176,6 @@ static void event_dump( struct object *obj, int verbose )
event->manual_reset, event->signaled );
}
static struct object_type *event_get_type( struct object *obj )
{
static const WCHAR name[] = {'E','v','e','n','t'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
}
static int event_signaled( struct object *obj, struct wait_queue_entry *entry )
{
struct event *event = (struct event *)obj;
......@@ -240,13 +245,6 @@ static void keyed_event_dump( struct object *obj, int verbose )
fputs( "Keyed event\n", stderr );
}
static struct object_type *keyed_event_get_type( struct object *obj )
{
static const WCHAR name[] = {'K','e','y','e','d','E','v','e','n','t'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
}
static enum select_op matching_op( enum select_op op )
{
return op ^ (SELECT_KEYED_EVENT_WAIT ^ SELECT_KEYED_EVENT_RELEASE);
......
......@@ -205,8 +205,8 @@ static void fd_destroy( struct object *obj );
static const struct object_ops fd_ops =
{
sizeof(struct fd), /* size */
&no_type, /* type */
fd_dump, /* dump */
no_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -246,8 +246,8 @@ static void device_destroy( struct object *obj );
static const struct object_ops device_ops =
{
sizeof(struct device), /* size */
&no_type, /* type */
device_dump, /* dump */
no_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -286,8 +286,8 @@ static void inode_destroy( struct object *obj );
static const struct object_ops inode_ops =
{
sizeof(struct inode), /* size */
&no_type, /* type */
inode_dump, /* dump */
no_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -328,8 +328,8 @@ static int file_lock_signaled( struct object *obj, struct wait_queue_entry *entr
static const struct object_ops file_lock_ops =
{
sizeof(struct file_lock), /* size */
&no_type, /* type */
file_lock_dump, /* dump */
no_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
file_lock_signaled, /* signaled */
......
......@@ -52,6 +52,13 @@
#include "process.h"
#include "security.h"
static const WCHAR file_name[] = {'F','i','l','e'};
struct type_descr file_type =
{
{ file_name, sizeof(file_name) }, /* name */
};
struct file
{
struct object obj; /* object header */
......@@ -80,8 +87,8 @@ static enum server_fd_type file_get_fd_type( struct fd *fd );
static const struct object_ops file_ops =
{
sizeof(struct file), /* size */
&file_type, /* type */
file_dump, /* dump */
file_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
......@@ -279,13 +286,6 @@ static void file_dump( struct object *obj, int verbose )
fprintf( stderr, "File fd=%p\n", file->fd );
}
struct object_type *file_get_type( struct object *obj )
{
static const WCHAR name[] = {'F','i','l','e'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
}
static enum server_fd_type file_get_fd_type( struct fd *fd )
{
struct file *file = get_fd_user( fd );
......
......@@ -159,7 +159,6 @@ extern int get_file_unix_fd( struct file *file );
extern struct file *create_file_for_fd( int fd, unsigned int access, unsigned int sharing );
extern struct file *create_file_for_fd_obj( struct fd *fd, unsigned int access, unsigned int sharing );
extern void file_set_error(void);
extern struct object_type *file_get_type( struct object *obj );
extern struct security_descriptor *mode_to_sd( mode_t mode, const SID *user, const SID *group );
extern mode_t sd_to_mode( const struct security_descriptor *sd, const SID *owner );
extern int is_file_executable( const char *name );
......
......@@ -118,8 +118,8 @@ static void handle_table_destroy( struct object *obj );
static const struct object_ops handle_table_ops =
{
sizeof(struct handle_table), /* size */
&no_type, /* type */
handle_table_dump, /* dump */
no_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......
......@@ -76,8 +76,8 @@ static void hook_table_destroy( struct object *obj );
static const struct object_ops hook_table_ops =
{
sizeof(struct hook_table), /* size */
&no_type, /* type */
hook_table_dump, /* dump */
no_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......
......@@ -73,8 +73,8 @@ static void mailslot_destroy( struct object * );
static const struct object_ops mailslot_ops =
{
sizeof(struct mailslot), /* size */
&file_type, /* type */
mailslot_dump, /* dump */
file_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
......@@ -131,8 +131,8 @@ static void mail_writer_destroy( struct object *obj);
static const struct object_ops mail_writer_ops =
{
sizeof(struct mail_writer), /* size */
&file_type, /* type */
mail_writer_dump, /* dump */
file_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -184,7 +184,6 @@ struct mailslot_device_file
};
static void mailslot_device_dump( struct object *obj, int verbose );
static struct object_type *mailslot_device_get_type( struct object *obj );
static struct object *mailslot_device_lookup_name( struct object *obj, struct unicode_str *name,
unsigned int attr, struct object *root );
static struct object *mailslot_device_open_file( struct object *obj, unsigned int access,
......@@ -194,8 +193,8 @@ static void mailslot_device_destroy( struct object *obj );
static const struct object_ops mailslot_device_ops =
{
sizeof(struct mailslot_device), /* size */
&device_type, /* type */
mailslot_device_dump, /* dump */
mailslot_device_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -224,8 +223,8 @@ static enum server_fd_type mailslot_device_file_get_fd_type( struct fd *fd );
static const struct object_ops mailslot_device_file_ops =
{
sizeof(struct mailslot_device_file), /* size */
&file_type, /* type */
mailslot_device_file_dump, /* dump */
file_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
......@@ -387,13 +386,6 @@ static void mailslot_device_dump( struct object *obj, int verbose )
fputs( "Mailslot device\n", stderr );
}
static struct object_type *mailslot_device_get_type( struct object *obj )
{
static const WCHAR name[] = {'D','e','v','i','c','e'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
}
static struct object *mailslot_device_lookup_name( struct object *obj, struct unicode_str *name,
unsigned int attr, struct object *root )
{
......
......@@ -63,8 +63,8 @@ static void ranges_destroy( struct object *obj );
static const struct object_ops ranges_ops =
{
sizeof(struct ranges), /* size */
&no_type, /* type */
ranges_dump, /* dump */
no_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -99,8 +99,8 @@ static void shared_map_destroy( struct object *obj );
static const struct object_ops shared_map_ops =
{
sizeof(struct shared_map), /* size */
&no_type, /* type */
shared_map_dump, /* dump */
no_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -136,6 +136,14 @@ struct memory_view
file_pos_t start; /* start offset in mapping */
};
static const WCHAR mapping_name[] = {'S','e','c','t','i','o','n'};
struct type_descr mapping_type =
{
{ mapping_name, sizeof(mapping_name) }, /* name */
};
struct mapping
{
struct object obj; /* object header */
......@@ -148,7 +156,6 @@ struct mapping
};
static void mapping_dump( struct object *obj, int verbose );
static struct object_type *mapping_get_type( struct object *obj );
static struct fd *mapping_get_fd( struct object *obj );
static unsigned int mapping_map_access( struct object *obj, unsigned int access );
static void mapping_destroy( struct object *obj );
......@@ -157,8 +164,8 @@ static enum server_fd_type mapping_get_fd_type( struct fd *fd );
static const struct object_ops mapping_ops =
{
sizeof(struct mapping), /* size */
&mapping_type, /* type */
mapping_dump, /* dump */
mapping_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -977,13 +984,6 @@ static void mapping_dump( struct object *obj, int verbose )
mapping->flags, mapping->fd, mapping->shared );
}
static struct object_type *mapping_get_type( struct object *obj )
{
static const WCHAR name[] = {'S','e','c','t','i','o','n'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
}
static struct fd *mapping_get_fd( struct object *obj )
{
struct mapping *mapping = (struct mapping *)obj;
......
......@@ -36,6 +36,13 @@
#include "request.h"
#include "security.h"
static const WCHAR mutex_name[] = {'M','u','t','a','n','t'};
struct type_descr mutex_type =
{
{ mutex_name, sizeof(mutex_name) }, /* name */
};
struct mutex
{
struct object obj; /* object header */
......@@ -46,7 +53,6 @@ struct mutex
};
static void mutex_dump( struct object *obj, int verbose );
static struct object_type *mutex_get_type( struct object *obj );
static int mutex_signaled( struct object *obj, struct wait_queue_entry *entry );
static void mutex_satisfied( struct object *obj, struct wait_queue_entry *entry );
static unsigned int mutex_map_access( struct object *obj, unsigned int access );
......@@ -56,8 +62,8 @@ static int mutex_signal( struct object *obj, unsigned int access );
static const struct object_ops mutex_ops =
{
sizeof(struct mutex), /* size */
&mutex_type, /* type */
mutex_dump, /* dump */
mutex_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
mutex_signaled, /* signaled */
......@@ -141,13 +147,6 @@ static void mutex_dump( struct object *obj, int verbose )
fprintf( stderr, "Mutex count=%u owner=%p\n", mutex->count, mutex->owner );
}
static struct object_type *mutex_get_type( struct object *obj )
{
static const WCHAR name[] = {'M','u','t','a','n','t'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
}
static int mutex_signaled( struct object *obj, struct wait_queue_entry *entry )
{
struct mutex *mutex = (struct mutex *)obj;
......
......@@ -114,8 +114,8 @@ static void named_pipe_destroy( struct object *obj );
static const struct object_ops named_pipe_ops =
{
sizeof(struct named_pipe), /* size */
&no_type, /* type */
named_pipe_dump, /* dump */
no_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -162,8 +162,8 @@ static int pipe_server_ioctl( struct fd *fd, ioctl_code_t code, struct async *as
static const struct object_ops pipe_server_ops =
{
sizeof(struct pipe_server), /* size */
&file_type, /* type */
pipe_server_dump, /* dump */
file_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
......@@ -205,8 +205,8 @@ static int pipe_client_ioctl( struct fd *fd, ioctl_code_t code, struct async *as
static const struct object_ops pipe_client_ops =
{
sizeof(struct pipe_end), /* size */
&file_type, /* type */
pipe_client_dump, /* dump */
file_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
......@@ -242,7 +242,6 @@ static const struct fd_ops pipe_client_fd_ops =
};
static void named_pipe_device_dump( struct object *obj, int verbose );
static struct object_type *named_pipe_device_get_type( struct object *obj );
static struct object *named_pipe_device_lookup_name( struct object *obj,
struct unicode_str *name, unsigned int attr, struct object *root );
static struct object *named_pipe_device_open_file( struct object *obj, unsigned int access,
......@@ -252,8 +251,8 @@ static void named_pipe_device_destroy( struct object *obj );
static const struct object_ops named_pipe_device_ops =
{
sizeof(struct named_pipe_device), /* size */
&device_type, /* type */
named_pipe_device_dump, /* dump */
named_pipe_device_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -283,8 +282,8 @@ static void named_pipe_device_file_destroy( struct object *obj );
static const struct object_ops named_pipe_device_file_ops =
{
sizeof(struct named_pipe_device_file), /* size */
&file_type, /* type */
named_pipe_device_file_dump, /* dump */
file_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
......@@ -491,13 +490,6 @@ static void named_pipe_device_dump( struct object *obj, int verbose )
fputs( "Named pipe device\n", stderr );
}
static struct object_type *named_pipe_device_get_type( struct object *obj )
{
static const WCHAR name[] = {'D','e','v','i','c','e'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
}
static struct object *named_pipe_device_lookup_name( struct object *obj, struct unicode_str *name,
unsigned int attr, struct object *root )
{
......
......@@ -50,6 +50,8 @@ struct namespace
};
struct type_descr no_type = {{ 0 }};
#ifdef DEBUG_OBJECTS
static struct list object_list = LIST_INIT(object_list);
......@@ -491,11 +493,6 @@ struct namespace *create_namespace( unsigned int hash_size )
/* functions for unimplemented/default object operations */
struct object_type *no_get_type( struct object *obj )
{
return NULL;
}
int no_add_queue( struct object *obj, struct wait_queue_entry *entry )
{
set_error( STATUS_OBJECT_TYPE_MISMATCH );
......
......@@ -53,15 +53,22 @@ struct unicode_str
data_size_t len;
};
/* object type descriptor */
struct type_descr
{
struct unicode_str name; /* type name */
unsigned int index; /* index in global array of types */
};
/* operations valid on all objects */
struct object_ops
{
/* size of this object type */
size_t size;
/* type descriptor */
struct type_descr *type;
/* dump the object (for debugging) */
void (*dump)(struct object *,int);
/* return the object type */
struct object_type *(*get_type)(struct object *);
/* add a thread to the object wait queue */
int (*add_queue)(struct object *,struct wait_queue_entry *);
/* remove a thread from the object wait queue */
......@@ -154,7 +161,6 @@ extern void release_object( void *obj );
extern struct object *find_object( const struct namespace *namespace, const struct unicode_str *name,
unsigned int attributes );
extern struct object *find_object_index( const struct namespace *namespace, unsigned int index );
extern struct object_type *no_get_type( struct object *obj );
extern int no_add_queue( struct object *obj, struct wait_queue_entry *entry );
extern void no_satisfied( struct object *obj, struct wait_queue_entry *entry );
extern int no_signal( struct object *obj, unsigned int access );
......@@ -240,7 +246,6 @@ extern void release_global_atom( struct winstation *winstation, atom_t atom );
extern struct object *get_root_directory(void);
extern struct object *get_directory_obj( struct process *process, obj_handle_t handle );
extern struct object_type *get_object_type( const struct unicode_str *name );
extern int directory_link_name( struct object *obj, struct object_name *name, struct object *parent );
extern void init_directories( struct fd *intl_fd );
......@@ -264,6 +269,29 @@ extern const char *server_argv0;
/* server start time used for GetTickCount() */
extern timeout_t server_start_time;
/* object types */
extern struct type_descr no_type;
extern struct type_descr objtype_type;
extern struct type_descr directory_type;
extern struct type_descr symlink_type;
extern struct type_descr token_type;
extern struct type_descr job_type;
extern struct type_descr process_type;
extern struct type_descr thread_type;
extern struct type_descr debug_obj_type;
extern struct type_descr event_type;
extern struct type_descr mutex_type;
extern struct type_descr semaphore_type;
extern struct type_descr timer_type;
extern struct type_descr keyed_event_type;
extern struct type_descr winstation_type;
extern struct type_descr desktop_type;
extern struct type_descr device_type;
extern struct type_descr completion_type;
extern struct type_descr file_type;
extern struct type_descr mapping_type;
extern struct type_descr key_type;
#define KEYEDEVENT_WAIT 0x0001
#define KEYEDEVENT_WAKE 0x0002
#define KEYEDEVENT_ALL_ACCESS (STANDARD_RIGHTS_REQUIRED | 0x0003)
......
......@@ -50,7 +50,7 @@
#include "user.h"
#include "security.h"
/* process structure */
/* process object */
static struct list process_list = LIST_INIT(process_list);
static int running_processes, user_processes;
......@@ -58,10 +58,14 @@ static struct event *shutdown_event; /* signaled when shutdown starts
static struct timeout_user *shutdown_timeout; /* timeout for server shutdown */
static int shutdown_stage; /* current stage in the shutdown process */
/* process operations */
static const WCHAR process_name[] = {'P','r','o','c','e','s','s'};
struct type_descr process_type =
{
{ process_name, sizeof(process_name) }, /* name */
};
static void process_dump( struct object *obj, int verbose );
static struct object_type *process_get_type( struct object *obj );
static int process_signaled( struct object *obj, struct wait_queue_entry *entry );
static unsigned int process_map_access( struct object *obj, unsigned int access );
static struct security_descriptor *process_get_sd( struct object *obj );
......@@ -73,8 +77,8 @@ static void terminate_process( struct process *process, struct thread *skip, int
static const struct object_ops process_ops =
{
sizeof(struct process), /* size */
&process_type, /* type */
process_dump, /* dump */
process_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
process_signaled, /* signaled */
......@@ -124,8 +128,8 @@ static void startup_info_destroy( struct object *obj );
static const struct object_ops startup_info_ops =
{
sizeof(struct startup_info), /* size */
&no_type, /* type */
startup_info_dump, /* dump */
no_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
startup_info_signaled, /* signaled */
......@@ -147,8 +151,14 @@ static const struct object_ops startup_info_ops =
/* job object */
static const WCHAR job_name[] = {'J','o','b'};
struct type_descr job_type =
{
{ job_name, sizeof(job_name) }, /* name */
};
static void job_dump( struct object *obj, int verbose );
static struct object_type *job_get_type( struct object *obj );
static int job_signaled( struct object *obj, struct wait_queue_entry *entry );
static unsigned int job_map_access( struct object *obj, unsigned int access );
static int job_close_handle( struct object *obj, struct process *process, obj_handle_t handle );
......@@ -170,8 +180,8 @@ struct job
static const struct object_ops job_ops =
{
sizeof(struct job), /* size */
&job_type, /* type */
job_dump, /* dump */
job_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
job_signaled, /* signaled */
......@@ -219,13 +229,6 @@ static struct job *get_job_obj( struct process *process, obj_handle_t handle, un
return (struct job *)get_handle_obj( process, handle, access, &job_ops );
}
static struct object_type *job_get_type( struct object *obj )
{
static const WCHAR name[] = {'J','o','b'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
};
static unsigned int job_map_access( struct object *obj, unsigned int access )
{
if (access & GENERIC_READ) access |= STANDARD_RIGHTS_READ;
......@@ -654,13 +657,6 @@ static void process_dump( struct object *obj, int verbose )
fprintf( stderr, "Process id=%04x handles=%p\n", process->id, process->handles );
}
static struct object_type *process_get_type( struct object *obj )
{
static const WCHAR name[] = {'P','r','o','c','e','s','s'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
}
static int process_signaled( struct object *obj, struct wait_queue_entry *entry )
{
struct process *process = (struct process *)obj;
......
......@@ -166,8 +166,8 @@ static void timer_callback( void *private );
static const struct object_ops msg_queue_ops =
{
sizeof(struct msg_queue), /* size */
&no_type, /* type */
msg_queue_dump, /* dump */
no_get_type, /* get_type */
msg_queue_add_queue, /* add_queue */
msg_queue_remove_queue, /* remove_queue */
msg_queue_signaled, /* signaled */
......@@ -203,8 +203,8 @@ static const struct fd_ops msg_queue_fd_ops =
static const struct object_ops thread_input_ops =
{
sizeof(struct thread_input), /* size */
&no_type, /* type */
thread_input_dump, /* dump */
no_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......
......@@ -60,6 +60,13 @@ struct notify
struct process *process; /* process in which the hkey is valid */
};
static const WCHAR key_name[] = {'K','e','y'};
struct type_descr key_type =
{
{ key_name, sizeof(key_name) }, /* name */
};
/* a registry key */
struct key
{
......@@ -146,7 +153,6 @@ struct file_load_info
static void key_dump( struct object *obj, int verbose );
static struct object_type *key_get_type( struct object *obj );
static unsigned int key_map_access( struct object *obj, unsigned int access );
static struct security_descriptor *key_get_sd( struct object *obj );
static WCHAR *key_get_full_name( struct object *obj, data_size_t *len );
......@@ -156,8 +162,8 @@ static void key_destroy( struct object *obj );
static const struct object_ops key_ops =
{
sizeof(struct key), /* size */
&key_type, /* type */
key_dump, /* dump */
key_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -305,13 +311,6 @@ static void key_dump( struct object *obj, int verbose )
fprintf( stderr, "\n" );
}
static struct object_type *key_get_type( struct object *obj )
{
static const WCHAR name[] = {'K','e','y'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
}
/* notify waiter and maybe delete the notification */
static void do_notification( struct key *key, struct notify *notify, int del )
{
......
......@@ -92,8 +92,8 @@ static void master_socket_poll_event( struct fd *fd, int event );
static const struct object_ops master_socket_ops =
{
sizeof(struct master_socket), /* size */
&no_type, /* type */
master_socket_dump, /* dump */
no_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......
......@@ -36,6 +36,13 @@
#include "request.h"
#include "security.h"
static const WCHAR semaphore_name[] = {'S','e','m','a','p','h','o','r','e'};
struct type_descr semaphore_type =
{
{ semaphore_name, sizeof(semaphore_name) }, /* name */
};
struct semaphore
{
struct object obj; /* object header */
......@@ -44,7 +51,6 @@ struct semaphore
};
static void semaphore_dump( struct object *obj, int verbose );
static struct object_type *semaphore_get_type( struct object *obj );
static int semaphore_signaled( struct object *obj, struct wait_queue_entry *entry );
static void semaphore_satisfied( struct object *obj, struct wait_queue_entry *entry );
static unsigned int semaphore_map_access( struct object *obj, unsigned int access );
......@@ -53,8 +59,8 @@ static int semaphore_signal( struct object *obj, unsigned int access );
static const struct object_ops semaphore_ops =
{
sizeof(struct semaphore), /* size */
&semaphore_type, /* type */
semaphore_dump, /* dump */
semaphore_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
semaphore_signaled, /* signaled */
......@@ -127,13 +133,6 @@ static void semaphore_dump( struct object *obj, int verbose )
fprintf( stderr, "Semaphore count=%d max=%d\n", sem->count, sem->max );
}
static struct object_type *semaphore_get_type( struct object *obj )
{
static const WCHAR name[] = {'S','e','m','a','p','h','o','r','e'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
}
static int semaphore_signaled( struct object *obj, struct wait_queue_entry *entry )
{
struct semaphore *sem = (struct semaphore *)obj;
......
......@@ -87,8 +87,8 @@ struct serial
static const struct object_ops serial_ops =
{
sizeof(struct serial), /* size */
&file_type, /* type */
serial_dump, /* dump */
no_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
......
......@@ -62,8 +62,8 @@ static void handler_destroy( struct object *obj );
static const struct object_ops handler_ops =
{
sizeof(struct handler), /* size */
&no_type, /* type */
handler_dump, /* dump */
no_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......
......@@ -183,8 +183,8 @@ static unsigned int sock_get_error( int err );
static const struct object_ops sock_ops =
{
sizeof(struct sock), /* size */
&file_type, /* type */
sock_dump, /* dump */
no_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
sock_signaled, /* signaled */
......@@ -1528,8 +1528,8 @@ struct ifchange
static const struct object_ops ifchange_ops =
{
sizeof(struct ifchange), /* size */
&no_type, /* type */
ifchange_dump, /* dump */
no_get_type, /* get_type */
add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -1739,7 +1739,6 @@ static void sock_release_ifchange( struct sock *sock )
}
}
static struct object_type *socket_device_get_type( struct object *obj );
static void socket_device_dump( struct object *obj, int verbose );
static struct object *socket_device_lookup_name( struct object *obj, struct unicode_str *name,
unsigned int attr, struct object *root );
......@@ -1749,8 +1748,8 @@ static struct object *socket_device_open_file( struct object *obj, unsigned int
static const struct object_ops socket_device_ops =
{
sizeof(struct object), /* size */
&device_type, /* type */
socket_device_dump, /* dump */
socket_device_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -1770,13 +1769,6 @@ static const struct object_ops socket_device_ops =
no_destroy /* destroy */
};
static struct object_type *socket_device_get_type( struct object *obj )
{
static const WCHAR name[] = {'D','e','v','i','c','e'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
}
static void socket_device_dump( struct object *obj, int verbose )
{
fputs( "Socket device\n", stderr );
......
......@@ -38,6 +38,13 @@
#include "object.h"
#include "unicode.h"
static const WCHAR symlink_name[] = {'S','y','m','b','o','l','i','c','L','i','n','k'};
struct type_descr symlink_type =
{
{ symlink_name, sizeof(symlink_name) }, /* name */
};
struct symlink
{
struct object obj; /* object header */
......@@ -46,7 +53,6 @@ struct symlink
};
static void symlink_dump( struct object *obj, int verbose );
static struct object_type *symlink_get_type( struct object *obj );
static unsigned int symlink_map_access( struct object *obj, unsigned int access );
static struct object *symlink_lookup_name( struct object *obj, struct unicode_str *name,
unsigned int attr, struct object *root );
......@@ -55,8 +61,8 @@ static void symlink_destroy( struct object *obj );
static const struct object_ops symlink_ops =
{
sizeof(struct symlink), /* size */
&symlink_type, /* type */
symlink_dump, /* dump */
symlink_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -86,13 +92,6 @@ static void symlink_dump( struct object *obj, int verbose )
fputs( "\"\n", stderr );
}
static struct object_type *symlink_get_type( struct object *obj )
{
static const WCHAR name[] = {'S','y','m','b','o','l','i','c','L','i','n','k'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
}
static struct object *symlink_lookup_name( struct object *obj, struct unicode_str *name,
unsigned int attr, struct object *root )
{
......
......@@ -105,8 +105,8 @@ static void clear_apc_queue( struct list *queue );
static const struct object_ops thread_apc_ops =
{
sizeof(struct thread_apc), /* size */
&no_type, /* type */
dump_thread_apc, /* dump */
no_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
thread_apc_signaled, /* signaled */
......@@ -142,8 +142,8 @@ static int context_signaled( struct object *obj, struct wait_queue_entry *entry
static const struct object_ops context_ops =
{
sizeof(struct context), /* size */
&no_type, /* type */
dump_context, /* dump */
no_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
context_signaled, /* signaled */
......@@ -166,8 +166,14 @@ static const struct object_ops context_ops =
/* thread operations */
static const WCHAR thread_name[] = {'T','h','r','e','a','d'};
struct type_descr thread_type =
{
{ thread_name, sizeof(thread_name) }, /* name */
};
static void dump_thread( struct object *obj, int verbose );
static struct object_type *thread_get_type( struct object *obj );
static int thread_signaled( struct object *obj, struct wait_queue_entry *entry );
static unsigned int thread_map_access( struct object *obj, unsigned int access );
static void thread_poll_event( struct fd *fd, int event );
......@@ -177,8 +183,8 @@ static void destroy_thread( struct object *obj );
static const struct object_ops thread_ops =
{
sizeof(struct thread), /* size */
&thread_type, /* type */
dump_thread, /* dump */
thread_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
thread_signaled, /* signaled */
......@@ -445,13 +451,6 @@ static void dump_thread( struct object *obj, int verbose )
thread->id, thread->unix_pid, thread->unix_tid, thread->state );
}
static struct object_type *thread_get_type( struct object *obj )
{
static const WCHAR name[] = {'T','h','r','e','a','d'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
}
static int thread_signaled( struct object *obj, struct wait_queue_entry *entry )
{
struct thread *mythread = (struct thread *)obj;
......
......@@ -37,6 +37,13 @@
#include "handle.h"
#include "request.h"
static const WCHAR timer_name[] = {'T','i','m','e','r'};
struct type_descr timer_type =
{
{ timer_name, sizeof(timer_name) }, /* name */
};
struct timer
{
struct object obj; /* object header */
......@@ -51,7 +58,6 @@ struct timer
};
static void timer_dump( struct object *obj, int verbose );
static struct object_type *timer_get_type( struct object *obj );
static int timer_signaled( struct object *obj, struct wait_queue_entry *entry );
static void timer_satisfied( struct object *obj, struct wait_queue_entry *entry );
static unsigned int timer_map_access( struct object *obj, unsigned int access );
......@@ -60,8 +66,8 @@ static void timer_destroy( struct object *obj );
static const struct object_ops timer_ops =
{
sizeof(struct timer), /* size */
&timer_type, /* type */
timer_dump, /* dump */
timer_get_type, /* get_type */
add_queue, /* add_queue */
remove_queue, /* remove_queue */
timer_signaled, /* signaled */
......@@ -192,13 +198,6 @@ static void timer_dump( struct object *obj, int verbose )
timer->manual, get_timeout_str(timeout), timer->period );
}
static struct object_type *timer_get_type( struct object *obj )
{
static const WCHAR name[] = {'T','i','m','e','r'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
}
static int timer_signaled( struct object *obj, struct wait_queue_entry *entry )
{
struct timer *timer = (struct timer *)obj;
......
......@@ -97,6 +97,13 @@ const PSID security_high_label_sid = (PSID)&high_label_sid;
static luid_t prev_luid_value = { 1000, 0 };
static const WCHAR token_name[] = {'T','o','k','e','n'};
struct type_descr token_type =
{
{ token_name, sizeof(token_name) }, /* name */
};
struct token
{
struct object obj; /* object header */
......@@ -135,15 +142,14 @@ struct group
};
static void token_dump( struct object *obj, int verbose );
static struct object_type *token_get_type( struct object *obj );
static unsigned int token_map_access( struct object *obj, unsigned int access );
static void token_destroy( struct object *obj );
static const struct object_ops token_ops =
{
sizeof(struct token), /* size */
&token_type, /* type */
token_dump, /* dump */
token_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -171,13 +177,6 @@ static void token_dump( struct object *obj, int verbose )
token->token_id.low_part, token->primary, token->impersonation_level );
}
static struct object_type *token_get_type( struct object *obj )
{
static const WCHAR name[] = {'T','o','k','e','n'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
}
static unsigned int token_map_access( struct object *obj, unsigned int access )
{
if (access & GENERIC_READ) access |= TOKEN_READ;
......
......@@ -43,24 +43,29 @@
static struct list winstation_list = LIST_INIT(winstation_list);
static void winstation_dump( struct object *obj, int verbose );
static struct object_type *winstation_get_type( struct object *obj );
static int winstation_close_handle( struct object *obj, struct process *process, obj_handle_t handle );
static struct object *winstation_lookup_name( struct object *obj, struct unicode_str *name,
unsigned int attr, struct object *root );
static void winstation_destroy( struct object *obj );
static unsigned int winstation_map_access( struct object *obj, unsigned int access );
static void desktop_dump( struct object *obj, int verbose );
static struct object_type *desktop_get_type( struct object *obj );
static int desktop_link_name( struct object *obj, struct object_name *name, struct object *parent );
static int desktop_close_handle( struct object *obj, struct process *process, obj_handle_t handle );
static void desktop_destroy( struct object *obj );
static unsigned int desktop_map_access( struct object *obj, unsigned int access );
static const WCHAR winstation_name[] = {'W','i','n','d','o','w','S','t','a','t','i','o','n'};
struct type_descr winstation_type =
{
{ winstation_name, sizeof(winstation_name) }, /* name */
};
static const struct object_ops winstation_ops =
{
sizeof(struct winstation), /* size */
&winstation_type, /* type */
winstation_dump, /* dump */
winstation_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -81,11 +86,18 @@ static const struct object_ops winstation_ops =
};
static const WCHAR desktop_name[] = {'D','e','s','k','t','o','p'};
struct type_descr desktop_type =
{
{ desktop_name, sizeof(desktop_name) }, /* name */
};
static const struct object_ops desktop_ops =
{
sizeof(struct desktop), /* size */
&desktop_type, /* type */
desktop_dump, /* dump */
desktop_get_type, /* get_type */
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
......@@ -142,13 +154,6 @@ static void winstation_dump( struct object *obj, int verbose )
winstation->flags, winstation->clipboard, winstation->atom_table );
}
static struct object_type *winstation_get_type( struct object *obj )
{
static const WCHAR name[] = {'W','i','n','d','o','w','S','t','a','t','i','o','n'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
}
static int winstation_close_handle( struct object *obj, struct process *process, obj_handle_t handle )
{
return (process->winstation != handle);
......@@ -247,13 +252,6 @@ static void desktop_dump( struct object *obj, int verbose )
desktop->flags, desktop->winstation, desktop->top_window, desktop->global_hooks );
}
static struct object_type *desktop_get_type( struct object *obj )
{
static const WCHAR name[] = {'D','e','s','k','t','o','p'};
static const struct unicode_str str = { name, sizeof(name) };
return get_object_type( &str );
}
static int desktop_link_name( struct object *obj, struct object_name *name, struct object *parent )
{
struct winstation *winstation = (struct winstation *)parent;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment