From 2e51f9aae37777762321f1e813a7e9c6050e02e2 Mon Sep 17 00:00:00 2001
From: Alexandre Julliard <julliard@winehq.org>
Date: Tue, 22 Sep 2020 16:52:31 +0200
Subject: [PATCH] server: Add an object operation to retrieve an object name.

Signed-off-by: Alexandre Julliard <julliard@winehq.org>
---
 server/async.c      | 2 ++
 server/atom.c       | 1 +
 server/change.c     | 1 +
 server/clipboard.c  | 1 +
 server/completion.c | 1 +
 server/console.c    | 6 ++++++
 server/debugger.c   | 2 ++
 server/device.c     | 4 ++++
 server/directory.c  | 2 ++
 server/event.c      | 2 ++
 server/fd.c         | 4 ++++
 server/file.c       | 1 +
 server/handle.c     | 3 ++-
 server/hook.c       | 1 +
 server/mailslot.c   | 4 ++++
 server/mapping.c    | 3 +++
 server/mutex.c      | 1 +
 server/named_pipe.c | 5 +++++
 server/object.c     | 7 ++++++-
 server/object.h     | 5 ++++-
 server/process.c    | 3 +++
 server/queue.c      | 2 ++
 server/registry.c   | 1 +
 server/request.c    | 1 +
 server/semaphore.c  | 1 +
 server/serial.c     | 1 +
 server/signal.c     | 1 +
 server/sock.c       | 3 +++
 server/symlink.c    | 3 ++-
 server/thread.c     | 3 +++
 server/timer.c      | 1 +
 server/token.c      | 1 +
 server/winstation.c | 2 ++
 33 files changed, 75 insertions(+), 4 deletions(-)

diff --git a/server/async.c b/server/async.c
index 03994e8fac2..24fed811da2 100644
--- a/server/async.c
+++ b/server/async.c
@@ -76,6 +76,7 @@ static const struct object_ops async_ops =
     no_map_access,             /* map_access */
     default_get_sd,            /* get_sd */
     default_set_sd,            /* set_sd */
+    no_get_full_name,          /* get_full_name */
     no_lookup_name,            /* lookup_name */
     no_link_name,              /* link_name */
     NULL,                      /* unlink_name */
@@ -489,6 +490,7 @@ static const struct object_ops iosb_ops =
     no_map_access,            /* map_access */
     default_get_sd,           /* get_sd */
     default_set_sd,           /* set_sd */
+    no_get_full_name,         /* get_full_name */
     no_lookup_name,           /* lookup_name */
     no_link_name,             /* link_name */
     NULL,                     /* unlink_name */
diff --git a/server/atom.c b/server/atom.c
index 57aff7b8918..e14650bde2c 100644
--- a/server/atom.c
+++ b/server/atom.c
@@ -86,6 +86,7 @@ static const struct object_ops atom_table_ops =
     no_map_access,                /* map_access */
     default_get_sd,               /* get_sd */
     default_set_sd,               /* set_sd */
+    no_get_full_name,             /* get_full_name */
     no_lookup_name,               /* lookup_name */
     no_link_name,                 /* link_name */
     NULL,                         /* unlink_name */
diff --git a/server/change.c b/server/change.c
index a8f3329c722..8e4a272bc8b 100644
--- a/server/change.c
+++ b/server/change.c
@@ -121,6 +121,7 @@ static const struct object_ops dir_ops =
     default_fd_map_access,    /* map_access */
     dir_get_sd,               /* get_sd */
     dir_set_sd,               /* set_sd */
+    no_get_full_name,         /* get_full_name */
     no_lookup_name,           /* lookup_name */
     no_link_name,             /* link_name */
     NULL,                     /* unlink_name */
diff --git a/server/clipboard.c b/server/clipboard.c
index e6884dd75fa..e4546832620 100644
--- a/server/clipboard.c
+++ b/server/clipboard.c
@@ -83,6 +83,7 @@ static const struct object_ops clipboard_ops =
     no_map_access,                /* map_access */
     default_get_sd,               /* get_sd */
     default_set_sd,               /* set_sd */
+    no_get_full_name,             /* get_full_name */
     no_lookup_name,               /* lookup_name */
     no_link_name,                 /* link_name */
     NULL,                         /* unlink_name */
diff --git a/server/completion.c b/server/completion.c
index db04727b93b..0bad4d7a260 100644
--- a/server/completion.c
+++ b/server/completion.c
@@ -70,6 +70,7 @@ static const struct object_ops completion_ops =
     completion_map_access,     /* map_access */
     default_get_sd,            /* get_sd */
     default_set_sd,            /* set_sd */
+    default_get_full_name,     /* get_full_name */
     no_lookup_name,            /* lookup_name */
     directory_link_name,       /* link_name */
     default_unlink_name,       /* unlink_name */
diff --git a/server/console.c b/server/console.c
index 2a5d7733fe1..c2dcd50dd83 100644
--- a/server/console.c
+++ b/server/console.c
@@ -100,6 +100,7 @@ static const struct object_ops console_input_ops =
     default_fd_map_access,            /* map_access */
     default_get_sd,                   /* get_sd */
     default_set_sd,                   /* set_sd */
+    no_get_full_name,                 /* get_full_name */
     console_input_lookup_name,        /* lookup_name */
     no_link_name,                     /* link_name */
     NULL,                             /* unlink_name */
@@ -158,6 +159,7 @@ static const struct object_ops console_input_events_ops =
     default_fd_map_access,            /* map_access */
     default_get_sd,                   /* get_sd */
     default_set_sd,                   /* set_sd */
+    no_get_full_name,                 /* get_full_name */
     no_lookup_name,                   /* lookup_name */
     no_link_name,                     /* link_name */
     NULL,                             /* unlink_name */
@@ -226,6 +228,7 @@ static const struct object_ops console_server_ops =
     default_fd_map_access,            /* map_access */
     default_get_sd,                   /* get_sd */
     default_set_sd,                   /* set_sd */
+    no_get_full_name,                 /* get_full_name */
     console_server_lookup_name,       /* lookup_name */
     no_link_name,                     /* link_name */
     NULL,                             /* unlink_name */
@@ -308,6 +311,7 @@ static const struct object_ops screen_buffer_ops =
     default_fd_map_access,            /* map_access */
     default_get_sd,                   /* get_sd */
     default_set_sd,                   /* set_sd */
+    no_get_full_name,                 /* get_full_name */
     no_lookup_name,                   /* lookup_name */
     no_link_name,                     /* link_name */
     NULL,                             /* unlink_name */
@@ -354,6 +358,7 @@ static const struct object_ops console_device_ops =
     default_fd_map_access,            /* map_access */
     default_get_sd,                   /* get_sd */
     default_set_sd,                   /* set_sd */
+    default_get_full_name,            /* get_full_name */
     console_device_lookup_name,       /* lookup_name */
     directory_link_name,              /* link_name */
     default_unlink_name,              /* unlink_name */
@@ -391,6 +396,7 @@ static const struct object_ops console_connection_ops =
     no_map_access,                    /* map_access */
     default_get_sd,                   /* get_sd */
     default_set_sd,                   /* set_sd */
+    no_get_full_name,                 /* get_full_name */
     console_connection_lookup_name,   /* lookup_name */
     directory_link_name,              /* link_name */
     default_unlink_name,              /* unlink_name */
diff --git a/server/debugger.c b/server/debugger.c
index 401ce36a47a..e4a6c1e43a8 100644
--- a/server/debugger.c
+++ b/server/debugger.c
@@ -79,6 +79,7 @@ static const struct object_ops debug_event_ops =
     no_map_access,                 /* map_access */
     default_get_sd,                /* get_sd */
     default_set_sd,                /* set_sd */
+    no_get_full_name,              /* get_full_name */
     no_lookup_name,                /* lookup_name */
     no_link_name,                  /* link_name */
     NULL,                          /* unlink_name */
@@ -106,6 +107,7 @@ static const struct object_ops debug_ctx_ops =
     no_map_access,                 /* map_access */
     default_get_sd,                /* get_sd */
     default_set_sd,                /* set_sd */
+    no_get_full_name,              /* get_full_name */
     no_lookup_name,                /* lookup_name */
     no_link_name,                  /* link_name */
     NULL,                          /* unlink_name */
diff --git a/server/device.c b/server/device.c
index 01e08f295f7..4241f37e894 100644
--- a/server/device.c
+++ b/server/device.c
@@ -74,6 +74,7 @@ static const struct object_ops irp_call_ops =
     no_map_access,                    /* map_access */
     default_get_sd,                   /* get_sd */
     default_set_sd,                   /* set_sd */
+    no_get_full_name,                 /* get_full_name */
     no_lookup_name,                   /* lookup_name */
     no_link_name,                     /* link_name */
     NULL,                             /* unlink_name */
@@ -113,6 +114,7 @@ static const struct object_ops device_manager_ops =
     no_map_access,                    /* map_access */
     default_get_sd,                   /* get_sd */
     default_set_sd,                   /* set_sd */
+    no_get_full_name,                 /* get_full_name */
     no_lookup_name,                   /* lookup_name */
     no_link_name,                     /* link_name */
     NULL,                             /* unlink_name */
@@ -156,6 +158,7 @@ static const struct object_ops device_ops =
     default_fd_map_access,            /* map_access */
     default_get_sd,                   /* get_sd */
     default_set_sd,                   /* set_sd */
+    default_get_full_name,            /* get_full_name */
     no_lookup_name,                   /* lookup_name */
     directory_link_name,              /* link_name */
     default_unlink_name,              /* unlink_name */
@@ -205,6 +208,7 @@ static const struct object_ops device_file_ops =
     default_fd_map_access,            /* map_access */
     default_get_sd,                   /* get_sd */
     default_set_sd,                   /* set_sd */
+    no_get_full_name,                 /* get_full_name */
     no_lookup_name,                   /* lookup_name */
     no_link_name,                     /* link_name */
     NULL,                             /* unlink_name */
diff --git a/server/directory.c b/server/directory.c
index c66d10b1928..ef0a1038a50 100644
--- a/server/directory.c
+++ b/server/directory.c
@@ -63,6 +63,7 @@ static const struct object_ops object_type_ops =
     no_map_access,                /* map_access */
     default_get_sd,               /* get_sd */
     default_set_sd,               /* set_sd */
+    default_get_full_name,        /* get_full_name */
     no_lookup_name,               /* lookup_name */
     directory_link_name,          /* link_name */
     default_unlink_name,          /* unlink_name */
@@ -99,6 +100,7 @@ static const struct object_ops directory_ops =
     default_fd_map_access,        /* map_access */
     default_get_sd,               /* get_sd */
     default_set_sd,               /* set_sd */
+    default_get_full_name,        /* get_full_name */
     directory_lookup_name,        /* lookup_name */
     directory_link_name,          /* link_name */
     default_unlink_name,          /* unlink_name */
diff --git a/server/event.c b/server/event.c
index d339d85aa45..cba9472aa3d 100644
--- a/server/event.c
+++ b/server/event.c
@@ -66,6 +66,7 @@ static const struct object_ops event_ops =
     event_map_access,          /* map_access */
     default_get_sd,            /* get_sd */
     default_set_sd,            /* set_sd */
+    default_get_full_name,     /* get_full_name */
     no_lookup_name,            /* lookup_name */
     directory_link_name,       /* link_name */
     default_unlink_name,       /* unlink_name */
@@ -100,6 +101,7 @@ static const struct object_ops keyed_event_ops =
     keyed_event_map_access,      /* map_access */
     default_get_sd,              /* get_sd */
     default_set_sd,              /* set_sd */
+    default_get_full_name,       /* get_full_name */
     no_lookup_name,              /* lookup_name */
     directory_link_name,         /* link_name */
     default_unlink_name,         /* unlink_name */
diff --git a/server/fd.c b/server/fd.c
index 59db13bae52..edb59b0d540 100644
--- a/server/fd.c
+++ b/server/fd.c
@@ -216,6 +216,7 @@ static const struct object_ops fd_ops =
     no_map_access,            /* map_access */
     default_get_sd,           /* get_sd */
     default_set_sd,           /* set_sd */
+    no_get_full_name,         /* get_full_name */
     no_lookup_name,           /* lookup_name */
     no_link_name,             /* link_name */
     NULL,                     /* unlink_name */
@@ -256,6 +257,7 @@ static const struct object_ops device_ops =
     no_map_access,            /* map_access */
     default_get_sd,           /* get_sd */
     default_set_sd,           /* set_sd */
+    no_get_full_name,         /* get_full_name */
     no_lookup_name,           /* lookup_name */
     no_link_name,             /* link_name */
     NULL,                     /* unlink_name */
@@ -295,6 +297,7 @@ static const struct object_ops inode_ops =
     no_map_access,            /* map_access */
     default_get_sd,           /* get_sd */
     default_set_sd,           /* set_sd */
+    no_get_full_name,         /* get_full_name */
     no_lookup_name,           /* lookup_name */
     no_link_name,             /* link_name */
     NULL,                     /* unlink_name */
@@ -336,6 +339,7 @@ static const struct object_ops file_lock_ops =
     no_map_access,              /* map_access */
     default_get_sd,             /* get_sd */
     default_set_sd,             /* set_sd */
+    no_get_full_name,           /* get_full_name */
     no_lookup_name,             /* lookup_name */
     no_link_name,               /* link_name */
     NULL,                       /* unlink_name */
diff --git a/server/file.c b/server/file.c
index 38260cfd2b3..4690af2424e 100644
--- a/server/file.c
+++ b/server/file.c
@@ -91,6 +91,7 @@ static const struct object_ops file_ops =
     default_fd_map_access,        /* map_access */
     file_get_sd,                  /* get_sd */
     file_set_sd,                  /* set_sd */
+    no_get_full_name,             /* get_full_name */
     file_lookup_name,             /* lookup_name */
     no_link_name,                 /* link_name */
     NULL,                         /* unlink_name */
diff --git a/server/handle.c b/server/handle.c
index e0a21329449..b2c7371e697 100644
--- a/server/handle.c
+++ b/server/handle.c
@@ -129,6 +129,7 @@ static const struct object_ops handle_table_ops =
     no_map_access,                   /* map_access */
     default_get_sd,                  /* get_sd */
     default_set_sd,                  /* set_sd */
+    no_get_full_name,                /* get_full_name */
     no_lookup_name,                  /* lookup_name */
     no_link_name,                    /* link_name */
     NULL,                            /* unlink_name */
@@ -670,7 +671,7 @@ DECL_HANDLER(get_object_info)
     reply->access = get_handle_access( current->process, req->handle );
     reply->ref_count = obj->refcount;
     reply->handle_count = obj->handle_count;
-    if ((name = get_object_full_name( obj, &reply->total )))
+    if ((name = obj->ops->get_full_name( obj, &reply->total )))
         set_reply_data_ptr( name, min( reply->total, get_reply_max_size() ));
     release_object( obj );
 }
diff --git a/server/hook.c b/server/hook.c
index ec6be582482..2a3da247313 100644
--- a/server/hook.c
+++ b/server/hook.c
@@ -87,6 +87,7 @@ static const struct object_ops hook_table_ops =
     no_map_access,                /* map_access */
     default_get_sd,               /* get_sd */
     default_set_sd,               /* set_sd */
+    no_get_full_name,             /* get_full_name */
     no_lookup_name,               /* lookup_name */
     no_link_name,                 /* link_name */
     NULL,                         /* unlink_name */
diff --git a/server/mailslot.c b/server/mailslot.c
index 58d650cbb25..fa1a0c2c15a 100644
--- a/server/mailslot.c
+++ b/server/mailslot.c
@@ -84,6 +84,7 @@ static const struct object_ops mailslot_ops =
     mailslot_map_access,       /* map_access */
     default_get_sd,            /* get_sd */
     default_set_sd,            /* set_sd */
+    default_get_full_name,     /* get_full_name */
     no_lookup_name,            /* lookup_name */
     mailslot_link_name,        /* link_name */
     default_unlink_name,       /* unlink_name */
@@ -141,6 +142,7 @@ static const struct object_ops mail_writer_ops =
     mail_writer_map_access,     /* map_access */
     default_get_sd,             /* get_sd */
     default_set_sd,             /* set_sd */
+    no_get_full_name,           /* get_full_name */
     no_lookup_name,             /* lookup_name */
     no_link_name,               /* link_name */
     NULL,                       /* unlink_name */
@@ -203,6 +205,7 @@ static const struct object_ops mailslot_device_ops =
     no_map_access,                  /* map_access */
     default_get_sd,                 /* get_sd */
     default_set_sd,                 /* set_sd */
+    default_get_full_name,          /* get_full_name */
     mailslot_device_lookup_name,    /* lookup_name */
     directory_link_name,            /* link_name */
     default_unlink_name,            /* unlink_name */
@@ -231,6 +234,7 @@ static const struct object_ops mailslot_device_file_ops =
     default_fd_map_access,                  /* map_access */
     default_get_sd,                         /* get_sd */
     default_set_sd,                         /* set_sd */
+    no_get_full_name,                       /* get_full_name */
     no_lookup_name,                         /* lookup_name */
     no_link_name,                           /* link_name */
     NULL,                                   /* unlink_name */
diff --git a/server/mapping.c b/server/mapping.c
index db0debe0af5..8955df7ec2e 100644
--- a/server/mapping.c
+++ b/server/mapping.c
@@ -74,6 +74,7 @@ static const struct object_ops ranges_ops =
     no_map_access,             /* map_access */
     default_get_sd,            /* get_sd */
     default_set_sd,            /* set_sd */
+    no_get_full_name,          /* get_full_name */
     no_lookup_name,            /* lookup_name */
     no_link_name,              /* link_name */
     NULL,                      /* unlink_name */
@@ -109,6 +110,7 @@ static const struct object_ops shared_map_ops =
     no_map_access,             /* map_access */
     default_get_sd,            /* get_sd */
     default_set_sd,            /* set_sd */
+    no_get_full_name,          /* get_full_name */
     no_lookup_name,            /* lookup_name */
     no_link_name,              /* link_name */
     NULL,                      /* unlink_name */
@@ -166,6 +168,7 @@ static const struct object_ops mapping_ops =
     mapping_map_access,          /* map_access */
     default_get_sd,              /* get_sd */
     default_set_sd,              /* set_sd */
+    default_get_full_name,       /* get_full_name */
     no_lookup_name,              /* lookup_name */
     directory_link_name,         /* link_name */
     default_unlink_name,         /* unlink_name */
diff --git a/server/mutex.c b/server/mutex.c
index 8a8f7248eae..823ad54ffc3 100644
--- a/server/mutex.c
+++ b/server/mutex.c
@@ -67,6 +67,7 @@ static const struct object_ops mutex_ops =
     mutex_map_access,          /* map_access */
     default_get_sd,            /* get_sd */
     default_set_sd,            /* set_sd */
+    default_get_full_name,     /* get_full_name */
     no_lookup_name,            /* lookup_name */
     directory_link_name,       /* link_name */
     default_unlink_name,       /* unlink_name */
diff --git a/server/named_pipe.c b/server/named_pipe.c
index e7e5436c0e5..4f9890258b4 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -124,6 +124,7 @@ static const struct object_ops named_pipe_ops =
     named_pipe_map_access,        /* map_access */
     default_get_sd,               /* get_sd */
     default_set_sd,               /* set_sd */
+    default_get_full_name,        /* get_full_name */
     no_lookup_name,               /* lookup_name */
     named_pipe_link_name,         /* link_name */
     default_unlink_name,          /* unlink_name */
@@ -166,6 +167,7 @@ static const struct object_ops pipe_server_ops =
     default_fd_map_access,        /* map_access */
     pipe_end_get_sd,              /* get_sd */
     pipe_end_set_sd,              /* set_sd */
+    no_get_full_name,             /* get_full_name */
     no_lookup_name,               /* lookup_name */
     no_link_name,                 /* link_name */
     NULL,                         /* unlink_name */
@@ -208,6 +210,7 @@ static const struct object_ops pipe_client_ops =
     default_fd_map_access,        /* map_access */
     pipe_end_get_sd,              /* get_sd */
     pipe_end_set_sd,              /* set_sd */
+    no_get_full_name,             /* get_full_name */
     no_lookup_name,               /* lookup_name */
     no_link_name,                 /* link_name */
     NULL,                         /* unlink_name */
@@ -254,6 +257,7 @@ static const struct object_ops named_pipe_device_ops =
     no_map_access,                    /* map_access */
     default_get_sd,                   /* get_sd */
     default_set_sd,                   /* set_sd */
+    default_get_full_name,            /* get_full_name */
     named_pipe_device_lookup_name,    /* lookup_name */
     directory_link_name,              /* link_name */
     default_unlink_name,              /* unlink_name */
@@ -283,6 +287,7 @@ static const struct object_ops named_pipe_device_file_ops =
     default_fd_map_access,                   /* map_access */
     default_get_sd,                          /* get_sd */
     default_set_sd,                          /* set_sd */
+    no_get_full_name,                        /* get_full_name */
     no_lookup_name,                          /* lookup_name */
     no_link_name,                            /* link_name */
     NULL,                                    /* unlink_name */
diff --git a/server/object.c b/server/object.c
index 8ec6609f69d..c4c62cb78ad 100644
--- a/server/object.c
+++ b/server/object.c
@@ -158,7 +158,7 @@ const WCHAR *get_object_name( struct object *obj, data_size_t *len )
 }
 
 /* get the full path name of an existing object */
-WCHAR *get_object_full_name( struct object *obj, data_size_t *ret_len )
+WCHAR *default_get_full_name( struct object *obj, data_size_t *ret_len )
 {
     static const WCHAR backslash = '\\';
     struct object *ptr = obj;
@@ -686,6 +686,11 @@ int default_set_sd( struct object *obj, const struct security_descriptor *sd,
     return set_sd_defaults_from_token( obj, sd, set_info, current->process->token );
 }
 
+WCHAR *no_get_full_name( struct object *obj, data_size_t *ret_len )
+{
+    return NULL;
+}
+
 struct object *no_lookup_name( struct object *obj, struct unicode_str *name,
                                unsigned int attr )
 {
diff --git a/server/object.h b/server/object.h
index 1f5c4a5f061..53e37b61a21 100644
--- a/server/object.h
+++ b/server/object.h
@@ -80,6 +80,8 @@ struct object_ops
     struct security_descriptor *(*get_sd)( struct object * );
     /* sets the security descriptor of the object */
     int (*set_sd)( struct object *, const struct security_descriptor *, unsigned int );
+    /* get the object full name */
+    WCHAR *(*get_full_name)(struct object *, data_size_t *);
     /* lookup a name if an object has a namespace */
     struct object *(*lookup_name)(struct object *, struct unicode_str *,unsigned int);
     /* link an object's name into a parent object */
@@ -132,7 +134,7 @@ extern void *memdup( const void *data, size_t len );
 extern void *alloc_object( const struct object_ops *ops );
 extern void namespace_add( struct namespace *namespace, struct object_name *ptr );
 extern const WCHAR *get_object_name( struct object *obj, data_size_t *len );
-extern WCHAR *get_object_full_name( struct object *obj, data_size_t *ret_len );
+extern WCHAR *default_get_full_name( struct object *obj, data_size_t *ret_len );
 extern void dump_object_name( struct object *obj );
 extern struct object *lookup_named_object( struct object *root, const struct unicode_str *name,
                                            unsigned int attr, struct unicode_str *name_left );
@@ -164,6 +166,7 @@ extern struct security_descriptor *default_get_sd( struct object *obj );
 extern int default_set_sd( struct object *obj, const struct security_descriptor *sd, unsigned int set_info );
 extern int set_sd_defaults_from_token( struct object *obj, const struct security_descriptor *sd,
                                        unsigned int set_info, struct token *token );
+extern WCHAR *no_get_full_name( struct object *obj, data_size_t *ret_len );
 extern struct object *no_lookup_name( struct object *obj, struct unicode_str *name, unsigned int attributes );
 extern int no_link_name( struct object *obj, struct object_name *name, struct object *parent );
 extern void default_unlink_name( struct object *obj, struct object_name *name );
diff --git a/server/process.c b/server/process.c
index 72ffa8e9a5a..1c9148f1e0c 100644
--- a/server/process.c
+++ b/server/process.c
@@ -84,6 +84,7 @@ static const struct object_ops process_ops =
     process_map_access,          /* map_access */
     process_get_sd,              /* get_sd */
     default_set_sd,              /* set_sd */
+    no_get_full_name,            /* get_full_name */
     no_lookup_name,              /* lookup_name */
     no_link_name,                /* link_name */
     NULL,                        /* unlink_name */
@@ -134,6 +135,7 @@ static const struct object_ops startup_info_ops =
     no_map_access,                 /* map_access */
     default_get_sd,                /* get_sd */
     default_set_sd,                /* set_sd */
+    no_get_full_name,              /* get_full_name */
     no_lookup_name,                /* lookup_name */
     no_link_name,                  /* link_name */
     NULL,                          /* unlink_name */
@@ -179,6 +181,7 @@ static const struct object_ops job_ops =
     job_map_access,                /* map_access */
     default_get_sd,                /* get_sd */
     default_set_sd,                /* set_sd */
+    default_get_full_name,         /* get_full_name */
     no_lookup_name,                /* lookup_name */
     directory_link_name,           /* link_name */
     default_unlink_name,           /* unlink_name */
diff --git a/server/queue.c b/server/queue.c
index c1016016051..2c780a94e2c 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -177,6 +177,7 @@ static const struct object_ops msg_queue_ops =
     no_map_access,             /* map_access */
     default_get_sd,            /* get_sd */
     default_set_sd,            /* set_sd */
+    no_get_full_name,          /* get_full_name */
     no_lookup_name,            /* lookup_name */
     no_link_name,              /* link_name */
     NULL,                      /* unlink_name */
@@ -213,6 +214,7 @@ static const struct object_ops thread_input_ops =
     no_map_access,                /* map_access */
     default_get_sd,               /* get_sd */
     default_set_sd,               /* set_sd */
+    no_get_full_name,             /* get_full_name */
     no_lookup_name,               /* lookup_name */
     no_link_name,                 /* link_name */
     NULL,                         /* unlink_name */
diff --git a/server/registry.c b/server/registry.c
index dcbb3f791e1..f4386d9bfb5 100644
--- a/server/registry.c
+++ b/server/registry.c
@@ -165,6 +165,7 @@ static const struct object_ops key_ops =
     key_map_access,          /* map_access */
     key_get_sd,              /* get_sd */
     default_set_sd,          /* set_sd */
+    no_get_full_name,        /* get_full_name */
     no_lookup_name,          /* lookup_name */
     no_link_name,            /* link_name */
     NULL,                    /* unlink_name */
diff --git a/server/request.c b/server/request.c
index 8f3bad8701d..45076d90e25 100644
--- a/server/request.c
+++ b/server/request.c
@@ -102,6 +102,7 @@ static const struct object_ops master_socket_ops =
     no_map_access,                 /* map_access */
     default_get_sd,                /* get_sd */
     default_set_sd,                /* set_sd */
+    no_get_full_name,              /* get_full_name */
     no_lookup_name,                /* lookup_name */
     no_link_name,                  /* link_name */
     NULL,                          /* unlink_name */
diff --git a/server/semaphore.c b/server/semaphore.c
index 6e2415fd79a..cbcf4a4f942 100644
--- a/server/semaphore.c
+++ b/server/semaphore.c
@@ -64,6 +64,7 @@ static const struct object_ops semaphore_ops =
     semaphore_map_access,          /* map_access */
     default_get_sd,                /* get_sd */
     default_set_sd,                /* set_sd */
+    default_get_full_name,         /* get_full_name */
     no_lookup_name,                /* lookup_name */
     directory_link_name,           /* link_name */
     default_unlink_name,           /* unlink_name */
diff --git a/server/serial.c b/server/serial.c
index 4292472613a..30fe6e8380f 100644
--- a/server/serial.c
+++ b/server/serial.c
@@ -98,6 +98,7 @@ static const struct object_ops serial_ops =
     default_fd_map_access,        /* map_access */
     default_get_sd,               /* get_sd */
     default_set_sd,               /* set_sd */
+    no_get_full_name,             /* get_full_name */
     no_lookup_name,               /* lookup_name */
     no_link_name,                 /* link_name */
     NULL,                         /* unlink_name */
diff --git a/server/signal.c b/server/signal.c
index c81f6b8e989..8a9cbdd0ed3 100644
--- a/server/signal.c
+++ b/server/signal.c
@@ -73,6 +73,7 @@ static const struct object_ops handler_ops =
     no_map_access,            /* map_access */
     default_get_sd,           /* get_sd */
     default_set_sd,           /* set_sd */
+    no_get_full_name,         /* get_full_name */
     no_lookup_name,           /* lookup_name */
     no_link_name,             /* link_name */
     NULL,                     /* unlink_name */
diff --git a/server/sock.c b/server/sock.c
index 346d3758f30..c9cf2d56da3 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -152,6 +152,7 @@ static const struct object_ops sock_ops =
     default_fd_map_access,        /* map_access */
     default_get_sd,               /* get_sd */
     default_set_sd,               /* set_sd */
+    no_get_full_name,             /* get_full_name */
     no_lookup_name,               /* lookup_name */
     no_link_name,                 /* link_name */
     NULL,                         /* unlink_name */
@@ -985,6 +986,7 @@ static const struct object_ops ifchange_ops =
     default_fd_map_access,   /* map_access */
     default_get_sd,          /* get_sd */
     default_set_sd,          /* set_sd */
+    no_get_full_name,        /* get_full_name */
     no_lookup_name,          /* lookup_name */
     no_link_name,            /* link_name */
     NULL,                    /* unlink_name */
@@ -1204,6 +1206,7 @@ static const struct object_ops socket_device_ops =
     default_fd_map_access,      /* map_access */
     default_get_sd,             /* get_sd */
     default_set_sd,             /* set_sd */
+    default_get_full_name,      /* get_full_name */
     socket_device_lookup_name,  /* lookup_name */
     directory_link_name,        /* link_name */
     default_unlink_name,        /* unlink_name */
diff --git a/server/symlink.c b/server/symlink.c
index 7a2f8642d5f..b620f2accb9 100644
--- a/server/symlink.c
+++ b/server/symlink.c
@@ -66,6 +66,7 @@ static const struct object_ops symlink_ops =
     symlink_map_access,           /* map_access */
     default_get_sd,               /* get_sd */
     default_set_sd,               /* set_sd */
+    default_get_full_name,        /* get_full_name */
     symlink_lookup_name,          /* lookup_name */
     directory_link_name,          /* link_name */
     default_unlink_name,          /* unlink_name */
@@ -164,7 +165,7 @@ struct object *create_obj_symlink( struct object *root, const struct unicode_str
     data_size_t len;
     WCHAR *target_name;
 
-    if (!(target_name = get_object_full_name( target, &len )))
+    if (!(target_name = target->ops->get_full_name( target, &len )))
     {
         set_error( STATUS_INVALID_PARAMETER );
         return NULL;
diff --git a/server/thread.c b/server/thread.c
index 9b14174578e..eb138079739 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -116,6 +116,7 @@ static const struct object_ops thread_apc_ops =
     no_map_access,              /* map_access */
     default_get_sd,             /* get_sd */
     default_set_sd,             /* set_sd */
+    no_get_full_name,           /* get_full_name */
     no_lookup_name,             /* lookup_name */
     no_link_name,               /* link_name */
     NULL,                       /* unlink_name */
@@ -152,6 +153,7 @@ static const struct object_ops context_ops =
     no_map_access,              /* map_access */
     default_get_sd,             /* get_sd */
     default_set_sd,             /* set_sd */
+    no_get_full_name,           /* get_full_name */
     no_lookup_name,             /* lookup_name */
     no_link_name,               /* link_name */
     NULL,                       /* unlink_name */
@@ -186,6 +188,7 @@ static const struct object_ops thread_ops =
     thread_map_access,          /* map_access */
     default_get_sd,             /* get_sd */
     default_set_sd,             /* set_sd */
+    no_get_full_name,           /* get_full_name */
     no_lookup_name,             /* lookup_name */
     no_link_name,               /* link_name */
     NULL,                       /* unlink_name */
diff --git a/server/timer.c b/server/timer.c
index 469f9d5a90b..d4e5c56267c 100644
--- a/server/timer.c
+++ b/server/timer.c
@@ -71,6 +71,7 @@ static const struct object_ops timer_ops =
     timer_map_access,          /* map_access */
     default_get_sd,            /* get_sd */
     default_set_sd,            /* set_sd */
+    default_get_full_name,     /* get_full_name */
     no_lookup_name,            /* lookup_name */
     directory_link_name,       /* link_name */
     default_unlink_name,       /* unlink_name */
diff --git a/server/token.c b/server/token.c
index 2fa95e17aaf..23e85ebbff3 100644
--- a/server/token.c
+++ b/server/token.c
@@ -152,6 +152,7 @@ static const struct object_ops token_ops =
     token_map_access,          /* map_access */
     default_get_sd,            /* get_sd */
     default_set_sd,            /* set_sd */
+    no_get_full_name,          /* get_full_name */
     no_lookup_name,            /* lookup_name */
     no_link_name,              /* link_name */
     NULL,                      /* unlink_name */
diff --git a/server/winstation.c b/server/winstation.c
index 2962ea0df4a..b0142908549 100644
--- a/server/winstation.c
+++ b/server/winstation.c
@@ -70,6 +70,7 @@ static const struct object_ops winstation_ops =
     winstation_map_access,        /* map_access */
     default_get_sd,               /* get_sd */
     default_set_sd,               /* set_sd */
+    default_get_full_name,        /* get_full_name */
     winstation_lookup_name,       /* lookup_name */
     directory_link_name,          /* link_name */
     default_unlink_name,          /* unlink_name */
@@ -94,6 +95,7 @@ static const struct object_ops desktop_ops =
     desktop_map_access,           /* map_access */
     default_get_sd,               /* get_sd */
     default_set_sd,               /* set_sd */
+    default_get_full_name,        /* get_full_name */
     no_lookup_name,               /* lookup_name */
     desktop_link_name,            /* link_name */
     default_unlink_name,          /* unlink_name */
-- 
GitLab