winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
January
2003
December
November
October
September
August
July
June
May
April
March
February
January
2002
December
November
October
September
August
July
June
May
April
March
February
January
2001
December
November
October
September
August
July
June
May
April
March
February
List overview
wine-commits
June 2024
----- 2025 -----
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
1 participants
613 discussions
Start a n
N
ew thread
Rémi Bernon : server: Allocate shared session object for desktops.
by Alexandre Julliard
20 Jun '24
20 Jun '24
Module: wine Branch: master Commit: 1e10e3a1c02b1d39b12b6e81e7719e223482f3a2 URL:
https://gitlab.winehq.org/wine/wine/-/commit/1e10e3a1c02b1d39b12b6e81e7719e…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Tue May 7 09:52:18 2024 +0200 server: Allocate shared session object for desktops. --- include/wine/server_protocol.h | 9 +++- server/file.h | 3 ++ server/mapping.c | 106 +++++++++++++++++++++++++++++++++++++++++ server/protocol.def | 7 ++- server/user.h | 1 + server/winstation.c | 7 +++ 6 files changed, 130 insertions(+), 3 deletions(-) diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 0b5aca33c69..b75b88b956d 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -883,9 +883,14 @@ struct directory_entry -typedef volatile union +typedef volatile struct { char placeholder; +} desktop_shm_t; + +typedef volatile union +{ + desktop_shm_t desktop; } object_shm_t; typedef volatile struct @@ -6547,7 +6552,7 @@ union generic_reply /* ### protocol_version begin ### */ -#define SERVER_PROTOCOL_VERSION 809 +#define SERVER_PROTOCOL_VERSION 810 /* ### protocol_version end ### */ diff --git a/server/file.h b/server/file.h index 661e8f9d159..abfc2f0a2ce 100644 --- a/server/file.h +++ b/server/file.h @@ -192,6 +192,9 @@ extern struct mapping *create_session_mapping( struct object *root, const struct unsigned int attr, const struct security_descriptor *sd ); extern void set_session_mapping( struct mapping *mapping ); +extern const volatile void *alloc_shared_object(void); +extern void free_shared_object( const volatile void *object_shm ); + #define SHARED_WRITE_BEGIN( object_shm, type ) \ do { \ const type *__shared = (object_shm); \ diff --git a/server/mapping.c b/server/mapping.c index 6605c111beb..f77de343f4f 100644 --- a/server/mapping.c +++ b/server/mapping.c @@ -229,17 +229,30 @@ struct session_block { struct list entry; /* entry in the session block list */ const char *data; /* base pointer for the mmaped data */ + mem_size_t offset; /* offset of data in the session shared mapping */ + mem_size_t used_size; /* used size for previously allocated objects */ + mem_size_t block_size; /* total size of the block */ +}; + +struct session_object +{ + struct list entry; /* entry in the session free object list */ + mem_size_t offset; /* offset of obj in the session shared mapping */ + shared_object_t obj; /* object actually shared with the client */ }; struct session { struct list blocks; + struct list free_objects; + object_id_t last_object_id; }; static struct mapping *session_mapping; static struct session session = { .blocks = LIST_INIT(session.blocks), + .free_objects = LIST_INIT(session.free_objects), }; #define ROUND_SIZE(size) (((size) + page_mask) & ~page_mask) @@ -1297,10 +1310,103 @@ void set_session_mapping( struct mapping *mapping ) } block->data = tmp; + block->offset = 0; + block->used_size = 0; + block->block_size = size; + session_mapping = mapping; list_add_tail( &session.blocks, &block->entry ); } +static struct session_block *grow_session_mapping( mem_size_t needed ) +{ + mem_size_t old_size = session_mapping->size, new_size; + struct session_block *block; + int unix_fd; + void *tmp; + + new_size = max( old_size * 3 / 2, old_size + max( needed, 0x10000 ) ); + new_size = (new_size + page_mask) & ~((mem_size_t)page_mask); + assert( new_size > old_size ); + + unix_fd = get_unix_fd( session_mapping->fd ); + if (!grow_file( unix_fd, new_size )) return NULL; + + if (!(block = mem_alloc( sizeof(*block) ))) return NULL; + if ((tmp = mmap( NULL, new_size - old_size, PROT_READ | PROT_WRITE, MAP_SHARED, unix_fd, old_size )) == MAP_FAILED) + { + file_set_error(); + free( block ); + return NULL; + } + + block->data = tmp; + block->offset = old_size; + block->used_size = 0; + block->block_size = new_size - old_size; + + session_mapping->size = new_size; + list_add_tail( &session.blocks, &block->entry ); + + return block; +} + +static struct session_block *find_free_session_block( mem_size_t size ) +{ + struct session_block *block; + + LIST_FOR_EACH_ENTRY( block, &session.blocks, struct session_block, entry ) + if (size < block->block_size && block->used_size < block->block_size - size) return block; + + return grow_session_mapping( size ); +} + +const volatile void *alloc_shared_object(void) +{ + struct session_object *object; + struct list *ptr; + + if ((ptr = list_head( &session.free_objects ))) + { + object = CONTAINING_RECORD( ptr, struct session_object, entry ); + list_remove( &object->entry ); + } + else + { + mem_size_t size = sizeof(*object); + struct session_block *block; + + if (!(block = find_free_session_block( size ))) return NULL; + object = (struct session_object *)(block->data + block->used_size); + object->offset = (char *)&object->obj - block->data; + block->used_size += size; + } + + SHARED_WRITE_BEGIN( &object->obj.shm, object_shm_t ) + { + /* mark the object data as uninitialized */ + mark_block_uninitialized( (void *)shared, sizeof(*shared) ); + CONTAINING_RECORD( shared, shared_object_t, shm )->id = ++session.last_object_id; + } + SHARED_WRITE_END; + + return &object->obj.shm; +} + +void free_shared_object( const volatile void *object_shm ) +{ + struct session_object *object = CONTAINING_RECORD( object_shm, struct session_object, obj.shm ); + + SHARED_WRITE_BEGIN( &object->obj.shm, object_shm_t ) + { + mark_block_noaccess( (void *)shared, sizeof(*shared) ); + CONTAINING_RECORD( shared, shared_object_t, shm )->id = 0; + } + SHARED_WRITE_END; + + list_add_tail( &session.free_objects, &object->entry ); +} + struct object *create_user_data_mapping( struct object *root, const struct unicode_str *name, unsigned int attr, const struct security_descriptor *sd ) { diff --git a/server/protocol.def b/server/protocol.def index aad95db1195..de763210ac9 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -899,9 +899,14 @@ struct directory_entry /****************************************************************/ /* shared session mapping structures */ -typedef volatile union +typedef volatile struct { char placeholder; +} desktop_shm_t; + +typedef volatile union +{ + desktop_shm_t desktop; } object_shm_t; typedef volatile struct diff --git a/server/user.h b/server/user.h index 8ff837a34bf..cb68e4fc314 100644 --- a/server/user.h +++ b/server/user.h @@ -93,6 +93,7 @@ struct desktop struct global_cursor cursor; /* global cursor information */ unsigned char keystate[256]; /* asynchronous key state */ struct key_repeat key_repeat; /* key auto-repeat */ + const desktop_shm_t *shared; /* desktop session shared memory */ }; /* user handles functions */ diff --git a/server/winstation.c b/server/winstation.c index 66fb6ad1e35..270720437b0 100644 --- a/server/winstation.c +++ b/server/winstation.c @@ -298,6 +298,12 @@ static struct desktop *create_desktop( const struct unicode_str *name, unsigned list_add_tail( &winstation->desktops, &desktop->entry ); list_init( &desktop->hotkeys ); list_init( &desktop->pointers ); + + if (!(desktop->shared = alloc_shared_object())) + { + release_object( desktop ); + return NULL; + } } else { @@ -368,6 +374,7 @@ static void desktop_destroy( struct object *obj ) if (desktop->close_timeout) remove_timeout_user( desktop->close_timeout ); if (desktop->key_repeat.timeout) remove_timeout_user( desktop->key_repeat.timeout ); release_object( desktop->winstation ); + if (desktop->shared) free_shared_object( desktop->shared ); } /* retrieve the thread desktop, checking the handle access rights */
1
0
0
0
Rémi Bernon : include: Add ReadNoFence64 inline helpers.
by Alexandre Julliard
20 Jun '24
20 Jun '24
Module: wine Branch: master Commit: f82b1c1fcf770a5d6fa02c3f286282be79a201b8 URL:
https://gitlab.winehq.org/wine/wine/-/commit/f82b1c1fcf770a5d6fa02c3f286282…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Fri Jun 16 09:58:53 2023 +0200 include: Add ReadNoFence64 inline helpers. --- include/winnt.h | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/include/winnt.h b/include/winnt.h index c4749bf7028..c042afa16c1 100644 --- a/include/winnt.h +++ b/include/winnt.h @@ -7082,11 +7082,14 @@ static FORCEINLINE void MemoryBarrier(void) */ #if _MSC_VER >= 1700 #pragma intrinsic(__iso_volatile_load32) +#pragma intrinsic(__iso_volatile_load64) #pragma intrinsic(__iso_volatile_store32) #define __WINE_LOAD32_NO_FENCE(src) (__iso_volatile_load32(src)) +#define __WINE_LOAD64_NO_FENCE(src) (__iso_volatile_load64(src)) #define __WINE_STORE32_NO_FENCE(dest, value) (__iso_volatile_store32(dest, value)) #else /* _MSC_VER >= 1700 */ #define __WINE_LOAD32_NO_FENCE(src) (*(src)) +#define __WINE_LOAD64_NO_FENCE(src) (*(src)) #define __WINE_STORE32_NO_FENCE(dest, value) ((void)(*(dest) = (value))) #endif /* _MSC_VER >= 1700 */ @@ -7120,6 +7123,12 @@ static FORCEINLINE LONG ReadNoFence( LONG const volatile *src ) return value; } +static FORCEINLINE LONG64 ReadNoFence64( LONG64 const volatile *src ) +{ + LONG64 value = __WINE_LOAD64_NO_FENCE( (__int64 const volatile *)src ); + return value; +} + static FORCEINLINE void WriteRelease( LONG volatile *dest, LONG value ) { __wine_memory_barrier_acq_rel(); @@ -7306,6 +7315,13 @@ static FORCEINLINE LONG ReadNoFence( LONG const volatile *src ) return value; } +static FORCEINLINE LONG64 ReadNoFence64( LONG64 const volatile *src ) +{ + LONG64 value; + __WINE_ATOMIC_LOAD_RELAXED( src, &value ); + return value; +} + static FORCEINLINE void WriteRelease( LONG volatile *dest, LONG value ) { __WINE_ATOMIC_STORE_RELEASE( dest, &value );
1
0
0
0
Rémi Bernon : server: Create a global session shared mapping.
by Alexandre Julliard
20 Jun '24
20 Jun '24
Module: wine Branch: master Commit: fac940dfac314c2b1c120cf9ff8503259153c5a0 URL:
https://gitlab.winehq.org/wine/wine/-/commit/fac940dfac314c2b1c120cf9ff8503…
Author: Rémi Bernon <rbernon(a)codeweavers.com> Date: Mon Feb 19 21:38:21 2024 +0100 server: Create a global session shared mapping. --- include/wine/server_protocol.h | 18 ++++++++++++++++- server/directory.c | 7 +++++++ server/file.h | 19 ++++++++++++++++++ server/mapping.c | 45 ++++++++++++++++++++++++++++++++++++++++++ server/object.c | 13 +++++++++++- server/object.h | 2 ++ server/protocol.def | 16 +++++++++++++++ server/request.h | 1 + tools/make_requests | 1 + 9 files changed, 120 insertions(+), 2 deletions(-) diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index e16f1ceb7c3..0b5aca33c69 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -29,6 +29,7 @@ typedef unsigned __int64 mem_size_t; typedef unsigned __int64 file_pos_t; typedef unsigned __int64 client_ptr_t; typedef unsigned __int64 affinity_t; +typedef unsigned __int64 object_id_t; typedef client_ptr_t mod_handle_t; struct request_header @@ -882,6 +883,21 @@ struct directory_entry +typedef volatile union +{ + char placeholder; +} object_shm_t; + +typedef volatile struct +{ + LONG64 seq; + object_id_t id; + object_shm_t shm; +} shared_object_t; + + + + struct new_process_request { @@ -6531,7 +6547,7 @@ union generic_reply /* ### protocol_version begin ### */ -#define SERVER_PROTOCOL_VERSION 808 +#define SERVER_PROTOCOL_VERSION 809 /* ### protocol_version end ### */ diff --git a/server/directory.c b/server/directory.c index 8a140309871..b3f055dfd01 100644 --- a/server/directory.c +++ b/server/directory.c @@ -439,11 +439,14 @@ void init_directories( struct fd *intl_fd ) /* mappings */ static const WCHAR intlW[] = {'N','l','s','S','e','c','t','i','o','n','L','A','N','G','_','I','N','T','L'}; static const WCHAR user_dataW[] = {'_','_','w','i','n','e','_','u','s','e','r','_','s','h','a','r','e','d','_','d','a','t','a'}; + static const WCHAR sessionW[] = {'_','_','w','i','n','e','_','s','e','s','s','i','o','n'}; static const struct unicode_str intl_str = {intlW, sizeof(intlW)}; static const struct unicode_str user_data_str = {user_dataW, sizeof(user_dataW)}; + static const struct unicode_str session_str = {sessionW, sizeof(sessionW)}; struct directory *dir_driver, *dir_device, *dir_global, *dir_kernel, *dir_nls; struct object *named_pipe_device, *mailslot_device, *null_device; + struct mapping *session_mapping; unsigned int i; root_directory = create_directory( NULL, NULL, OBJ_PERMANENT, HASH_SIZE, NULL ); @@ -491,6 +494,10 @@ void init_directories( struct fd *intl_fd ) release_object( create_user_data_mapping( &dir_kernel->obj, &user_data_str, OBJ_PERMANENT, NULL )); release_object( intl_fd ); + session_mapping = create_session_mapping( &dir_kernel->obj, &session_str, OBJ_PERMANENT, NULL ); + set_session_mapping( session_mapping ); + release_object( session_mapping ); + release_object( named_pipe_device ); release_object( mailslot_device ); release_object( null_device ); diff --git a/server/file.h b/server/file.h index 7f2d1637863..661e8f9d159 100644 --- a/server/file.h +++ b/server/file.h @@ -188,6 +188,25 @@ extern struct mapping *create_fd_mapping( struct object *root, const struct unic unsigned int attr, const struct security_descriptor *sd ); extern struct object *create_user_data_mapping( struct object *root, const struct unicode_str *name, unsigned int attr, const struct security_descriptor *sd ); +extern struct mapping *create_session_mapping( struct object *root, const struct unicode_str *name, + unsigned int attr, const struct security_descriptor *sd ); +extern void set_session_mapping( struct mapping *mapping ); + +#define SHARED_WRITE_BEGIN( object_shm, type ) \ + do { \ + const type *__shared = (object_shm); \ + type *shared = (type *)__shared; \ + shared_object_t *__obj = CONTAINING_RECORD( shared, shared_object_t, shm ); \ + LONG64 __seq = __obj->seq + 1, __end = __seq + 1; \ + assert( (__seq & 1) != 0 ); \ + __WINE_ATOMIC_STORE_RELEASE( &__obj->seq, &__seq ); \ + do + +#define SHARED_WRITE_END \ + while(0); \ + assert( __seq == __obj->seq ); \ + __WINE_ATOMIC_STORE_RELEASE( &__obj->seq, &__end ); \ + } while(0) /* device functions */ diff --git a/server/mapping.c b/server/mapping.c index ff99b45ce51..6605c111beb 100644 --- a/server/mapping.c +++ b/server/mapping.c @@ -225,6 +225,23 @@ static const mem_size_t granularity_mask = 0xffff; static struct addr_range ranges32; static struct addr_range ranges64; +struct session_block +{ + struct list entry; /* entry in the session block list */ + const char *data; /* base pointer for the mmaped data */ +}; + +struct session +{ + struct list blocks; +}; + +static struct mapping *session_mapping; +static struct session session = +{ + .blocks = LIST_INIT(session.blocks), +}; + #define ROUND_SIZE(size) (((size) + page_mask) & ~page_mask) void init_memory(void) @@ -1256,6 +1273,34 @@ int get_page_size(void) return page_mask + 1; } +struct mapping *create_session_mapping( struct object *root, const struct unicode_str *name, + unsigned int attr, const struct security_descriptor *sd ) +{ + static const unsigned int access = FILE_READ_DATA | FILE_WRITE_DATA; + mem_size_t size = max( sizeof(shared_object_t) * 512, 0x10000 ); + + return create_mapping( root, name, attr, size, SEC_COMMIT, 0, access, sd ); +} + +void set_session_mapping( struct mapping *mapping ) +{ + int unix_fd = get_unix_fd( mapping->fd ); + mem_size_t size = mapping->size; + struct session_block *block; + void *tmp; + + if (!(block = mem_alloc( sizeof(*block) ))) return; + if ((tmp = mmap( NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, unix_fd, 0 )) == MAP_FAILED) + { + free( block ); + return; + } + + block->data = tmp; + session_mapping = mapping; + list_add_tail( &session.blocks, &block->entry ); +} + struct object *create_user_data_mapping( struct object *root, const struct unicode_str *name, unsigned int attr, const struct security_descriptor *sd ) { diff --git a/server/object.c b/server/object.c index 459ead5f3a5..3b72b576d50 100644 --- a/server/object.c +++ b/server/object.c @@ -102,8 +102,19 @@ void close_objects(void) /*****************************************************************/ +/* mark a block of memory as not accessible for debugging purposes */ +void mark_block_noaccess( void *ptr, size_t size ) +{ + memset( ptr, 0xfe, size ); +#if defined(VALGRIND_MAKE_MEM_NOACCESS) + VALGRIND_DISCARD( VALGRIND_MAKE_MEM_NOACCESS( ptr, size ) ); +#elif defined(VALGRIND_MAKE_NOACCESS) + VALGRIND_DISCARD( VALGRIND_MAKE_NOACCESS( ptr, size ) ); +#endif +} + /* mark a block of memory as uninitialized for debugging purposes */ -static inline void mark_block_uninitialized( void *ptr, size_t size ) +void mark_block_uninitialized( void *ptr, size_t size ) { memset( ptr, 0x55, size ); #if defined(VALGRIND_MAKE_MEM_UNDEFINED) diff --git a/server/object.h b/server/object.h index d4d66536b81..2337ee88231 100644 --- a/server/object.h +++ b/server/object.h @@ -139,6 +139,8 @@ struct wait_queue_entry struct thread_wait *wait; }; +extern void mark_block_noaccess( void *ptr, size_t size ); +extern void mark_block_uninitialized( void *ptr, size_t size ); extern void *mem_alloc( size_t size ) __WINE_ALLOC_SIZE(1) __WINE_DEALLOC(free) __WINE_MALLOC; extern void *memdup( const void *data, size_t len ) __WINE_ALLOC_SIZE(2) __WINE_DEALLOC(free); extern void *alloc_object( const struct object_ops *ops ); diff --git a/server/protocol.def b/server/protocol.def index 766674d3e30..aad95db1195 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -45,6 +45,7 @@ typedef unsigned __int64 mem_size_t; typedef unsigned __int64 file_pos_t; typedef unsigned __int64 client_ptr_t; typedef unsigned __int64 affinity_t; +typedef unsigned __int64 object_id_t; typedef client_ptr_t mod_handle_t; struct request_header @@ -895,6 +896,21 @@ struct directory_entry /* VARARG(type,unicode_str,type_len); */ }; +/****************************************************************/ +/* shared session mapping structures */ + +typedef volatile union +{ + char placeholder; +} object_shm_t; + +typedef volatile struct +{ + LONG64 seq; /* sequence number - server updating if (seq & 1) != 0 */ + object_id_t id; /* object unique id, object data is valid if != 0 */ + object_shm_t shm; /* object shared data */ +} shared_object_t; + /****************************************************************/ /* Request declarations */ diff --git a/server/request.h b/server/request.h index 67de9bb1779..fe323d4785a 100644 --- a/server/request.h +++ b/server/request.h @@ -721,6 +721,7 @@ C_ASSERT( sizeof(mem_size_t) == 8 ); C_ASSERT( sizeof(message_data_t) == 48 ); C_ASSERT( sizeof(mod_handle_t) == 8 ); C_ASSERT( sizeof(obj_handle_t) == 4 ); +C_ASSERT( sizeof(object_id_t) == 8 ); C_ASSERT( sizeof(pe_image_info_t) == 88 ); C_ASSERT( sizeof(process_id_t) == 4 ); C_ASSERT( sizeof(property_data_t) == 16 ); diff --git a/tools/make_requests b/tools/make_requests index 419b1264ea4..b20b53096ca 100755 --- a/tools/make_requests +++ b/tools/make_requests @@ -42,6 +42,7 @@ my %formats = "file_pos_t" => [ 8, 8, "&dump_uint64" ], "mem_size_t" => [ 8, 8, "&dump_uint64" ], "affinity_t" => [ 8, 8, "&dump_uint64" ], + "object_id_t" => [ 8, 8, "&dump_uint64" ], "timeout_t" => [ 8, 8, "&dump_timeout" ], "abstime_t" => [ 8, 8, "&dump_abstime" ], "rectangle_t" => [ 16, 4, "&dump_rectangle" ],
1
0
0
0
Eric Pouech : cmd: Test input has been read before using it.
by Alexandre Julliard
20 Jun '24
20 Jun '24
Module: wine Branch: master Commit: 96d682e5f7b0c68b645beec9daf5d4eabac9353e URL:
https://gitlab.winehq.org/wine/wine/-/commit/96d682e5f7b0c68b645beec9daf5d4…
Author: Eric Pouech <epouech(a)codeweavers.com> Date: Tue Jun 4 12:15:17 2024 +0200 cmd: Test input has been read before using it. This let confirmations fail when reading from NUL (instead of looping forever). Signed-off-by: Eric Pouech <epouech(a)codeweavers.com> --- programs/cmd/builtins.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index d911f851976..04c879bc18b 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -228,7 +228,7 @@ static BOOL WCMD_ask_confirm (const WCHAR *message, BOOL showSureText, if (showSureText) WCMD_output_asis (confirm); WCMD_output_asis (options); - if (!WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), answer, ARRAY_SIZE(answer), &count)) + if (!WCMD_ReadFile(GetStdHandle(STD_INPUT_HANDLE), answer, ARRAY_SIZE(answer), &count) || !count) return FALSE; answer[0] = towupper(answer[0]); if (answer[0] == Ybuffer[0])
1
0
0
0
Eric Pouech : cmd: Remove old FOR loop related code.
by Alexandre Julliard
20 Jun '24
20 Jun '24
Module: wine Branch: master Commit: 96762f12e7590419a90d43daf3b9659aa8e8f2fe URL:
https://gitlab.winehq.org/wine/wine/-/commit/96762f12e7590419a90d43daf3b965…
Author: Eric Pouech <epouech(a)codeweavers.com> Date: Fri Jun 14 18:02:24 2024 +0200 cmd: Remove old FOR loop related code. Signed-off-by: Eric Pouech <epouech(a)codeweavers.com> --- programs/cmd/builtins.c | 683 +----------------------------------------------- programs/cmd/wcmdmain.c | 1 + 2 files changed, 2 insertions(+), 682 deletions(-)
1
0
0
0
Eric Pouech : cmd: Fix delayed expansion in FOR loop on file sets.
by Alexandre Julliard
20 Jun '24
20 Jun '24
Module: wine Branch: master Commit: f98077591f7d18f60c4ec6685027b987c75c1724 URL:
https://gitlab.winehq.org/wine/wine/-/commit/f98077591f7d18f60c4ec6685027b9…
Author: Eric Pouech <epouech(a)codeweavers.com> Date: Tue Jun 18 10:11:13 2024 +0200 cmd: Fix delayed expansion in FOR loop on file sets. Signed-off-by: Eric Pouech <epouech(a)codeweavers.com> --- programs/cmd/tests/test_builtins.cmd.exp | 4 ++-- programs/cmd/wcmdmain.c | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/programs/cmd/tests/test_builtins.cmd.exp b/programs/cmd/tests/test_builtins.cmd.exp index 84637ce41e3..1564e6c4611 100644 --- a/programs/cmd/tests/test_builtins.cmd.exp +++ b/programs/cmd/tests/test_builtins.cmd.exp @@ -610,8 +610,8 @@ N '' '.eh'@or_broken@'' "foo bar" -@todo_wine@foo -@todo_wine@bar +foo +bar --- in digit variables a %1 %2 b %1 %2 diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index ec71e760348..f2030d7e985 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -3255,6 +3255,7 @@ static CMD_NODE *for_control_execute_set(CMD_FOR_CONTROL *for_ctrl, const WCHAR len = 0; wcscpy(set, for_ctrl->set); + handleExpansion(set, context != NULL, delayedsubst); for (i = 0; ; i++) { WCHAR *element = WCMD_parameter(set, i, NULL, TRUE, FALSE); @@ -3314,7 +3315,11 @@ static CMD_NODE *for_control_execute_walk_files(CMD_FOR_CONTROL *for_ctrl, CMD_N if (for_ctrl->root_dir) { - dirs_to_walk = WCMD_dir_stack_create(for_ctrl->root_dir, NULL); + WCHAR buffer[MAXSTRING]; + + wcscpy(buffer, for_ctrl->root_dir); + handleExpansion(buffer, context != NULL, delayedsubst); + dirs_to_walk = WCMD_dir_stack_create(buffer, NULL); } else dirs_to_walk = WCMD_dir_stack_create(NULL, NULL); ref_len = wcslen(dirs_to_walk->dirName);
1
0
0
0
Eric Pouech : cmd: Split parsing from executing FOR loops for file walking.
by Alexandre Julliard
20 Jun '24
20 Jun '24
Module: wine Branch: master Commit: 0ca28d3a70dd17eccc5d9868789fd1c5bf7e2394 URL:
https://gitlab.winehq.org/wine/wine/-/commit/0ca28d3a70dd17eccc5d9868789fd1…
Author: Eric Pouech <epouech(a)codeweavers.com> Date: Fri Jun 14 17:39:40 2024 +0200 cmd: Split parsing from executing FOR loops for file walking. Signed-off-by: Eric Pouech <epouech(a)codeweavers.com> --- programs/cmd/builtins.c | 6 +-- programs/cmd/wcmd.h | 12 ++++- programs/cmd/wcmdmain.c | 141 ++++++++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 151 insertions(+), 8 deletions(-) diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index 86248231363..82ba8088b02 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -153,7 +153,7 @@ static struct {' ',' '} }; -static DIRECTORY_STACK *WCMD_dir_stack_create(const WCHAR *dir, const WCHAR *file) +DIRECTORY_STACK *WCMD_dir_stack_create(const WCHAR *dir, const WCHAR *file) { DIRECTORY_STACK *new = xalloc(sizeof(DIRECTORY_STACK)); @@ -177,7 +177,7 @@ static DIRECTORY_STACK *WCMD_dir_stack_create(const WCHAR *dir, const WCHAR *fil return new; } -static DIRECTORY_STACK *WCMD_dir_stack_free(DIRECTORY_STACK *dir) +DIRECTORY_STACK *WCMD_dir_stack_free(DIRECTORY_STACK *dir) { DIRECTORY_STACK *next; @@ -1790,7 +1790,7 @@ static BOOL WCMD_parse_forf_options(WCHAR *options, WCHAR *eol, int *skip, * processed, and any other directory still to be processed, mimicking what * Windows does */ -static void WCMD_add_dirstowalk(DIRECTORY_STACK *dirsToWalk) +void WCMD_add_dirstowalk(DIRECTORY_STACK *dirsToWalk) { DIRECTORY_STACK *remainingDirs = dirsToWalk; WCHAR fullitem[MAX_PATH]; diff --git a/programs/cmd/wcmd.h b/programs/cmd/wcmd.h index c1a95c6223c..fd2b541c830 100644 --- a/programs/cmd/wcmd.h +++ b/programs/cmd/wcmd.h @@ -83,16 +83,20 @@ typedef struct _CMD_IF_CONDITION }; } CMD_IF_CONDITION; +#define CMD_FOR_FLAG_TREE_RECURSE (1u << 0) +#define CMD_FOR_FLAG_TREE_INCLUDE_FILES (1u << 1) +#define CMD_FOR_FLAG_TREE_INCLUDE_DIRECTORIES (1u << 2) + typedef struct _CMD_FOR_CONTROL { - enum for_control_operator { - CMD_FOR_FILE_SET /* /F */, + enum for_control_operator {CMD_FOR_FILETREE, CMD_FOR_FILE_SET /* /F */, CMD_FOR_NUMBERS /* /L */} operator; unsigned flags; /* |-ed CMD_FOR_FLAG_* */ int variable_index; const WCHAR *set; union { + const WCHAR *root_dir; /* for CMD_FOR_FILETREE */ struct /* for CMD_FOR_FILE_SET */ { WCHAR eol; @@ -164,6 +168,10 @@ int WCMD_for_nexttoken(int lasttoken, const WCHAR *tokenstr, BOOL *duplicates); void WCMD_part_execute(CMD_NODE **cmdList, const WCHAR *firstcmd, BOOL isIF, BOOL executecmds); +struct _DIRECTORY_STACK; +void WCMD_add_dirstowalk(struct _DIRECTORY_STACK *dirsToWalk); +struct _DIRECTORY_STACK *WCMD_dir_stack_create(const WCHAR *dir, const WCHAR *file); +struct _DIRECTORY_STACK *WCMD_dir_stack_free(struct _DIRECTORY_STACK *dir); void WCMD_assoc (const WCHAR *, BOOL); void WCMD_batch (WCHAR *, WCHAR *, BOOL, WCHAR *, HANDLE); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 9bce77b19df..ec71e760348 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1000,6 +1000,9 @@ void for_control_dispose(CMD_FOR_CONTROL *for_ctrl) free((void*)for_ctrl->delims); free((void*)for_ctrl->tokens); break; + case CMD_FOR_FILETREE: + free((void*)for_ctrl->root_dir); + break; default: break; } @@ -1007,7 +1010,7 @@ void for_control_dispose(CMD_FOR_CONTROL *for_ctrl) const char *debugstr_for_control(const CMD_FOR_CONTROL *for_ctrl) { - static const char* for_ctrl_strings[] = {"file", "numbers"}; + static const char* for_ctrl_strings[] = {"tree", "file", "numbers"}; const char *flags, *options; if (for_ctrl->operator >= ARRAY_SIZE(for_ctrl_strings)) @@ -1016,9 +1019,18 @@ const char *debugstr_for_control(const CMD_FOR_CONTROL *for_ctrl) return wine_dbg_sprintf("<<%u>>", for_ctrl->operator); } - flags = ""; + if (for_ctrl->flags) + flags = wine_dbg_sprintf("flags=%s%s%s ", + (for_ctrl->flags & CMD_FOR_FLAG_TREE_RECURSE) ? "~recurse" : "", + (for_ctrl->flags & CMD_FOR_FLAG_TREE_INCLUDE_FILES) ? "~+files" : "", + (for_ctrl->flags & CMD_FOR_FLAG_TREE_INCLUDE_DIRECTORIES) ? "~+dirs" : ""); + else + flags = ""; switch (for_ctrl->operator) { + case CMD_FOR_FILETREE: + options = wine_dbg_sprintf("root=(%ls) ", for_ctrl->root_dir); + break; case CMD_FOR_FILE_SET: { WCHAR eol_buf[4] = {L'\'', for_ctrl->eol, L'\'', L'\0'}; @@ -1045,6 +1057,9 @@ void for_control_create(enum for_control_operator for_op, unsigned flags, const for_ctrl->set = NULL; switch (for_ctrl->operator) { + case CMD_FOR_FILETREE: + for_ctrl->root_dir = options && *options ? xstrdupW(options) : NULL; + break; default: break; } @@ -2239,6 +2254,22 @@ CMD_FOR_CONTROL *for_control_parse(WCHAR *opts_var) } switch (mode) { + case L' ': + for_op = CMD_FOR_FILETREE; + flags = CMD_FOR_FLAG_TREE_INCLUDE_FILES; + break; + case L'D': + for_op = CMD_FOR_FILETREE; + flags = CMD_FOR_FLAG_TREE_INCLUDE_DIRECTORIES; + break; + case L'X': + for_op = CMD_FOR_FILETREE; + flags = CMD_FOR_FLAG_TREE_INCLUDE_DIRECTORIES | CMD_FOR_FLAG_TREE_RECURSE; + break; + case L'R': + for_op = CMD_FOR_FILETREE; + flags = CMD_FOR_FLAG_TREE_INCLUDE_FILES | /*CMD_FOR_FLAG_TREE_INCLUDE_DIRECTORIES | */CMD_FOR_FLAG_TREE_RECURSE; + break; case L'L': for_op = CMD_FOR_NUMBERS; break; @@ -2249,7 +2280,7 @@ CMD_FOR_CONTROL *for_control_parse(WCHAR *opts_var) return NULL; } - if (mode == L'F') + if (mode == L'F' || mode == L'R') { /* Retrieve next parameter to see if is root/options (raw form required * with for /f, or unquoted in for /r) @@ -3205,6 +3236,104 @@ static CMD_NODE *for_control_execute_fileset(CMD_FOR_CONTROL *for_ctrl, CMD_NODE return body; } +static CMD_NODE *for_control_execute_set(CMD_FOR_CONTROL *for_ctrl, const WCHAR *from_dir, size_t ref_len, CMD_NODE *cmdList) +{ + CMD_NODE *body = NULL; + size_t len; + WCHAR set[MAXSTRING]; + WCHAR buffer[MAX_PATH]; + int i; + + if (from_dir) + { + len = wcslen(from_dir) + 1; + if (len >= ARRAY_SIZE(buffer)) return NULL; + wcscpy(buffer, from_dir); + wcscat(buffer, L"\\"); + } + else + len = 0; + + wcscpy(set, for_ctrl->set); + for (i = 0; ; i++) + { + WCHAR *element = WCMD_parameter(set, i, NULL, TRUE, FALSE); + if (!element || !*element) break; + if (len + wcslen(element) + 1 >= ARRAY_SIZE(buffer)) continue; + + wcscpy(&buffer[len], element); + + TRACE("Doing set element %ls\n", buffer); + + if (wcspbrk(element, L"?*")) + { + WIN32_FIND_DATAW fd; + HANDLE hff = FindFirstFileW(buffer, &fd); + size_t insert_pos = (wcsrchr(buffer, L'\\') ? wcsrchr(buffer, L'\\') + 1 - buffer : 0); + + if (hff == INVALID_HANDLE_VALUE) + { + TRACE("Couldn't FindFirstFile on %ls\n", buffer); + continue; + } + do + { + TRACE("Considering %ls\n", fd.cFileName); + if (!lstrcmpW(fd.cFileName, L"..") || !lstrcmpW(fd.cFileName, L".")) continue; + if (!(for_ctrl->flags & CMD_FOR_FLAG_TREE_INCLUDE_FILES) && + !(fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + continue; + if (!(for_ctrl->flags & CMD_FOR_FLAG_TREE_INCLUDE_DIRECTORIES) && + (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)) + continue; + + if (insert_pos + wcslen(fd.cFileName) + 1 >= ARRAY_SIZE(buffer)) continue; + wcscpy(&buffer[insert_pos], fd.cFileName); + + body = cmdList; + WCMD_set_for_loop_variable(for_ctrl->variable_index, buffer); + WCMD_part_execute(&body, CMD_node_get_command(body)->command + 3, FALSE, TRUE); + } while (FindNextFileW(hff, &fd) != 0); + FindClose(hff); + } + else + { + body = cmdList; + WCMD_set_for_loop_variable(for_ctrl->variable_index, buffer); + WCMD_part_execute(&body, CMD_node_get_command(body)->command + 3, FALSE, TRUE); + } + } + return body; +} + +static CMD_NODE *for_control_execute_walk_files(CMD_FOR_CONTROL *for_ctrl, CMD_NODE *cmdList) +{ + DIRECTORY_STACK *dirs_to_walk; + size_t ref_len; + CMD_NODE *body = NULL; + + if (for_ctrl->root_dir) + { + dirs_to_walk = WCMD_dir_stack_create(for_ctrl->root_dir, NULL); + } + else dirs_to_walk = WCMD_dir_stack_create(NULL, NULL); + ref_len = wcslen(dirs_to_walk->dirName); + + while (dirs_to_walk) + { + TRACE("About to walk %p %ls for %s\n", dirs_to_walk, dirs_to_walk->dirName, debugstr_for_control(for_ctrl)); + if (for_ctrl->flags & CMD_FOR_FLAG_TREE_RECURSE) + WCMD_add_dirstowalk(dirs_to_walk); + + body = for_control_execute_set(for_ctrl, dirs_to_walk->dirName, ref_len, cmdList); + /* If we are walking directories, move on to any which remain */ + dirs_to_walk = WCMD_dir_stack_free(dirs_to_walk); + } + TRACE("Finished all directories.\n"); + + return body; +} + static CMD_NODE *for_control_execute_numbers(CMD_FOR_CONTROL *for_ctrl, CMD_NODE *cmdList) { WCHAR set[MAXSTRING]; @@ -3250,6 +3379,12 @@ void for_control_execute(CMD_FOR_CONTROL *for_ctrl, CMD_NODE **cmdList) switch (for_ctrl->operator) { + case CMD_FOR_FILETREE: + if (for_ctrl->flags & CMD_FOR_FLAG_TREE_RECURSE) + last = for_control_execute_walk_files(for_ctrl, *cmdList); + else + last = for_control_execute_set(for_ctrl, NULL, 0, *cmdList); + break; case CMD_FOR_FILE_SET: last = for_control_execute_fileset(for_ctrl, *cmdList); break;
1
0
0
0
Alexandre Julliard : ntdll: Don't set the TEB ExceptionList to -1 on 64-bit.
by Alexandre Julliard
20 Jun '24
20 Jun '24
Module: wine Branch: master Commit: 6e82d33eb70d88a72eed03c2fc99ff4402a50a54 URL:
https://gitlab.winehq.org/wine/wine/-/commit/6e82d33eb70d88a72eed03c2fc99ff…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Jun 20 16:23:25 2024 +0200 ntdll: Don't set the TEB ExceptionList to -1 on 64-bit. The tests show that it should be zero. --- dlls/ntdll/unix/virtual.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c index 4b23d9954df..3981905bcd3 100644 --- a/dlls/ntdll/unix/virtual.c +++ b/dlls/ntdll/unix/virtual.c @@ -3621,6 +3621,7 @@ static TEB *init_teb( void *ptr, BOOL is_wow ) if (is_wow) teb64->WowTebOffset = teb_offset; #else teb = (TEB *)teb32; + teb32->Tib.ExceptionList = ~0u; teb64->Peb = PtrToUlong( (char *)peb - page_size ); teb64->Tib.Self = PtrToUlong( teb64 ); teb64->Tib.ExceptionList = PtrToUlong( teb32 ); @@ -3639,7 +3640,6 @@ static TEB *init_teb( void *ptr, BOOL is_wow ) #endif teb->Peb = peb; teb->Tib.Self = &teb->Tib; - teb->Tib.ExceptionList = (void *)~0ul; teb->Tib.StackBase = (void *)~0ul; teb->ActivationContextStackPointer = &teb->ActivationContextStack; InitializeListHead( &teb->ActivationContextStack.FrameListCache );
1
0
0
0
Alexandre Julliard : ntdll: Fix the fake 32-bit %cs value on ARM64EC.
by Alexandre Julliard
20 Jun '24
20 Jun '24
Module: wine Branch: master Commit: 0d5936563dae36c8accbf995fbd4632b974c8763 URL:
https://gitlab.winehq.org/wine/wine/-/commit/0d5936563dae36c8accbf995fbd463…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Jun 20 16:17:01 2024 +0200 ntdll: Fix the fake 32-bit %cs value on ARM64EC. --- dlls/ntdll/process.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dlls/ntdll/process.c b/dlls/ntdll/process.c index 102e0c930a9..16bc445b7f9 100644 --- a/dlls/ntdll/process.c +++ b/dlls/ntdll/process.c @@ -249,7 +249,7 @@ NTSTATUS WINAPI RtlWow64GetThreadSelectorEntry( HANDLE handle, THREAD_DESCRIPTOR { /* hardcoded values */ #ifdef __arm64ec__ - context.SegCs = 0x33; + context.SegCs = 0x23; context.SegSs = 0x2b; context.SegFs = 0x53; #elif defined(__x86_64__)
1
0
0
0
Alexandre Julliard : ntdll: Send cross-process notification in memory functions on ARM64EC.
by Alexandre Julliard
20 Jun '24
20 Jun '24
Module: wine Branch: master Commit: b7a3023ca1ec5938b6713dc1b71bc5cbcf0096da URL:
https://gitlab.winehq.org/wine/wine/-/commit/b7a3023ca1ec5938b6713dc1b71bc5…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Thu Jun 20 15:44:58 2024 +0200 ntdll: Send cross-process notification in memory functions on ARM64EC. Copied from the corresponding code in wow64.dll. --- dlls/ntdll/signal_arm64ec.c | 124 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 119 insertions(+), 5 deletions(-) diff --git a/dlls/ntdll/signal_arm64ec.c b/dlls/ntdll/signal_arm64ec.c index 70d9884750d..2e974d389e1 100644 --- a/dlls/ntdll/signal_arm64ec.c +++ b/dlls/ntdll/signal_arm64ec.c @@ -52,6 +52,41 @@ static inline BOOL is_valid_arm64ec_frame( ULONG_PTR frame ) frame <= get_arm64ec_cpu_area()->EmulatorStackBase); } + +/********************************************************************** + * send_cross_process_notification + */ +static BOOL send_cross_process_notification( HANDLE process, UINT id, const void *addr, SIZE_T size, + int nb_args, ... ) +{ + CROSS_PROCESS_WORK_LIST *list; + CROSS_PROCESS_WORK_ENTRY *entry; + void *unused; + HANDLE section; + va_list args; + int i; + + RtlOpenCrossProcessEmulatorWorkConnection( process, §ion, (void **)&list ); + if (!list) return FALSE; + if ((entry = RtlWow64PopCrossProcessWorkFromFreeList( &list->free_list ))) + { + entry->id = id; + entry->addr = (ULONG_PTR)addr; + entry->size = size; + if (nb_args) + { + va_start( args, nb_args ); + for (i = 0; i < nb_args; i++) entry->args[i] = va_arg( args, int ); + va_end( args ); + } + RtlWow64PushCrossProcessWorkOntoWorkList( &list->work_list, entry, &unused ); + } + NtUnmapViewOfSection( GetCurrentProcess(), list ); + NtClose( section ); + return TRUE; +} + + /******************************************************************* * syscalls */ @@ -84,8 +119,8 @@ DEFINE_SYSCALL(NtAlertThread, (HANDLE handle)) DEFINE_SYSCALL(NtAlertThreadByThreadId, (HANDLE tid)) DEFINE_SYSCALL(NtAllocateLocallyUniqueId, (LUID *luid)) DEFINE_SYSCALL(NtAllocateUuids, (ULARGE_INTEGER *time, ULONG *delta, ULONG *sequence, UCHAR *seed)) -DEFINE_SYSCALL(NtAllocateVirtualMemory, (HANDLE process, PVOID *ret, ULONG_PTR zero_bits, SIZE_T *size_ptr, ULONG type, ULONG protect)) -DEFINE_SYSCALL(NtAllocateVirtualMemoryEx, (HANDLE process, PVOID *ret, SIZE_T *size_ptr, ULONG type, ULONG protect, MEM_EXTENDED_PARAMETER *parameters, ULONG count)) +DEFINE_WRAPPED_SYSCALL(NtAllocateVirtualMemory, (HANDLE process, PVOID *ret, ULONG_PTR zero_bits, SIZE_T *size_ptr, ULONG type, ULONG protect)) +DEFINE_WRAPPED_SYSCALL(NtAllocateVirtualMemoryEx, (HANDLE process, PVOID *ret, SIZE_T *size_ptr, ULONG type, ULONG protect, MEM_EXTENDED_PARAMETER *parameters, ULONG count)) DEFINE_SYSCALL(NtAreMappedFilesTheSame, (PVOID addr1, PVOID addr2)) DEFINE_SYSCALL(NtAssignProcessToJobObject, (HANDLE job, HANDLE process)) DEFINE_SYSCALL(NtCallbackReturn, (void *ret_ptr, ULONG ret_len, NTSTATUS status)) @@ -141,11 +176,11 @@ DEFINE_SYSCALL(NtEnumerateValueKey, (HANDLE handle, ULONG index, KEY_VALUE_INFOR DEFINE_SYSCALL(NtFilterToken, (HANDLE token, ULONG flags, TOKEN_GROUPS *disable_sids, TOKEN_PRIVILEGES *privileges, TOKEN_GROUPS *restrict_sids, HANDLE *new_token)) DEFINE_SYSCALL(NtFindAtom, (const WCHAR *name, ULONG length, RTL_ATOM *atom)) DEFINE_SYSCALL(NtFlushBuffersFile, (HANDLE handle, IO_STATUS_BLOCK *io)) -DEFINE_SYSCALL(NtFlushInstructionCache, (HANDLE handle, const void *addr, SIZE_T size)) +DEFINE_WRAPPED_SYSCALL(NtFlushInstructionCache, (HANDLE handle, const void *addr, SIZE_T size)) DEFINE_SYSCALL(NtFlushKey, (HANDLE key)) DEFINE_SYSCALL(NtFlushProcessWriteBuffers, (void)) DEFINE_SYSCALL(NtFlushVirtualMemory, (HANDLE process, LPCVOID *addr_ptr, SIZE_T *size_ptr, ULONG unknown)) -DEFINE_SYSCALL(NtFreeVirtualMemory, (HANDLE process, PVOID *addr_ptr, SIZE_T *size_ptr, ULONG type)) +DEFINE_WRAPPED_SYSCALL(NtFreeVirtualMemory, (HANDLE process, PVOID *addr_ptr, SIZE_T *size_ptr, ULONG type)) DEFINE_SYSCALL(NtFsControlFile, (HANDLE handle, HANDLE event, PIO_APC_ROUTINE apc, void *apc_context, IO_STATUS_BLOCK *io, ULONG code, void *in_buffer, ULONG in_size, void *out_buffer, ULONG out_size)) DEFINE_WRAPPED_SYSCALL(NtGetContextThread, (HANDLE handle, ARM64_NT_CONTEXT *context)) DEFINE_SYSCALL_(ULONG, NtGetCurrentProcessorNumber, (void)) @@ -193,7 +228,7 @@ DEFINE_SYSCALL(NtOpenThreadTokenEx, (HANDLE thread, DWORD access, BOOLEAN self, DEFINE_SYSCALL(NtOpenTimer, (HANDLE *handle, ACCESS_MASK access, const OBJECT_ATTRIBUTES *attr)) DEFINE_SYSCALL(NtPowerInformation, (POWER_INFORMATION_LEVEL level, void *input, ULONG in_size, void *output, ULONG out_size)) DEFINE_SYSCALL(NtPrivilegeCheck, (HANDLE token, PRIVILEGE_SET *privs, BOOLEAN *res)) -DEFINE_SYSCALL(NtProtectVirtualMemory, (HANDLE process, PVOID *addr_ptr, SIZE_T *size_ptr, ULONG new_prot, ULONG *old_prot)) +DEFINE_WRAPPED_SYSCALL(NtProtectVirtualMemory, (HANDLE process, PVOID *addr_ptr, SIZE_T *size_ptr, ULONG new_prot, ULONG *old_prot)) DEFINE_SYSCALL(NtPulseEvent, (HANDLE handle, LONG *prev_state)) DEFINE_SYSCALL(NtQueryAttributesFile, (const OBJECT_ATTRIBUTES *attr, FILE_BASIC_INFORMATION *info)) DEFINE_SYSCALL(NtQueryDefaultLocale, (BOOLEAN user, LCID *lcid)) @@ -311,6 +346,42 @@ DEFINE_SYSCALL(NtYieldExecution, (void)) DEFINE_SYSCALL(wine_nt_to_unix_file_name, (const OBJECT_ATTRIBUTES *attr, char *nameA, ULONG *size, UINT disposition)) DEFINE_SYSCALL(wine_unix_to_nt_file_name, (const char *name, WCHAR *buffer, ULONG *size)) +NTSTATUS SYSCALL_API NtAllocateVirtualMemory( HANDLE process, PVOID *ret, ULONG_PTR zero_bits, + SIZE_T *size_ptr, ULONG type, ULONG protect ) +{ + BOOL is_current = RtlIsCurrentProcess( process ); + NTSTATUS status; + + if (!*ret && (type & MEM_COMMIT)) type |= MEM_RESERVE; + + if (!is_current) send_cross_process_notification( process, CrossProcessPreVirtualAlloc, + *ret, *size_ptr, 3, type, protect, 0 ); + + status = syscall_NtAllocateVirtualMemory( process, ret, zero_bits, size_ptr, type, protect ); + + if (!is_current) send_cross_process_notification( process, CrossProcessPostVirtualAlloc, + *ret, *size_ptr, 3, type, protect, status ); + return status; +} + +NTSTATUS SYSCALL_API NtAllocateVirtualMemoryEx( HANDLE process, PVOID *ret, SIZE_T *size_ptr, ULONG type, + ULONG protect, MEM_EXTENDED_PARAMETER *parameters, ULONG count ) +{ + BOOL is_current = RtlIsCurrentProcess( process ); + NTSTATUS status; + + if (!*ret && (type & MEM_COMMIT)) type |= MEM_RESERVE; + + if (!is_current) send_cross_process_notification( process, CrossProcessPreVirtualAlloc, + *ret, *size_ptr, 3, type, protect, 0 ); + + status = syscall_NtAllocateVirtualMemoryEx( process, ret, size_ptr, type, protect, parameters, count ); + + if (!is_current) send_cross_process_notification( process, CrossProcessPostVirtualAlloc, + *ret, *size_ptr, 3, type, protect, status ); + return status; +} + NTSTATUS SYSCALL_API NtContinue( CONTEXT *context, BOOLEAN alertable ) { ARM64_NT_CONTEXT arm_ctx; @@ -319,6 +390,33 @@ NTSTATUS SYSCALL_API NtContinue( CONTEXT *context, BOOLEAN alertable ) return syscall_NtContinue( &arm_ctx, alertable ); } +NTSTATUS SYSCALL_API NtFlushInstructionCache( HANDLE process, const void *addr, SIZE_T size ) +{ + NTSTATUS status = syscall_NtFlushInstructionCache( process, addr, size ); + + if (!status) + { + if (!RtlIsCurrentProcess( process )) + send_cross_process_notification( process, CrossProcessFlushCache, addr, size, 0 ); + } + return status; +} + +NTSTATUS SYSCALL_API NtFreeVirtualMemory( HANDLE process, PVOID *addr_ptr, SIZE_T *size_ptr, ULONG type ) +{ + BOOL is_current = RtlIsCurrentProcess( process ); + NTSTATUS status; + + if (!is_current) send_cross_process_notification( process, CrossProcessPreVirtualFree, + *addr_ptr, *size_ptr, 2, type, 0 ); + + status = syscall_NtFreeVirtualMemory( process, addr_ptr, size_ptr, type ); + + if (!is_current) send_cross_process_notification( process, CrossProcessPostVirtualFree, + *addr_ptr, *size_ptr, 2, type, status ); + return status; +} + NTSTATUS SYSCALL_API NtGetContextThread( HANDLE handle, CONTEXT *context ) { ARM64_NT_CONTEXT arm_ctx = { .ContextFlags = ctx_flags_x64_to_arm( context->ContextFlags ) }; @@ -328,6 +426,22 @@ NTSTATUS SYSCALL_API NtGetContextThread( HANDLE handle, CONTEXT *context ) return status; } +NTSTATUS SYSCALL_API NtProtectVirtualMemory( HANDLE process, PVOID *addr_ptr, SIZE_T *size_ptr, + ULONG new_prot, ULONG *old_prot ) +{ + BOOL is_current = RtlIsCurrentProcess( process ); + NTSTATUS status; + + if (!is_current) send_cross_process_notification( process, CrossProcessPreVirtualProtect, + *addr_ptr, *size_ptr, 2, new_prot, 0 ); + + status = syscall_NtProtectVirtualMemory( process, addr_ptr, size_ptr, new_prot, old_prot ); + + if (!is_current) send_cross_process_notification( process, CrossProcessPostVirtualProtect, + *addr_ptr, *size_ptr, 2, new_prot, status ); + return status; +} + NTSTATUS SYSCALL_API NtRaiseException( EXCEPTION_RECORD *rec, CONTEXT *context, BOOL first_chance ) { ARM64_NT_CONTEXT arm_ctx;
1
0
0
0
← Newer
1
...
21
22
23
24
25
26
27
...
62
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
Results per page:
10
25
50
100
200