server: Support console global symlinks.

Signed-off-by: Jacek Caban <jacek@codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Jacek Caban 2020-06-25 22:27:19 +02:00 committed by Alexandre Julliard
parent 52c04e1e39
commit 18f83c12a0
3 changed files with 35 additions and 16 deletions

View File

@ -347,11 +347,26 @@ void init_directories(void)
static const WCHAR link_nulW[] = {'N','U','L'};
static const WCHAR link_pipeW[] = {'P','I','P','E'};
static const WCHAR link_mailslotW[] = {'M','A','I','L','S','L','O','T'};
static const WCHAR link_coninW[] = {'C','O','N','I','N','$'};
static const WCHAR link_conoutW[] = {'C','O','N','O','U','T','$'};
static const WCHAR link_conW[] = {'C','O','N'};
static const WCHAR link_currentinW[] = {'\\','D','e','v','i','c','e','\\','C','o','n','D','r','v',
'\\','C','u','r','r','e','n','t','I','n'};
static const WCHAR link_currentoutW[] = {'\\','D','e','v','i','c','e','\\','C','o','n','D','r','v',
'\\','C','u','r','r','e','n','t','O','u','t'};
static const WCHAR link_consoleW[] = {'\\','D','e','v','i','c','e','\\','C','o','n','D','r','v',
'\\','C','o','n','s','o','l','e'};
static const struct unicode_str link_dosdev_str = {link_dosdevW, sizeof(link_dosdevW)};
static const struct unicode_str link_global_str = {link_globalW, sizeof(link_globalW)};
static const struct unicode_str link_nul_str = {link_nulW, sizeof(link_nulW)};
static const struct unicode_str link_pipe_str = {link_pipeW, sizeof(link_pipeW)};
static const struct unicode_str link_mailslot_str = {link_mailslotW, sizeof(link_mailslotW)};
static const struct unicode_str link_con_str = {link_conW, sizeof(link_conW)};
static const struct unicode_str link_conin_str = {link_coninW, sizeof(link_coninW)};
static const struct unicode_str link_conout_str = {link_conoutW, sizeof(link_conoutW)};
static const struct unicode_str link_currentin_str = {link_currentinW, sizeof(link_currentinW)};
static const struct unicode_str link_currentout_str = {link_currentoutW, sizeof(link_currentoutW)};
static const struct unicode_str link_console_str = {link_consoleW, sizeof(link_consoleW)};
/* devices */
static const WCHAR named_pipeW[] = {'N','a','m','e','d','P','i','p','e'};
@ -388,6 +403,7 @@ void init_directories(void)
struct directory *dir_driver, *dir_device, *dir_global, *dir_kernel;
struct object *link_dosdev, *link_global, *link_nul, *link_pipe, *link_mailslot;
struct object *link_conin, *link_conout, *link_con;
struct object *named_pipe_device, *mailslot_device, *null_device, *user_data_mapping, *console_device;
struct keyed_event *keyed_event;
unsigned int i;
@ -422,11 +438,17 @@ void init_directories(void)
link_nul = create_obj_symlink( &dir_global->obj, &link_nul_str, 0, null_device, NULL );
link_pipe = create_obj_symlink( &dir_global->obj, &link_pipe_str, 0, named_pipe_device, NULL );
link_mailslot = create_obj_symlink( &dir_global->obj, &link_mailslot_str, 0, mailslot_device, NULL );
link_conin = create_symlink( &dir_global->obj, &link_conin_str, 0, &link_currentin_str, NULL );
link_conout = create_symlink( &dir_global->obj, &link_conout_str, 0, &link_currentout_str, NULL );
link_con = create_symlink( &dir_global->obj, &link_con_str, 0, &link_console_str, NULL );
make_object_static( link_dosdev );
make_object_static( link_global );
make_object_static( link_nul );
make_object_static( link_pipe );
make_object_static( link_mailslot );
make_object_static( link_conin );
make_object_static( link_conout );
make_object_static( link_con );
/* events */
for (i = 0; i < ARRAY_SIZE( kernel_events ); i++)

View File

@ -244,6 +244,9 @@ extern void init_directories(void);
extern struct object *create_obj_symlink( struct object *root, const struct unicode_str *name,
unsigned int attr, struct object *target,
const struct security_descriptor *sd );
extern struct object *create_symlink( struct object *root, const struct unicode_str *name,
unsigned int attr, const struct unicode_str *target,
const struct security_descriptor *sd );
/* global variables */

View File

@ -134,7 +134,7 @@ static void symlink_destroy( struct object *obj )
free( symlink->target );
}
static struct symlink *create_symlink( struct object *root, const struct unicode_str *name,
struct object *create_symlink( struct object *root, const struct unicode_str *name,
unsigned int attr, const struct unicode_str *target,
const struct security_descriptor *sd )
{
@ -145,20 +145,14 @@ static struct symlink *create_symlink( struct object *root, const struct unicode
set_error( STATUS_INVALID_PARAMETER );
return NULL;
}
if ((symlink = create_named_object( root, &symlink_ops, name, attr, sd )) &&
(get_error() != STATUS_OBJECT_NAME_EXISTS))
{
if ((symlink->target = memdup( target->str, target->len )))
{
symlink->len = target->len;
}
else
if (!(symlink = create_named_object( root, &symlink_ops, name, attr, sd ))) return NULL;
if (get_error() != STATUS_OBJECT_NAME_EXISTS && !(symlink->target = memdup( target->str, target->len )))
{
release_object( symlink );
symlink = NULL;
return NULL;
}
}
return symlink;
symlink->len = target->len;
return &symlink->obj;
}
/* create a symlink pointing to an existing object */
@ -190,7 +184,7 @@ struct object *create_obj_symlink( struct object *root, const struct unicode_str
/* create a symbolic link object */
DECL_HANDLER(create_symlink)
{
struct symlink *symlink;
struct object *symlink;
struct unicode_str name, target;
struct object *root;
const struct security_descriptor *sd;