diff --git a/patches/advapi32-Token_Integrity_Level/0008-ntdll-Implement-process-token-elevation-through-mani.patch b/patches/advapi32-Token_Integrity_Level/0008-ntdll-Implement-process-token-elevation-through-mani.patch index 46b14649..98f49809 100644 --- a/patches/advapi32-Token_Integrity_Level/0008-ntdll-Implement-process-token-elevation-through-mani.patch +++ b/patches/advapi32-Token_Integrity_Level/0008-ntdll-Implement-process-token-elevation-through-mani.patch @@ -1,4 +1,4 @@ -From 1f2b1bafabfd457836f18741f178b3745e129c36 Mon Sep 17 00:00:00 2001 +From b7e3ca4678d073c92f950708c1be35f37fda86d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=BCller?= Date: Sat, 5 Aug 2017 03:39:55 +0200 Subject: [PATCH] ntdll: Implement process token elevation through manifests. @@ -12,10 +12,10 @@ Subject: [PATCH] ntdll: Implement process token elevation through manifests. 5 files changed, 67 insertions(+) diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c -index 0c8f05285c4..92ae87c6e6d 100644 +index 3513102b6f0..3b68f6685d0 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c -@@ -3898,6 +3898,32 @@ void WINAPI LdrInitializeThunk( CONTEXT *context, void **entry, ULONG_PTR unknow +@@ -3489,6 +3489,32 @@ void WINAPI LdrInitializeThunk( CONTEXT *context, void **entry, ULONG_PTR unknow } @@ -48,7 +48,7 @@ index 0c8f05285c4..92ae87c6e6d 100644 /*********************************************************************** * load_global_options */ -@@ -4359,6 +4385,7 @@ void __wine_process_init(void) +@@ -3922,6 +3948,7 @@ void __wine_process_init(void) 'k','e','r','n','e','l','3','2','.','d','l','l',0}; void (WINAPI *kernel32_start_process)(LPTHREAD_START_ROUTINE,void*) = NULL; RTL_USER_PROCESS_PARAMETERS *params; @@ -56,7 +56,7 @@ index 0c8f05285c4..92ae87c6e6d 100644 WINE_MODREF *wm; NTSTATUS status; ANSI_STRING func_name; -@@ -4453,6 +4480,16 @@ void __wine_process_init(void) +@@ -4032,6 +4059,16 @@ void __wine_process_init(void) unix_funcs->virtual_set_large_address_space(); @@ -74,11 +74,11 @@ index 0c8f05285c4..92ae87c6e6d 100644 RemoveEntryList( &wm->ldr.InLoadOrderLinks ); InsertHeadList( &peb->LdrData->InLoadOrderModuleList, &wm->ldr.InLoadOrderLinks ); diff --git a/server/process.c b/server/process.c -index ac85cace95d..52604ec4d61 100644 +index c414717a8d7..100cb424623 100644 --- a/server/process.c +++ b/server/process.c -@@ -1115,6 +1115,14 @@ struct process_snapshot *process_snap( int *count ) - return snapshot; +@@ -1086,6 +1086,14 @@ int set_process_debug_flag( struct process *process, int flag ) + return write_process_memory( process, process->peb + 2, 1, &data ); } +/* replace the token of a process */ @@ -93,22 +93,22 @@ index ac85cace95d..52604ec4d61 100644 DECL_HANDLER(new_process) { diff --git a/server/process.h b/server/process.h -index 5b83e111a6f..dfe5c4e52d8 100644 +index fb29f21cb12..d0b7ec4987b 100644 --- a/server/process.h +++ b/server/process.h -@@ -139,6 +139,7 @@ extern void kill_debugged_processes( struct thread *debugger, int exit_code ); +@@ -129,6 +129,7 @@ extern void kill_console_processes( struct thread *renderer, int exit_code ); + extern void kill_debugged_processes( struct thread *debugger, int exit_code ); extern void detach_debugged_processes( struct thread *debugger ); - extern struct process_snapshot *process_snap( int *count ); extern void enum_processes( int (*cb)(struct process*, void*), void *user); +extern void replace_process_token( struct process *process, struct token *token ); /* console functions */ extern void inherit_console( struct thread *parent_thread, struct process *parent, diff --git a/server/protocol.def b/server/protocol.def -index 7315f8ac4ea..901c380b721 100644 +index bc0d0723eb3..ec67ce7ab87 100644 --- a/server/protocol.def +++ b/server/protocol.def -@@ -3763,6 +3763,13 @@ struct handle_info +@@ -3737,6 +3737,13 @@ struct handle_info @END @@ -145,5 +145,5 @@ index 970ed1838da..1c1d49989b3 100644 + } +} -- -2.26.2 +2.27.0 diff --git a/patches/kernel32-K32GetPerformanceInfo/0001-kernel32-Make-K32GetPerformanceInfo-faster.patch b/patches/kernel32-K32GetPerformanceInfo/0001-kernel32-Make-K32GetPerformanceInfo-faster.patch index 6d992a41..eb6fd764 100644 --- a/patches/kernel32-K32GetPerformanceInfo/0001-kernel32-Make-K32GetPerformanceInfo-faster.patch +++ b/patches/kernel32-K32GetPerformanceInfo/0001-kernel32-Make-K32GetPerformanceInfo-faster.patch @@ -1,4 +1,4 @@ -From 223addb60e053484eaa77df434898419683e926b Mon Sep 17 00:00:00 2001 +From 659da72b956f4c59bc940736609fe8d52ec2d909 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=BCller?= Date: Sun, 19 Feb 2017 05:38:40 +0100 Subject: [PATCH] kernel32: Make K32GetPerformanceInfo faster. @@ -10,7 +10,7 @@ Subject: [PATCH] kernel32: Make K32GetPerformanceInfo faster. 3 files changed, 41 insertions(+), 29 deletions(-) diff --git a/dlls/kernelbase/debug.c b/dlls/kernelbase/debug.c -index 6acdf0f1ea95..8f021ebb0d21 100644 +index 6acdf0f1ea9..8f021ebb0d2 100644 --- a/dlls/kernelbase/debug.c +++ b/dlls/kernelbase/debug.c @@ -1449,7 +1449,6 @@ BOOL WINAPI DECLSPEC_HOTPATCH K32GetPerformanceInfo( PPERFORMANCE_INFORMATION in @@ -85,14 +85,13 @@ index 6acdf0f1ea95..8f021ebb0d21 100644 diff --git a/server/process.c b/server/process.c -index 3156e1bc82a5..da5c55e5368a 100644 +index 9482da98be5..9b7f10fffe5 100644 --- a/server/process.c +++ b/server/process.c -@@ -1830,3 +1830,21 @@ DECL_HANDLER(resume_process) - release_object( process ); +@@ -1791,6 +1791,24 @@ DECL_HANDLER(resume_process) } } -+ + +/* Retrieve process, thread and handle count */ +DECL_HANDLER(get_system_info) +{ @@ -110,11 +109,15 @@ index 3156e1bc82a5..da5c55e5368a 100644 + reply->handles += get_handle_table_count( process ); + } +} ++ + /* Get a list of processes and threads currently running */ + DECL_HANDLER(list_processes) + { diff --git a/server/protocol.def b/server/protocol.def -index ef10b5e1438c..ca34c9dc1b4b 100644 +index bad8fef7903..cee75eff66d 100644 --- a/server/protocol.def +++ b/server/protocol.def -@@ -3992,3 +3992,11 @@ struct handle_info +@@ -3945,3 +3945,11 @@ struct handle_info @REQ(resume_process) obj_handle_t handle; /* process handle */ @END @@ -127,5 +130,5 @@ index ef10b5e1438c..ca34c9dc1b4b 100644 + unsigned int handles; /* number of handles */ +@END -- -2.26.2 +2.27.0 diff --git a/patches/ntdll-Hide_Wine_Exports/definition b/patches/ntdll-Hide_Wine_Exports/definition index 52e3041b..3bd69ea0 100644 --- a/patches/ntdll-Hide_Wine_Exports/definition +++ b/patches/ntdll-Hide_Wine_Exports/definition @@ -1,3 +1,2 @@ Fixes: [38656] Add support for hiding wine version information from applications -Depends: ntdll-ThreadTime Depends: advapi32-Token_Integrity_Level diff --git a/patches/ntdll-Junction_Points/0001-ntdll-Add-support-for-junction-point-creation.patch b/patches/ntdll-Junction_Points/0001-ntdll-Add-support-for-junction-point-creation.patch index c754a108..97ec03a3 100644 --- a/patches/ntdll-Junction_Points/0001-ntdll-Add-support-for-junction-point-creation.patch +++ b/patches/ntdll-Junction_Points/0001-ntdll-Add-support-for-junction-point-creation.patch @@ -1,4 +1,4 @@ -From f886d8af24ba52e791535c7a606c4ca97cc5ed8e Mon Sep 17 00:00:00 2001 +From e043e7d570fcdc0f7bc662d794d111baaa15b015 Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Thu, 16 Jan 2014 20:56:49 -0700 Subject: [PATCH] ntdll: Add support for junction point creation. @@ -18,10 +18,10 @@ Signed-off-by: Erich E. Hoover create mode 100644 libs/port/renameat2.c diff --git a/configure.ac b/configure.ac -index 9c5f76669df..201ae3c2d98 100644 +index a403c9436ca..dbd07791de7 100644 --- a/configure.ac +++ b/configure.ac -@@ -2203,6 +2203,8 @@ AC_CHECK_FUNCS(\ +@@ -2218,6 +2218,8 @@ AC_CHECK_FUNCS(\ pwrite \ readdir \ readlink \ @@ -31,7 +31,7 @@ index 9c5f76669df..201ae3c2d98 100644 select \ setproctitle \ diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c -index 184b7cdad59..8b5ddbb0da1 100644 +index a502a8eec75..bce34f03920 100644 --- a/dlls/ntdll/tests/file.c +++ b/dlls/ntdll/tests/file.c @@ -38,6 +38,7 @@ @@ -155,7 +155,7 @@ index 184b7cdad59..8b5ddbb0da1 100644 + test_reparse_points(); } diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c -index ca6899b50f5..44cb12f90ee 100644 +index b76d07a8175..271151ed1be 100644 --- a/dlls/ntdll/unix/file.c +++ b/dlls/ntdll/unix/file.c @@ -32,6 +32,7 @@ @@ -174,7 +174,7 @@ index ca6899b50f5..44cb12f90ee 100644 #include "wine/server.h" #include "wine/list.h" #include "wine/debug.h" -@@ -5607,6 +5609,104 @@ static void ignore_server_ioctl_struct_holes( ULONG code, const void *in_buffer, +@@ -5661,6 +5663,104 @@ static void ignore_server_ioctl_struct_holes( ULONG code, const void *in_buffer, } @@ -204,7 +204,7 @@ index ca6899b50f5..44cb12f90ee 100644 + src_allocated = TRUE; + nt_dest.Buffer = dest; + nt_dest.Length = dest_len; -+ status = nt_to_unix_file_name( &nt_dest, &unix_dest, 0, FALSE ); ++ status = nt_to_unix_file_name( &nt_dest, &unix_dest, 0 ); + if (status != STATUS_SUCCESS && status != STATUS_NO_SUCH_FILE) + goto cleanup; + dest_allocated = TRUE; @@ -279,7 +279,7 @@ index ca6899b50f5..44cb12f90ee 100644 /****************************************************************************** * NtFsControlFile (NTDLL.@) */ -@@ -5671,6 +5771,23 @@ NTSTATUS WINAPI NtFsControlFile( HANDLE handle, HANDLE event, PIO_APC_ROUTINE ap +@@ -5748,6 +5848,23 @@ NTSTATUS WINAPI NtFsControlFile( HANDLE handle, HANDLE event, PIO_APC_ROUTINE ap io->Information = 0; status = STATUS_SUCCESS; break; @@ -304,10 +304,10 @@ index ca6899b50f5..44cb12f90ee 100644 return server_ioctl_file( handle, event, apc, apc_context, io, code, in_buffer, in_size, out_buffer, out_size ); diff --git a/include/Makefile.in b/include/Makefile.in -index 9f70e72b4c7..1c5c456aa39 100644 +index 216adf0d7ae..7dc16c230b6 100644 --- a/include/Makefile.in +++ b/include/Makefile.in -@@ -518,6 +518,7 @@ SOURCES = \ +@@ -520,6 +520,7 @@ SOURCES = \ ntddvdeo.h \ ntdef.h \ ntdsapi.h \ @@ -364,7 +364,7 @@ index 00000000000..21d42e17325 + +#endif /* __WINE_NTIFS_H */ diff --git a/include/wine/port.h b/include/wine/port.h -index 928730a41d7..e8434c73cca 100644 +index 930efeeea1f..7d2c7388707 100644 --- a/include/wine/port.h +++ b/include/wine/port.h @@ -334,6 +334,15 @@ double rint(double x); @@ -384,7 +384,7 @@ index 928730a41d7..e8434c73cca 100644 int statvfs( const char *path, struct statvfs *buf ); #endif diff --git a/libs/port/Makefile.in b/libs/port/Makefile.in -index 7bc67fa3fee..1963afe2423 100644 +index d1de285d527..4b1ecab7516 100644 --- a/libs/port/Makefile.in +++ b/libs/port/Makefile.in @@ -14,6 +14,7 @@ C_SRCS = \ diff --git a/patches/ntdll-Junction_Points/0005-kernel32-ntdll-Add-support-for-deleting-junction-poi.patch b/patches/ntdll-Junction_Points/0005-kernel32-ntdll-Add-support-for-deleting-junction-poi.patch index ddf87cee..912e45db 100644 --- a/patches/ntdll-Junction_Points/0005-kernel32-ntdll-Add-support-for-deleting-junction-poi.patch +++ b/patches/ntdll-Junction_Points/0005-kernel32-ntdll-Add-support-for-deleting-junction-poi.patch @@ -1,4 +1,4 @@ -From b53336eeca65aa2dbf11c2d80a731ca904fe81de Mon Sep 17 00:00:00 2001 +From 67cacb66b16c354aa30f4c94bba9da44f7e45619 Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Thu, 16 Jan 2014 21:02:11 -0700 Subject: [PATCH] kernel32,ntdll: Add support for deleting junction points with @@ -11,10 +11,10 @@ Signed-off-by: Erich E. Hoover 2 files changed, 46 insertions(+), 7 deletions(-) diff --git a/dlls/kernel32/path.c b/dlls/kernel32/path.c -index b580e367561..9fa7d4c9f27 100644 +index db2c1fb0240..6b7912359cf 100644 --- a/dlls/kernel32/path.c +++ b/dlls/kernel32/path.c -@@ -1058,6 +1058,7 @@ BOOL WINAPI CreateDirectoryExA( LPCSTR template, LPCSTR path, LPSECURITY_ATTRIBU +@@ -233,6 +233,7 @@ BOOL WINAPI CreateDirectoryExA( LPCSTR template, LPCSTR path, LPSECURITY_ATTRIBU */ BOOL WINAPI RemoveDirectoryW( LPCWSTR path ) { @@ -22,10 +22,10 @@ index b580e367561..9fa7d4c9f27 100644 OBJECT_ATTRIBUTES attr; UNICODE_STRING nt_name; ANSI_STRING unix_name; -@@ -1089,15 +1090,21 @@ BOOL WINAPI RemoveDirectoryW( LPCWSTR path ) +@@ -264,15 +265,21 @@ BOOL WINAPI RemoveDirectoryW( LPCWSTR path ) } - status = wine_nt_to_unix_file_name( &nt_name, &unix_name, FILE_OPEN, FALSE ); + status = wine_nt_to_unix_file_name( &nt_name, &unix_name, FILE_OPEN ); - RtlFreeUnicodeString( &nt_name ); - if (!set_ntstatus( status )) + if (status == STATUS_SUCCESS) @@ -51,10 +51,10 @@ index b580e367561..9fa7d4c9f27 100644 return ret; } diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c -index d7b2f9aa0d9..e8cdb661772 100644 +index c7107500939..5b71f6f658b 100644 --- a/dlls/ntdll/tests/file.c +++ b/dlls/ntdll/tests/file.c -@@ -4938,7 +4938,7 @@ static void test_reparse_points(void) +@@ -5009,7 +5009,7 @@ static void test_reparse_points(void) REPARSE_GUID_DATA_BUFFER guid_buffer; static const WCHAR dotW[] = {'.',0}; REPARSE_DATA_BUFFER *buffer = NULL; @@ -63,7 +63,7 @@ index d7b2f9aa0d9..e8cdb661772 100644 INT buffer_len, string_len; IO_STATUS_BLOCK iosb; UNICODE_STRING nameW; -@@ -5027,6 +5027,38 @@ static void test_reparse_points(void) +@@ -5098,6 +5098,38 @@ static void test_reparse_points(void) "Junction point folder's access time does not match.\n"); CloseHandle(handle); @@ -103,5 +103,5 @@ index d7b2f9aa0d9..e8cdb661772 100644 /* Cleanup */ pRtlFreeUnicodeString(&nameW); -- -2.23.0 +2.27.0 diff --git a/patches/ntdll-Junction_Points/0010-ntdll-Add-support-for-relative-symlink-creation.patch b/patches/ntdll-Junction_Points/0010-ntdll-Add-support-for-relative-symlink-creation.patch index bc081f3d..5804ab70 100644 --- a/patches/ntdll-Junction_Points/0010-ntdll-Add-support-for-relative-symlink-creation.patch +++ b/patches/ntdll-Junction_Points/0010-ntdll-Add-support-for-relative-symlink-creation.patch @@ -1,4 +1,4 @@ -From 6a13b364b9b8a92d706b8ee2f4e69743ab3bee5a Mon Sep 17 00:00:00 2001 +From 2fe2cb6a67925f22e9b3fbffefd20c2fe0040775 Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Thu, 11 Apr 2019 12:16:49 -0600 Subject: [PATCH] ntdll: Add support for relative symlink creation. @@ -11,7 +11,7 @@ Signed-off-by: Erich E. Hoover 3 files changed, 77 insertions(+), 13 deletions(-) diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c -index df912e18496..515a84da4d6 100644 +index b93ba0e87ed..975a72e7103 100644 --- a/dlls/ntdll/tests/file.c +++ b/dlls/ntdll/tests/file.c @@ -4972,7 +4972,8 @@ static void test_file_readonly_access(void) @@ -101,10 +101,10 @@ index df912e18496..515a84da4d6 100644 /* Cleanup */ pRtlFreeUnicodeString(&nameW); diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c -index e35ea49d17f..eb39dc0873b 100644 +index fe945cef477..a1d1863133a 100644 --- a/dlls/ntdll/unix/file.c +++ b/dlls/ntdll/unix/file.c -@@ -5615,16 +5615,19 @@ static void ignore_server_ioctl_struct_holes( ULONG code, const void *in_buffer, +@@ -5669,16 +5669,19 @@ static void ignore_server_ioctl_struct_holes( ULONG code, const void *in_buffer, */ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) { @@ -126,7 +126,7 @@ index e35ea49d17f..eb39dc0873b 100644 int i; switch(buffer->ReparseTag) -@@ -5633,11 +5636,13 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) +@@ -5687,11 +5690,13 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) dest_len = buffer->MountPointReparseBuffer.SubstituteNameLength; offset = buffer->MountPointReparseBuffer.SubstituteNameOffset; dest = &buffer->MountPointReparseBuffer.PathBuffer[offset]; @@ -140,7 +140,7 @@ index e35ea49d17f..eb39dc0873b 100644 break; default: return STATUS_NOT_IMPLEMENTED; -@@ -5649,17 +5654,54 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) +@@ -5703,17 +5708,54 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) if ((status = server_get_unix_name( handle, &unix_src ))) goto cleanup; src_allocated = TRUE; @@ -173,7 +173,7 @@ index e35ea49d17f..eb39dc0873b 100644 + nt_dest.Length = dest_len; + } + nt_dest_allocated = TRUE; - status = nt_to_unix_file_name( &nt_dest, &unix_dest, 0, FALSE ); + status = nt_to_unix_file_name( &nt_dest, &unix_dest, 0 ); if (status != STATUS_SUCCESS && status != STATUS_NO_SUCH_FILE) goto cleanup; dest_allocated = TRUE; @@ -199,7 +199,7 @@ index e35ea49d17f..eb39dc0873b 100644 for (i = 0; i < sizeof(ULONG)*8; i++) { if ((buffer->ReparseTag >> i) & 1) -@@ -5678,7 +5720,7 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) +@@ -5732,7 +5774,7 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) strcat( magic_dest, "." ); strcat( magic_dest, "/" ); } @@ -208,7 +208,7 @@ index e35ea49d17f..eb39dc0873b 100644 /* Produce the link in a temporary location in the same folder */ strcpy( tmpdir, unix_src.Buffer ); -@@ -5728,7 +5770,9 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) +@@ -5782,7 +5824,9 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) cleanup: if (tempdir_created) rmdir( tmpdir ); diff --git a/patches/ntdll-Junction_Points/0013-ntdll-Allow-creation-of-dangling-reparse-points-to-n.patch b/patches/ntdll-Junction_Points/0013-ntdll-Allow-creation-of-dangling-reparse-points-to-n.patch index d6435c86..dc72ebb7 100644 --- a/patches/ntdll-Junction_Points/0013-ntdll-Allow-creation-of-dangling-reparse-points-to-n.patch +++ b/patches/ntdll-Junction_Points/0013-ntdll-Allow-creation-of-dangling-reparse-points-to-n.patch @@ -1,4 +1,4 @@ -From 1f399151685c3d7827d39b7039abe7b3b941a3bc Mon Sep 17 00:00:00 2001 +From c1f3ec8ecefd4488bd8f49da22deb2f4f56d489c Mon Sep 17 00:00:00 2001 From: "Erich E. Hoover" Date: Tue, 30 Apr 2019 16:24:54 -0600 Subject: [PATCH] ntdll: Allow creation of dangling reparse points to @@ -11,10 +11,10 @@ Signed-off-by: Erich E. Hoover 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c -index fb1e6bd3c1c..c47aea62a38 100644 +index 3cfd633df86..fc79a2fa735 100644 --- a/dlls/ntdll/unix/file.c +++ b/dlls/ntdll/unix/file.c -@@ -3218,6 +3218,19 @@ static NTSTATUS lookup_unix_name( const WCHAR *name, int name_len, char **buffer +@@ -3273,6 +3273,19 @@ static NTSTATUS lookup_unix_name( const WCHAR *name, int name_len, char **buffer status = STATUS_OBJECT_NAME_COLLISION; } } @@ -34,20 +34,20 @@ index fb1e6bd3c1c..c47aea62a38 100644 if (status != STATUS_SUCCESS) break; -@@ -5682,7 +5695,7 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) +@@ -5736,7 +5749,7 @@ NTSTATUS FILE_CreateSymlink(HANDLE handle, REPARSE_DATA_BUFFER *buffer) nt_dest.Length = dest_len; } nt_dest_allocated = TRUE; -- status = nt_to_unix_file_name( &nt_dest, &unix_dest, 0, FALSE ); -+ status = nt_to_unix_file_name( &nt_dest, &unix_dest, FILE_WINE_PATH, FALSE ); +- status = nt_to_unix_file_name( &nt_dest, &unix_dest, 0 ); ++ status = nt_to_unix_file_name( &nt_dest, &unix_dest, FILE_WINE_PATH ); if (status != STATUS_SUCCESS && status != STATUS_NO_SUCH_FILE) goto cleanup; dest_allocated = TRUE; diff --git a/include/winternl.h b/include/winternl.h -index 0957561063a..0af566f518d 100644 +index 4ee32d3c9e9..3d444e7485e 100644 --- a/include/winternl.h +++ b/include/winternl.h -@@ -1839,6 +1839,7 @@ typedef struct _RTL_HANDLE_TABLE +@@ -1869,6 +1869,7 @@ typedef struct _RTL_HANDLE_TABLE #define FILE_OVERWRITE 4 #define FILE_OVERWRITE_IF 5 #define FILE_MAXIMUM_DISPOSITION 5 diff --git a/patches/ntdll-NtDevicePath/0001-ntdll-Implement-opening-files-through-nt-device-path.patch b/patches/ntdll-NtDevicePath/0001-ntdll-Implement-opening-files-through-nt-device-path.patch index e39ce2ac..fd04fa01 100644 --- a/patches/ntdll-NtDevicePath/0001-ntdll-Implement-opening-files-through-nt-device-path.patch +++ b/patches/ntdll-NtDevicePath/0001-ntdll-Implement-opening-files-through-nt-device-path.patch @@ -1,4 +1,4 @@ -From 351c405a950985a6d5a2262ce88b46ecf83b03ff Mon Sep 17 00:00:00 2001 +From 38833e0b211516ba54a68cb7e6f560c8caf952ff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=BCller?= Date: Fri, 26 May 2017 05:17:17 +0200 Subject: [PATCH] ntdll: Implement opening files through nt device paths. @@ -9,7 +9,7 @@ Subject: [PATCH] ntdll: Implement opening files through nt device paths. 2 files changed, 147 insertions(+), 10 deletions(-) diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c -index e7918140323..7247f792941 100644 +index 9e65a1f6ddd..7b65152f7cf 100644 --- a/dlls/ntdll/tests/file.c +++ b/dlls/ntdll/tests/file.c @@ -135,18 +135,22 @@ static void WINAPI apc( void *arg, IO_STATUS_BLOCK *iosb, ULONG reserved ) @@ -63,10 +63,10 @@ index e7918140323..7247f792941 100644 static void open_file_test(void) diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c -index 22f34a1f008..72fea5b8aab 100644 +index a7f22e83e12..b93c169f856 100644 --- a/dlls/ntdll/unix/file.c +++ b/dlls/ntdll/unix/file.c -@@ -3360,16 +3360,10 @@ static NTSTATUS nt_to_unix_file_name_attr( const OBJECT_ATTRIBUTES *attr, ANSI_S +@@ -3307,16 +3307,10 @@ static NTSTATUS nt_to_unix_file_name_attr( const OBJECT_ATTRIBUTES *attr, ANSI_S /****************************************************************************** @@ -80,13 +80,13 @@ index 22f34a1f008..72fea5b8aab 100644 + * nt_to_unix_file_name_internal */ -NTSTATUS CDECL nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRING *unix_name_ret, -- UINT disposition, BOOLEAN check_case ) +- UINT disposition ) +static NTSTATUS nt_to_unix_file_name_internal( const UNICODE_STRING *nameW, ANSI_STRING *unix_name_ret, -+ UINT disposition, BOOLEAN check_case ) ++ UINT disposition ) { static const WCHAR unixW[] = {'u','n','i','x'}; static const WCHAR pipeW[] = {'p','i','p','e'}; -@@ -3482,6 +3476,126 @@ NTSTATUS CDECL nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRING *u +@@ -3430,6 +3424,126 @@ NTSTATUS CDECL nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRING *u return status; } @@ -166,7 +166,7 @@ index 22f34a1f008..72fea5b8aab 100644 + * returned, but the unix name is still filled in properly. + */ +NTSTATUS CDECL nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRING *unix_name_ret, -+ UINT disposition, BOOLEAN check_case ) ++ UINT disposition ) +{ + static const WCHAR systemrootW[] = {'\\','S','y','s','t','e','m','R','o','o','t','\\',0}; + static const WCHAR dosprefixW[] = {'\\','?','?','\\'}; @@ -189,7 +189,7 @@ index 22f34a1f008..72fea5b8aab 100644 + prefix = user_shared_data->NtSystemRoot; + } + else -+ return nt_to_unix_file_name_internal( nameW, unix_name_ret, disposition, check_case ); ++ return nt_to_unix_file_name_internal( nameW, unix_name_ret, disposition ); + + name_len = sizeof(dosprefixW) + wcslen(prefix) * sizeof(WCHAR) + + nameW->Length - offset * sizeof(WCHAR) + sizeof(WCHAR); @@ -205,7 +205,7 @@ index 22f34a1f008..72fea5b8aab 100644 + ptr[ nameW->Length / sizeof(WCHAR) - offset ] = 0; + + RtlInitUnicodeString( &dospathW, name ); -+ status = nt_to_unix_file_name_internal( &dospathW, unix_name_ret, disposition, check_case ); ++ status = nt_to_unix_file_name_internal( &dospathW, unix_name_ret, disposition ); + + RtlFreeHeap( GetProcessHeap(), 0, name ); + return status; diff --git a/patches/ntdll-Pipe_SpecialCharacters/0001-ntdll-Allow-special-characters-in-pipe-names.patch b/patches/ntdll-Pipe_SpecialCharacters/0001-ntdll-Allow-special-characters-in-pipe-names.patch index bdcf5a10..4fd35b35 100644 --- a/patches/ntdll-Pipe_SpecialCharacters/0001-ntdll-Allow-special-characters-in-pipe-names.patch +++ b/patches/ntdll-Pipe_SpecialCharacters/0001-ntdll-Allow-special-characters-in-pipe-names.patch @@ -1,4 +1,4 @@ -From d4166e5e9761c9a3d896486b1eb2582ca6f20482 Mon Sep 17 00:00:00 2001 +From addb612dfe7429c29adeb31144976713cb0756b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=BCller?= Date: Sun, 27 Jul 2014 03:35:42 +0200 Subject: [PATCH] ntdll: Allow special characters in pipe names. @@ -38,26 +38,26 @@ index 3c7ca06a045..453dcc80b7b 100644 } diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c -index 13096e085e8..31a6c761c7c 100644 +index 61340a0e010..a7f22e83e12 100644 --- a/dlls/ntdll/unix/file.c +++ b/dlls/ntdll/unix/file.c -@@ -2830,6 +2830,7 @@ NTSTATUS CDECL nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRING *u - UINT disposition, BOOLEAN check_case ) +@@ -3319,6 +3319,7 @@ NTSTATUS CDECL nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRING *u + UINT disposition ) { static const WCHAR unixW[] = {'u','n','i','x'}; + static const WCHAR pipeW[] = {'p','i','p','e'}; static const WCHAR invalid_charsW[] = { INVALID_NT_CHARS, 0 }; NTSTATUS status = STATUS_SUCCESS; -@@ -2839,6 +2840,7 @@ NTSTATUS CDECL nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRING *u - int pos, ret, name_len, unix_len, prefix_len; +@@ -3329,6 +3330,7 @@ NTSTATUS CDECL nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRING *u WCHAR prefix[MAX_DIR_ENTRY_LEN + 1]; + BOOLEAN check_case = FALSE; BOOLEAN is_unix = FALSE; + BOOLEAN is_pipe = FALSE; name = nameW->Buffer; name_len = nameW->Length / sizeof(WCHAR); -@@ -2872,13 +2874,17 @@ NTSTATUS CDECL nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRING *u +@@ -3362,13 +3364,17 @@ NTSTATUS CDECL nt_to_unix_file_name( const UNICODE_STRING *nameW, ANSI_STRING *u name += prefix_len; name_len -= prefix_len; diff --git a/patches/ntdll-ThreadTime/definition b/patches/ntdll-ThreadTime/definition index 7a231fe6..6b2dd9c7 100644 --- a/patches/ntdll-ThreadTime/definition +++ b/patches/ntdll-ThreadTime/definition @@ -2,3 +2,4 @@ Fixes: Return correct thread creation time in SystemProcessInformation Fixes: Fill process virtual memory counters in NtQuerySystemInformation # Patch 6 is broken. We should really be returning this information from the # server, but that needs a bit more work. +Disabled: true diff --git a/patches/nvcuda-CUDA_Support/0009-nvcuda-Implement-cuModuleLoad-wrapper-function.patch b/patches/nvcuda-CUDA_Support/0009-nvcuda-Implement-cuModuleLoad-wrapper-function.patch index 9b7aa461..2b648b03 100644 --- a/patches/nvcuda-CUDA_Support/0009-nvcuda-Implement-cuModuleLoad-wrapper-function.patch +++ b/patches/nvcuda-CUDA_Support/0009-nvcuda-Implement-cuModuleLoad-wrapper-function.patch @@ -1,16 +1,16 @@ -From 7ed5f1e7150ea0d397633ff1b44518567eddcf5d Mon Sep 17 00:00:00 2001 +From 73f255bdc5edef27f9a03b7e8917686490d3bf7a Mon Sep 17 00:00:00 2001 From: Sebastian Lackner Date: Sat, 7 Mar 2015 06:20:55 +0100 -Subject: nvcuda: Implement cuModuleLoad wrapper function. +Subject: [PATCH] nvcuda: Implement cuModuleLoad wrapper function. --- - dlls/nvcuda/nvcuda.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ + dlls/nvcuda/nvcuda.c | 46 +++++++++++++++++++++++++++++++++++++++++ dlls/nvcuda/nvcuda.spec | 2 +- include/cuda.h | 1 + 3 files changed, 48 insertions(+), 1 deletion(-) diff --git a/dlls/nvcuda/nvcuda.c b/dlls/nvcuda/nvcuda.c -index 3262afd..ec32da2 100644 +index e11a1d51a9d..14b695f3371 100644 --- a/dlls/nvcuda/nvcuda.c +++ b/dlls/nvcuda/nvcuda.c @@ -29,6 +29,7 @@ @@ -59,7 +59,7 @@ index 3262afd..ec32da2 100644 + return FALSE; + } + -+ status = wine_nt_to_unix_file_name(&ntpathW, unix_name, FILE_OPEN, FALSE); ++ status = wine_nt_to_unix_file_name(&ntpathW, unix_name, FILE_OPEN); + + RtlFreeUnicodeString(&ntpathW); + RtlFreeUnicodeString(&dospathW); @@ -88,7 +88,7 @@ index 3262afd..ec32da2 100644 { TRACE("(%p, %p)\n", module, image); diff --git a/dlls/nvcuda/nvcuda.spec b/dlls/nvcuda/nvcuda.spec -index 84b5fcd..492d6c1 100644 +index 84b5fcd8f4d..492d6c129c1 100644 --- a/dlls/nvcuda/nvcuda.spec +++ b/dlls/nvcuda/nvcuda.spec @@ -240,7 +240,7 @@ @@ -101,7 +101,7 @@ index 84b5fcd..492d6c1 100644 @ stdcall cuModuleLoadDataEx(ptr ptr long ptr ptr) wine_cuModuleLoadDataEx @ stdcall cuModuleLoadFatBinary(ptr ptr) wine_cuModuleLoadFatBinary diff --git a/include/cuda.h b/include/cuda.h -index 327fe4d..2bf20f9 100644 +index 327fe4d8ef3..2bf20f9533e 100644 --- a/include/cuda.h +++ b/include/cuda.h @@ -23,6 +23,7 @@ @@ -113,5 +113,5 @@ index 327fe4d..2bf20f9 100644 #define CUDA_ERROR_NOT_SUPPORTED 801 #define CUDA_ERROR_UNKNOWN 999 -- -2.3.0 +2.27.0 diff --git a/patches/nvcuvid-CUDA_Video_Support/0001-nvcuvid-First-implementation.patch b/patches/nvcuvid-CUDA_Video_Support/0001-nvcuvid-First-implementation.patch index 9ac92b9e..ed89575c 100644 --- a/patches/nvcuvid-CUDA_Video_Support/0001-nvcuvid-First-implementation.patch +++ b/patches/nvcuvid-CUDA_Video_Support/0001-nvcuvid-First-implementation.patch @@ -1,7 +1,7 @@ -From 0e8472f74df21fed8e0b86ba1e2ae2e34b4082d2 Mon Sep 17 00:00:00 2001 +From ecde4f4f994831bbeb1029d93e0b06f815c503b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michael=20M=C3=BCller?= Date: Tue, 6 Jan 2015 05:16:36 +0100 -Subject: [PATCH] nvcuvid: First implementation. (rev 2) +Subject: nvcuvid: First implementation. (rev 2) Changes by Sebastian Lackner : * Convert structures properly where the Windows and Linux definition differs. @@ -21,10 +21,10 @@ Changes by Sebastian Lackner : create mode 100644 include/nvcuvid.h diff --git a/configure.ac b/configure.ac -index 90d5ed7df..326d03975 100644 +index e0d4af5b9d8..14bd257d826 100644 --- a/configure.ac +++ b/configure.ac -@@ -3554,6 +3554,7 @@ WINE_CONFIG_MAKEFILE(dlls/nvapi/tests) +@@ -3589,6 +3589,7 @@ WINE_CONFIG_MAKEFILE(dlls/nvapi/tests) WINE_CONFIG_MAKEFILE(dlls/nvapi64,enable_win64) WINE_CONFIG_MAKEFILE(dlls/nvcuda) WINE_CONFIG_MAKEFILE(dlls/nvcuda/tests) @@ -34,7 +34,7 @@ index 90d5ed7df..326d03975 100644 WINE_CONFIG_MAKEFILE(dlls/odbcbcp) diff --git a/dlls/nvcuvid/Makefile.in b/dlls/nvcuvid/Makefile.in new file mode 100644 -index 000000000..2c2dc8ccf +index 00000000000..2c2dc8ccf67 --- /dev/null +++ b/dlls/nvcuvid/Makefile.in @@ -0,0 +1,4 @@ @@ -44,7 +44,7 @@ index 000000000..2c2dc8ccf + nvcuvid.c diff --git a/dlls/nvcuvid/nvcuvid.c b/dlls/nvcuvid/nvcuvid.c new file mode 100644 -index 000000000..05fec0fff +index 00000000000..2704bfa9a63 --- /dev/null +++ b/dlls/nvcuvid/nvcuvid.c @@ -0,0 +1,537 @@ @@ -338,7 +338,7 @@ index 000000000..05fec0fff + return FALSE; + } + -+ status = wine_nt_to_unix_file_name(&ntpathW, unix_name, FILE_OPEN, FALSE); ++ status = wine_nt_to_unix_file_name(&ntpathW, unix_name, FILE_OPEN); + + RtlFreeUnicodeString(&ntpathW); + RtlFreeUnicodeString(&dospathW); @@ -587,7 +587,7 @@ index 000000000..05fec0fff +} diff --git a/dlls/nvcuvid/nvcuvid.spec b/dlls/nvcuvid/nvcuvid.spec new file mode 100644 -index 000000000..433e7db3b +index 00000000000..433e7db3b7e --- /dev/null +++ b/dlls/nvcuvid/nvcuvid.spec @@ -0,0 +1,24 @@ @@ -616,10 +616,10 @@ index 000000000..433e7db3b +@ stdcall cuvidSetVideoSourceState(ptr long) wine_cuvidSetVideoSourceState +@ stdcall cuvidUnmapVideoFrame(ptr long) wine_cuvidUnmapVideoFrame diff --git a/include/Makefile.in b/include/Makefile.in -index c28834897..c38dd2ad1 100644 +index 3bb3f938747..3db2e16be76 100644 --- a/include/Makefile.in +++ b/include/Makefile.in -@@ -81,6 +81,7 @@ SOURCES = \ +@@ -87,6 +87,7 @@ SOURCES = \ ctxtcall.idl \ cuda.h \ custcntl.h \ @@ -627,7 +627,7 @@ index c28834897..c38dd2ad1 100644 cvconst.h \ d2d1.idl \ d2d1_1.idl \ -@@ -498,6 +499,7 @@ SOURCES = \ +@@ -527,6 +528,7 @@ SOURCES = \ ntsecpkg.h \ ntstatus.h \ nvapi.h \ @@ -637,7 +637,7 @@ index c28834897..c38dd2ad1 100644 objectarray.idl \ diff --git a/include/cuviddec.h b/include/cuviddec.h new file mode 100644 -index 000000000..e45032190 +index 00000000000..e4503219097 --- /dev/null +++ b/include/cuviddec.h @@ -0,0 +1,99 @@ @@ -742,7 +742,7 @@ index 000000000..e45032190 +#endif /* __WINE_CUVIDDEC_H */ diff --git a/include/nvcuvid.h b/include/nvcuvid.h new file mode 100644 -index 000000000..a192ef64c +index 00000000000..a192ef64c2e --- /dev/null +++ b/include/nvcuvid.h @@ -0,0 +1,79 @@ @@ -826,5 +826,5 @@ index 000000000..a192ef64c + +#endif /* __WINE_NVCUVID_H */ -- -2.24.0 +2.27.0 diff --git a/patches/patchinstall.sh b/patches/patchinstall.sh index 2c8c8ac5..a33d9f13 100755 --- a/patches/patchinstall.sh +++ b/patches/patchinstall.sh @@ -52,7 +52,7 @@ usage() # Get the upstream commit sha upstream_commit() { - echo "6e2a54ec76d225d76506fe909a9c300702636d5b" + echo "e0e3b6bc91f7db956e3a66f2938eea45d4055a39" } # Show version information @@ -196,7 +196,6 @@ patch_enable_all () enable_ntdll_SystemInterruptInformation="$1" enable_ntdll_SystemModuleInformation="$1" enable_ntdll_SystemRoot_Symlink="$1" - enable_ntdll_ThreadTime="$1" enable_ntdll_WRITECOPY="$1" enable_ntdll_Zero_mod_name="$1" enable_ntdll_aarch_TEB="$1" @@ -680,9 +679,6 @@ patch_enable () ntdll-SystemRoot_Symlink) enable_ntdll_SystemRoot_Symlink="$2" ;; - ntdll-ThreadTime) - enable_ntdll_ThreadTime="$2" - ;; ntdll-WRITECOPY) enable_ntdll_WRITECOPY="$2" ;; @@ -1558,13 +1554,6 @@ if test "$enable_shell32_Progress_Dialog" -eq 1; then enable_shell32_SHFileOperation_Move=1 fi -if test "$enable_server_Realtime_Priority" -eq 1; then - if test "$enable_ntdll_ThreadTime" -gt 1; then - abort "Patchset ntdll-ThreadTime disabled, but server-Realtime_Priority depends on that." - fi - enable_ntdll_ThreadTime=1 -fi - if test "$enable_server_Object_Types" -eq 1; then if test "$enable_ntdll_SystemModuleInformation" -gt 1; then abort "Patchset ntdll-SystemModuleInformation disabled, but server-Object_Types depends on that." @@ -1661,11 +1650,7 @@ if test "$enable_ntdll_Hide_Wine_Exports" -eq 1; then if test "$enable_advapi32_Token_Integrity_Level" -gt 1; then abort "Patchset advapi32-Token_Integrity_Level disabled, but ntdll-Hide_Wine_Exports depends on that." fi - if test "$enable_ntdll_ThreadTime" -gt 1; then - abort "Patchset ntdll-ThreadTime disabled, but ntdll-Hide_Wine_Exports depends on that." - fi enable_advapi32_Token_Integrity_Level=1 - enable_ntdll_ThreadTime=1 fi if test "$enable_ntdll_Builtin_Prot" -eq 1; then @@ -3655,24 +3640,10 @@ if test "$enable_ntdll_Heap_Improvements" -eq 1; then ) >> "$patchlist" fi -# Patchset ntdll-ThreadTime -# | -# | Modified files: -# | * dlls/ntdll/unix/system.c, server/protocol.def, server/snapshot.c, server/thread.h -# | -if test "$enable_ntdll_ThreadTime" -eq 1; then - patch_apply ntdll-ThreadTime/0002-ntdll-Set-correct-thread-creation-time-for-SystemPro.patch - patch_apply ntdll-ThreadTime/0004-ntdll-Set-process-start-time.patch - ( - printf '%s\n' '+ { "Michael Müller", "ntdll: Set correct thread creation time for SystemProcessInformation in NtQuerySystemInformation.", 1 },'; - printf '%s\n' '+ { "Michael Müller", "ntdll: Set process start time.", 1 },'; - ) >> "$patchlist" -fi - # Patchset ntdll-Hide_Wine_Exports # | # | This patchset has the following (direct or indirect) dependencies: -# | * Staging, advapi32-CreateRestrictedToken, advapi32-Token_Integrity_Level, ntdll-ThreadTime +# | * Staging, advapi32-CreateRestrictedToken, advapi32-Token_Integrity_Level # | # | This patchset fixes the following Wine bugs: # | * [#38656] Add support for hiding wine version information from applications @@ -4383,8 +4354,8 @@ fi # | server/console.c, server/debugger.c, server/device.c, server/directory.c, server/event.c, server/fd.c, server/file.c, # | server/handle.c, server/handle.h, server/hook.c, server/mailslot.c, server/mapping.c, server/mutex.c, # | server/named_pipe.c, server/object.c, server/object.h, server/process.c, server/queue.c, server/registry.c, -# | server/request.c, server/semaphore.c, server/serial.c, server/signal.c, server/snapshot.c, server/sock.c, -# | server/symlink.c, server/thread.c, server/timer.c, server/token.c, server/winstation.c +# | server/request.c, server/semaphore.c, server/serial.c, server/signal.c, server/sock.c, server/symlink.c, +# | server/thread.c, server/timer.c, server/token.c, server/winstation.c # | if test "$enable_server_Desktop_Refcount" -eq 1; then patch_apply server-Desktop_Refcount/0001-server-Introduce-a-new-alloc_handle-object-callback..patch @@ -4557,9 +4528,6 @@ fi # Patchset server-Realtime_Priority # | -# | This patchset has the following (direct or indirect) dependencies: -# | * ntdll-ThreadTime -# | # | Modified files: # | * server/Makefile.in, server/main.c, server/scheduler.c, server/thread.c, server/thread.h # | diff --git a/patches/server-Desktop_Refcount/0001-server-Introduce-a-new-alloc_handle-object-callback..patch b/patches/server-Desktop_Refcount/0001-server-Introduce-a-new-alloc_handle-object-callback..patch index b8735028..5502e9a8 100644 --- a/patches/server-Desktop_Refcount/0001-server-Introduce-a-new-alloc_handle-object-callback..patch +++ b/patches/server-Desktop_Refcount/0001-server-Introduce-a-new-alloc_handle-object-callback..patch @@ -1,4 +1,4 @@ -From 07f5dd1db6399c54be793ca496546bb28947aaae Mon Sep 17 00:00:00 2001 +From 057f64581fd7acc3834bae2c6ebccd812f26b722 Mon Sep 17 00:00:00 2001 From: Sebastian Lackner Date: Fri, 4 Dec 2015 10:36:47 +0100 Subject: [PATCH] server: Introduce a new alloc_handle object callback. (v2) @@ -32,14 +32,13 @@ Signed-off-by: Sebastian Lackner server/semaphore.c | 1 + server/serial.c | 1 + server/signal.c | 1 + - server/snapshot.c | 1 + server/sock.c | 2 ++ server/symlink.c | 1 + server/thread.c | 3 +++ server/timer.c | 1 + server/token.c | 1 + server/winstation.c | 2 ++ - 34 files changed, 79 insertions(+), 4 deletions(-) + 33 files changed, 78 insertions(+), 4 deletions(-) diff --git a/server/async.c b/server/async.c index 03994e8fac2..9feafd01847 100644 @@ -110,10 +109,10 @@ index db04727b93b..e72a155eeeb 100644 completion_destroy /* destroy */ }; diff --git a/server/console.c b/server/console.c -index 729cfa40612..a0d9bd87ab4 100644 +index d6673dca1bd..8ed0c1f2d81 100644 --- a/server/console.c +++ b/server/console.c -@@ -97,6 +97,7 @@ static const struct object_ops console_input_ops = +@@ -99,6 +99,7 @@ static const struct object_ops console_input_ops = NULL, /* unlink_name */ console_input_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ @@ -121,7 +120,7 @@ index 729cfa40612..a0d9bd87ab4 100644 no_close_handle, /* close_handle */ console_input_destroy /* destroy */ }; -@@ -132,6 +133,7 @@ static const struct object_ops console_input_events_ops = +@@ -134,6 +135,7 @@ static const struct object_ops console_input_events_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ @@ -129,7 +128,7 @@ index 729cfa40612..a0d9bd87ab4 100644 no_close_handle, /* close_handle */ console_input_events_destroy /* destroy */ }; -@@ -195,6 +197,7 @@ static const struct object_ops screen_buffer_ops = +@@ -197,6 +199,7 @@ static const struct object_ops screen_buffer_ops = NULL, /* unlink_name */ screen_buffer_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ @@ -137,7 +136,7 @@ index 729cfa40612..a0d9bd87ab4 100644 no_close_handle, /* close_handle */ screen_buffer_destroy /* destroy */ }; -@@ -241,6 +244,7 @@ static const struct object_ops console_device_ops = +@@ -244,6 +247,7 @@ static const struct object_ops console_device_ops = default_unlink_name, /* unlink_name */ console_device_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ @@ -375,7 +374,7 @@ index 781e6f3141a..6f0321393e2 100644 mailslot_device_destroy /* destroy */ }; diff --git a/server/mapping.c b/server/mapping.c -index 0941dd87c05..42c207b3367 100644 +index 07c51c246d6..796855ac8e5 100644 --- a/server/mapping.c +++ b/server/mapping.c @@ -79,6 +79,7 @@ static const struct object_ops ranges_ops = @@ -500,10 +499,10 @@ index f0b889d5899..13c59694c46 100644 extern void no_destroy( struct object *obj ); #ifdef DEBUG_OBJECTS diff --git a/server/process.c b/server/process.c -index 283edc09c5e..3134bf415a0 100644 +index 9482da98be5..4166f1ce8df 100644 --- a/server/process.c +++ b/server/process.c -@@ -88,6 +88,7 @@ static const struct object_ops process_ops = +@@ -89,6 +89,7 @@ static const struct object_ops process_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ process_get_kernel_obj_list, /* get_kernel_obj_list */ @@ -511,7 +510,7 @@ index 283edc09c5e..3134bf415a0 100644 no_close_handle, /* close_handle */ process_destroy /* destroy */ }; -@@ -138,6 +139,7 @@ static const struct object_ops startup_info_ops = +@@ -139,6 +140,7 @@ static const struct object_ops startup_info_ops = NULL, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ @@ -519,7 +518,7 @@ index 283edc09c5e..3134bf415a0 100644 no_close_handle, /* close_handle */ startup_info_destroy /* destroy */ }; -@@ -183,6 +185,7 @@ static const struct object_ops job_ops = +@@ -184,6 +186,7 @@ static const struct object_ops job_ops = default_unlink_name, /* unlink_name */ no_open_file, /* open_file */ no_kernel_obj_list, /* get_kernel_obj_list */ @@ -528,7 +527,7 @@ index 283edc09c5e..3134bf415a0 100644 job_destroy /* destroy */ }; diff --git a/server/queue.c b/server/queue.c -index c3925dd6646..e30cc0c13ad 100644 +index a65eab38bdc..d658c48323f 100644 --- a/server/queue.c +++ b/server/queue.c @@ -182,6 +182,7 @@ static const struct object_ops msg_queue_ops = @@ -607,18 +606,6 @@ index c81f6b8e989..b8dd87d86f1 100644 no_close_handle, /* close_handle */ handler_destroy /* destroy */ }; -diff --git a/server/snapshot.c b/server/snapshot.c -index a0f2ea17a3e..d5ba720980a 100644 ---- a/server/snapshot.c -+++ b/server/snapshot.c -@@ -72,6 +72,7 @@ static const struct object_ops snapshot_ops = - NULL, /* unlink_name */ - no_open_file, /* open_file */ - no_kernel_obj_list, /* get_kernel_obj_list */ -+ no_alloc_handle, /* alloc_handle */ - no_close_handle, /* close_handle */ - snapshot_destroy /* destroy */ - }; diff --git a/server/sock.c b/server/sock.c index 5095a6ef9f0..7b10b74cc4e 100644 --- a/server/sock.c @@ -652,7 +639,7 @@ index 7a2f8642d5f..7bb28c8d7ce 100644 symlink_destroy /* destroy */ }; diff --git a/server/thread.c b/server/thread.c -index e2bfa50c7ba..9faef2dcd34 100644 +index 9b14174578e..e3783351eb1 100644 --- a/server/thread.c +++ b/server/thread.c @@ -121,6 +121,7 @@ static const struct object_ops thread_apc_ops = diff --git a/patches/server-Key_State/0001-server-Introduce-a-helper-function-to-update-the-thr.patch b/patches/server-Key_State/0001-server-Introduce-a-helper-function-to-update-the-thr.patch index 2f57b1f8..c34e64b3 100644 --- a/patches/server-Key_State/0001-server-Introduce-a-helper-function-to-update-the-thr.patch +++ b/patches/server-Key_State/0001-server-Introduce-a-helper-function-to-update-the-thr.patch @@ -1,4 +1,4 @@ -From 0fefda7a02d52d1c8813d7caaf2ca3cc6e352a29 Mon Sep 17 00:00:00 2001 +From f20e406fad78eeebea4e07407e6b05e069c8475f Mon Sep 17 00:00:00 2001 From: Sebastian Lackner Date: Thu, 12 Mar 2015 00:44:25 +0100 Subject: [PATCH] server: Introduce a helper function to update the @@ -9,7 +9,7 @@ Subject: [PATCH] server: Introduce a helper function to update the 1 file changed, 23 insertions(+), 17 deletions(-) diff --git a/server/queue.c b/server/queue.c -index 432885f9e4c..0a20bd3639d 100644 +index a65eab38bdc..b8943bc4b61 100644 --- a/server/queue.c +++ b/server/queue.c @@ -1295,9 +1295,9 @@ static void set_input_key_state( unsigned char *keystate, unsigned char key, int @@ -61,16 +61,16 @@ index 432885f9e4c..0a20bd3639d 100644 } /* release the hardware message currently being processed by the given thread */ -@@ -1413,7 +1419,7 @@ static void release_hardware_message( struct msg_queue *queue, unsigned int hw_i - } - if (clr_bit) clear_queue_bits( queue, clr_bit ); - -- update_input_key_state( input->desktop, input->keystate, msg->msg, msg->wparam ); -+ update_input_key_state( input, msg->msg, msg->wparam ); - list_remove( &msg->entry ); - free_message( msg ); +@@ -1408,7 +1414,7 @@ static void release_hardware_message( struct msg_queue *queue, unsigned int hw_i } -@@ -1532,7 +1538,7 @@ static void queue_hardware_message( struct desktop *desktop, struct message *msg + if (clr_bit) clear_queue_bits( queue, clr_bit ); + +- update_input_key_state( input->desktop, input->keystate, msg->msg, msg->wparam ); ++ update_input_key_state( input, msg->msg, msg->wparam ); + list_remove( &msg->entry ); + free_message( msg ); + } +@@ -1526,7 +1532,7 @@ static void queue_hardware_message( struct desktop *desktop, struct message *msg struct thread_input *input; unsigned int msg_code; @@ -79,7 +79,7 @@ index 432885f9e4c..0a20bd3639d 100644 last_input_time = get_tick_count(); if (msg->msg != WM_MOUSEMOVE) always_queue = 1; -@@ -1567,7 +1573,7 @@ static void queue_hardware_message( struct desktop *desktop, struct message *msg +@@ -1561,7 +1567,7 @@ static void queue_hardware_message( struct desktop *desktop, struct message *msg win = find_hardware_message_window( desktop, input, msg, &msg_code, &thread ); if (!win || !thread) { @@ -88,7 +88,7 @@ index 432885f9e4c..0a20bd3639d 100644 free_message( msg ); return; } -@@ -1905,7 +1911,7 @@ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, c +@@ -1899,7 +1905,7 @@ static int queue_keyboard_message( struct desktop *desktop, user_handle_t win, c if ((device = current->process->rawinput_kbd) && (device->flags & RIDEV_NOLEGACY)) { @@ -97,7 +97,7 @@ index 432885f9e4c..0a20bd3639d 100644 return 0; } -@@ -2034,7 +2040,7 @@ static int get_hardware_message( struct thread *thread, unsigned int hw_id, user +@@ -2028,7 +2034,7 @@ static int get_hardware_message( struct thread *thread, unsigned int hw_id, user if (!win || !win_thread) { /* no window at all, remove it */ @@ -106,7 +106,7 @@ index 432885f9e4c..0a20bd3639d 100644 list_remove( &msg->entry ); free_message( msg ); continue; -@@ -2050,7 +2056,7 @@ static int get_hardware_message( struct thread *thread, unsigned int hw_id, user +@@ -2044,7 +2050,7 @@ static int get_hardware_message( struct thread *thread, unsigned int hw_id, user else { /* for another thread input, drop it */ diff --git a/patches/server-PeekMessage/0001-server-Fix-handling-of-GetMessage-after-previous-Pee.patch b/patches/server-PeekMessage/0001-server-Fix-handling-of-GetMessage-after-previous-Pee.patch index c1f1af9a..ce7ec607 100644 --- a/patches/server-PeekMessage/0001-server-Fix-handling-of-GetMessage-after-previous-Pee.patch +++ b/patches/server-PeekMessage/0001-server-Fix-handling-of-GetMessage-after-previous-Pee.patch @@ -1,8 +1,8 @@ -From 52837e975cb343d78e626bd8a9464db59d27565b Mon Sep 17 00:00:00 2001 +From c527f32596831ae31b055cd77cb3bc848f83a8a8 Mon Sep 17 00:00:00 2001 From: Sebastian Lackner Date: Sun, 15 Mar 2015 01:05:48 +0100 -Subject: server: Fix handling of GetMessage after previous PeekMessage call. - (v3) +Subject: [PATCH] server: Fix handling of GetMessage after previous PeekMessage + call. (v3) Changes in v2: * accept_hardware_message should also reset ignore_post_msg. @@ -10,15 +10,15 @@ Changes in v2: Changes in v3: * Fix remaining todo_wine. --- - dlls/user32/tests/msg.c | 29 +++++++++++++++++++--------- - server/queue.c | 50 +++++++++++++++++++++++++++++++++++++++++-------- + dlls/user32/tests/msg.c | 29 ++++++++++++++++-------- + server/queue.c | 50 ++++++++++++++++++++++++++++++++++------- 2 files changed, 62 insertions(+), 17 deletions(-) diff --git a/dlls/user32/tests/msg.c b/dlls/user32/tests/msg.c -index 45b5222deba..e36d0f8af49 100644 +index f84525a0bf9..80cc0daa6c6 100644 --- a/dlls/user32/tests/msg.c +++ b/dlls/user32/tests/msg.c -@@ -11037,13 +11037,10 @@ static void test_PeekMessage3(void) +@@ -12429,13 +12429,10 @@ static void test_PeekMessage3(void) ok(msg.message == WM_TIMER, "msg.message = %u instead of WM_TIMER\n", msg.message); PostMessageA(hwnd, WM_USER, 0, 0); ret = PeekMessageA(&msg, NULL, 0, 0, PM_NOREMOVE); @@ -32,7 +32,7 @@ index 45b5222deba..e36d0f8af49 100644 ok(ret && msg.message == WM_USER, "msg.message = %u instead of WM_USER\n", msg.message); ret = PeekMessageA(&msg, NULL, 0, 0, 0); ok(!ret, "expected PeekMessage to return FALSE, got %u\n", ret); -@@ -11053,10 +11050,8 @@ static void test_PeekMessage3(void) +@@ -12445,10 +12442,8 @@ static void test_PeekMessage3(void) ok(msg.message == WM_TIMER, "msg.message = %u instead of WM_TIMER\n", msg.message); PostMessageA(hwnd, WM_USER, 0, 0); ret = PeekMessageA(&msg, NULL, 0, 0, PM_REMOVE); @@ -43,7 +43,7 @@ index 45b5222deba..e36d0f8af49 100644 ok(ret && msg.message == WM_USER, "msg.message = %u instead of WM_USER\n", msg.message); ret = PeekMessageA(&msg, NULL, 0, 0, 0); ok(!ret, "expected PeekMessage to return FALSE, got %u\n", ret); -@@ -11068,10 +11063,8 @@ static void test_PeekMessage3(void) +@@ -12460,10 +12455,8 @@ static void test_PeekMessage3(void) ok(msg.message == WM_TIMER, "msg.message = %u instead of WM_TIMER\n", msg.message); PostMessageA(hwnd, WM_USER, 0, 0); ret = GetMessageA(&msg, NULL, 0, 0); @@ -54,7 +54,7 @@ index 45b5222deba..e36d0f8af49 100644 ok(ret && msg.message == WM_USER, "msg.message = %u instead of WM_USER\n", msg.message); ret = PeekMessageA(&msg, NULL, 0, 0, 0); ok(!ret, "expected PeekMessage to return FALSE, got %u\n", ret); -@@ -11099,14 +11092,32 @@ static void test_PeekMessage3(void) +@@ -12491,14 +12484,32 @@ static void test_PeekMessage3(void) ret = GetMessageA(&msg, NULL, 0, 0); ok(ret && msg.message == WM_USER, "msg.message = %u instead of WM_USER\n", msg.message); ret = GetMessageA(&msg, NULL, 0, 0); @@ -90,7 +90,7 @@ index 45b5222deba..e36d0f8af49 100644 * because both messages are in the same queue. */ diff --git a/server/queue.c b/server/queue.c -index c479b388bd6..fdb09d93238 100644 +index a65eab38bdc..bf315f5008c 100644 --- a/server/queue.c +++ b/server/queue.c @@ -140,6 +140,7 @@ struct msg_queue @@ -101,7 +101,7 @@ index c479b388bd6..fdb09d93238 100644 }; struct hotkey -@@ -298,6 +299,7 @@ static struct msg_queue *create_msg_queue( struct thread *thread, struct thread_ +@@ -300,6 +301,7 @@ static struct msg_queue *create_msg_queue( struct thread *thread, struct thread_ queue->input = (struct thread_input *)grab_object( input ); queue->hooks = NULL; queue->last_get_msg = current_time; @@ -109,7 +109,7 @@ index c479b388bd6..fdb09d93238 100644 list_init( &queue->send_result ); list_init( &queue->callback_result ); list_init( &queue->pending_timers ); -@@ -495,13 +497,21 @@ static inline struct msg_queue *get_current_queue(void) +@@ -529,13 +531,21 @@ static inline struct msg_queue *get_current_queue(void) } /* get a (pseudo-)unique id to tag hardware messages */ @@ -132,7 +132,7 @@ index c479b388bd6..fdb09d93238 100644 /* try to merge a message with the last in the list; return 1 if successful */ static int merge_message( struct thread_input *input, const struct message *msg ) { -@@ -779,7 +789,7 @@ static int match_window( user_handle_t win, user_handle_t msg_win ) +@@ -813,7 +823,7 @@ static int match_window( user_handle_t win, user_handle_t msg_win ) } /* retrieve a posted message */ @@ -141,7 +141,7 @@ index c479b388bd6..fdb09d93238 100644 unsigned int first, unsigned int last, unsigned int flags, struct get_message_reply *reply ) { -@@ -790,6 +800,7 @@ static int get_posted_message( struct msg_queue *queue, user_handle_t win, +@@ -824,6 +834,7 @@ static int get_posted_message( struct msg_queue *queue, user_handle_t win, { if (!match_window( win, msg->win )) continue; if (!check_msg_filter( msg->msg, first, last )) continue; @@ -149,7 +149,7 @@ index c479b388bd6..fdb09d93238 100644 goto found; /* found one */ } return 0; -@@ -1387,6 +1398,7 @@ found: +@@ -1439,6 +1450,7 @@ found: msg->msg = WM_HOTKEY; msg->wparam = hotkey->id; msg->lparam = ((hotkey->vkey & 0xffff) << 16) | modifiers; @@ -157,7 +157,7 @@ index c479b388bd6..fdb09d93238 100644 free( msg->data ); msg->data = NULL; -@@ -1992,7 +2004,7 @@ static int get_hardware_message( struct thread *thread, unsigned int hw_id, user +@@ -2061,7 +2073,7 @@ static int get_hardware_message( struct thread *thread, unsigned int hw_id, user continue; } /* now we can return it */ @@ -166,7 +166,7 @@ index c479b388bd6..fdb09d93238 100644 reply->type = MSG_HARDWARE; reply->win = win; reply->msg = msg_code; -@@ -2098,6 +2110,7 @@ void post_message( user_handle_t win, unsigned int message, lparam_t wparam, lpa +@@ -2167,6 +2179,7 @@ void post_message( user_handle_t win, unsigned int message, lparam_t wparam, lpa msg->result = NULL; msg->data = NULL; msg->data_size = 0; @@ -174,7 +174,7 @@ index c479b388bd6..fdb09d93238 100644 get_message_defaults( thread->queue, &msg->x, &msg->y, &msg->time ); -@@ -2342,6 +2355,7 @@ DECL_HANDLER(send_message) +@@ -2411,6 +2424,7 @@ DECL_HANDLER(send_message) set_queue_bits( recv_queue, QS_SENDMESSAGE ); break; case MSG_POSTED: @@ -182,7 +182,7 @@ index c479b388bd6..fdb09d93238 100644 list_add_tail( &recv_queue->msg_list[POST_MESSAGE], &msg->entry ); set_queue_bits( recv_queue, QS_POSTMESSAGE|QS_ALLPOSTMESSAGE ); if (msg->msg == WM_HOTKEY) -@@ -2455,12 +2469,12 @@ DECL_HANDLER(get_message) +@@ -2531,12 +2545,12 @@ DECL_HANDLER(get_message) /* then check for posted messages */ if ((filter & QS_POSTMESSAGE) && @@ -197,7 +197,7 @@ index c479b388bd6..fdb09d93238 100644 return; /* only check for quit messages if not posted messages pending */ -@@ -2471,7 +2485,7 @@ DECL_HANDLER(get_message) +@@ -2547,7 +2561,7 @@ DECL_HANDLER(get_message) if ((filter & QS_INPUT) && filter_contains_hw_range( req->get_first, req->get_last ) && get_hardware_message( current, req->hw_id, get_win, req->get_first, req->get_last, req->flags, reply )) @@ -206,7 +206,7 @@ index c479b388bd6..fdb09d93238 100644 /* now check for WM_PAINT */ if ((filter & QS_PAINT) && -@@ -2484,7 +2498,7 @@ DECL_HANDLER(get_message) +@@ -2560,7 +2574,7 @@ DECL_HANDLER(get_message) reply->wparam = 0; reply->lparam = 0; get_message_defaults( queue, &reply->x, &reply->y, &reply->time ); @@ -215,7 +215,7 @@ index c479b388bd6..fdb09d93238 100644 } /* now check for timer */ -@@ -2500,13 +2514,30 @@ DECL_HANDLER(get_message) +@@ -2576,13 +2590,30 @@ DECL_HANDLER(get_message) get_message_defaults( queue, &reply->x, &reply->y, &reply->time ); if (!(req->flags & PM_NOYIELD) && current->process->idle_event) set_event( current->process->idle_event ); @@ -247,17 +247,17 @@ index c479b388bd6..fdb09d93238 100644 } -@@ -2524,7 +2555,10 @@ DECL_HANDLER(reply_message) +@@ -2600,7 +2631,10 @@ DECL_HANDLER(reply_message) DECL_HANDLER(accept_hardware_message) { if (current->queue) + { - release_hardware_message( current->queue, req->hw_id, req->remove ); -+ if (req->remove) current->queue->ignore_post_msg = 0; + release_hardware_message( current->queue, req->hw_id ); ++ current->queue->ignore_post_msg = 0; + } else set_error( STATUS_ACCESS_DENIED ); } -- -2.11.0 +2.27.0 diff --git a/patches/server-Realtime_Priority/0001-wineserver-Draft-to-implement-priority-levels-throug.patch b/patches/server-Realtime_Priority/0001-wineserver-Draft-to-implement-priority-levels-throug.patch index ea32210e..6c7846b0 100644 --- a/patches/server-Realtime_Priority/0001-wineserver-Draft-to-implement-priority-levels-throug.patch +++ b/patches/server-Realtime_Priority/0001-wineserver-Draft-to-implement-priority-levels-throug.patch @@ -1,4 +1,4 @@ -From 98bc215910ff978093b666607f2cff3f1c93b7d3 Mon Sep 17 00:00:00 2001 +From 13a0529750a14a032bb9ef5af97a48bc4f1aff14 Mon Sep 17 00:00:00 2001 From: Joakim Hernberg Date: Tue, 31 Mar 2015 20:58:20 +0200 Subject: [PATCH] wineserver: Draft to implement priority levels through POSIX @@ -19,7 +19,7 @@ Changes by Sebastian Lackner : create mode 100644 server/scheduler.c diff --git a/server/Makefile.in b/server/Makefile.in -index 3f3761faab6..89c1d8a4cdb 100644 +index e90c5d1336c..9a695cefc30 100644 --- a/server/Makefile.in +++ b/server/Makefile.in @@ -30,6 +30,7 @@ C_SRCS = \ @@ -215,10 +215,10 @@ index 00000000000..4a5d82b208d + +#endif diff --git a/server/thread.c b/server/thread.c -index 23c0538150f..7feda374487 100644 +index 9b14174578e..7280f87012d 100644 --- a/server/thread.c +++ b/server/thread.c -@@ -607,7 +607,10 @@ static void set_thread_info( struct thread *thread, +@@ -608,7 +608,10 @@ static void set_thread_info( struct thread *thread, if ((req->priority >= min && req->priority <= max) || req->priority == THREAD_PRIORITY_IDLE || req->priority == THREAD_PRIORITY_TIME_CRITICAL) @@ -230,12 +230,12 @@ index 23c0538150f..7feda374487 100644 set_error( STATUS_INVALID_PARAMETER ); } diff --git a/server/thread.h b/server/thread.h -index 43b17534693..924f28a8697 100644 +index 650bc44628d..2599f7629c3 100644 --- a/server/thread.h +++ b/server/thread.h -@@ -152,4 +152,9 @@ static inline void set_win32_error( unsigned int err ) { set_error( 0xc0010000 | +@@ -144,4 +144,9 @@ static inline void set_win32_error( unsigned int err ) { set_error( 0xc0010000 | + static inline thread_id_t get_thread_id( struct thread *thread ) { return thread->id; } - static inline timeout_t get_thread_creation_time( struct thread *thread ) { return thread->creation_time; } +/* scheduler functions */ + diff --git a/patches/server-Realtime_Priority/definition b/patches/server-Realtime_Priority/definition index de7045a9..a8e417cd 100644 --- a/patches/server-Realtime_Priority/definition +++ b/patches/server-Realtime_Priority/definition @@ -1,2 +1 @@ Fixes: Support for linux priority levels for faster performance -Depends: ntdll-ThreadTime diff --git a/patches/server-Signal_Thread/0001-server-Do-not-signal-thread-until-it-is-really-gone.patch b/patches/server-Signal_Thread/0001-server-Do-not-signal-thread-until-it-is-really-gone.patch index dbac4400..ad9665b3 100644 --- a/patches/server-Signal_Thread/0001-server-Do-not-signal-thread-until-it-is-really-gone.patch +++ b/patches/server-Signal_Thread/0001-server-Do-not-signal-thread-until-it-is-really-gone.patch @@ -1,4 +1,4 @@ -From a2401a21b78201f2310d571f8d66ac574dd0d830 Mon Sep 17 00:00:00 2001 +From d05ac476a0ca682ecb7ae13aa9e578c94b71e3f8 Mon Sep 17 00:00:00 2001 From: Sebastian Lackner Date: Mon, 12 Nov 2018 18:10:32 +0200 Subject: [PATCH] server: Do not signal violently terminated threads until they @@ -27,10 +27,10 @@ Signed-off-by: Gabriel Ivăncescu 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/server/thread.c b/server/thread.c -index 1c0fbd4179b..f8962221d9a 100644 +index 9b14174578e..2f32cb4b62e 100644 --- a/server/thread.c +++ b/server/thread.c -@@ -203,6 +203,7 @@ static inline void init_thread_structure( struct thread *thread ) +@@ -239,6 +239,7 @@ static inline void init_thread_structure( struct thread *thread ) thread->token = NULL; thread->desc = NULL; thread->desc_len = 0; @@ -38,7 +38,7 @@ index 1c0fbd4179b..f8962221d9a 100644 thread->creation_time = current_time; thread->exit_time = 0; -@@ -361,6 +362,7 @@ static void destroy_thread( struct object *obj ) +@@ -430,6 +431,7 @@ static void destroy_thread( struct object *obj ) list_remove( &thread->entry ); cleanup_thread( thread ); release_object( thread->process ); @@ -46,7 +46,7 @@ index 1c0fbd4179b..f8962221d9a 100644 if (thread->id) free_ptid( thread->id ); if (thread->token) release_object( thread->token ); } -@@ -385,7 +387,7 @@ static struct object_type *thread_get_type( struct object *obj ) +@@ -454,7 +456,7 @@ static struct object_type *thread_get_type( struct object *obj ) static int thread_signaled( struct object *obj, struct wait_queue_entry *entry ) { struct thread *mythread = (struct thread *)obj; @@ -55,7 +55,7 @@ index 1c0fbd4179b..f8962221d9a 100644 } static unsigned int thread_map_access( struct object *obj, unsigned int access ) -@@ -1171,6 +1173,26 @@ int thread_get_inflight_fd( struct thread *thread, int client ) +@@ -1245,6 +1247,26 @@ int thread_get_inflight_fd( struct thread *thread, int client ) return -1; } @@ -82,7 +82,7 @@ index 1c0fbd4179b..f8962221d9a 100644 /* kill a thread on the spot */ void kill_thread( struct thread *thread, int violent_death ) { -@@ -1191,8 +1213,12 @@ void kill_thread( struct thread *thread, int violent_death ) +@@ -1265,8 +1287,12 @@ void kill_thread( struct thread *thread, int violent_death ) kill_console_processes( thread, 0 ); debug_exit_thread( thread ); abandon_mutexes( thread ); @@ -98,17 +98,17 @@ index 1c0fbd4179b..f8962221d9a 100644 remove_process_thread( thread->process, thread ); release_object( thread ); diff --git a/server/thread.h b/server/thread.h -index 7957557b6cc..880419c5924 100644 +index 650bc44628d..668cc4ebd79 100644 --- a/server/thread.h +++ b/server/thread.h -@@ -90,6 +90,7 @@ struct thread +@@ -91,6 +91,7 @@ struct thread struct list kernel_object; /* list of kernel object pointers */ data_size_t desc_len; /* thread description length in bytes */ WCHAR *desc; /* thread description string */ + struct timeout_user *exit_poll; /* poll if the thread/process has exited already */ }; - struct thread_snapshot + extern struct thread *current; -- -2.24.0 +2.27.0 diff --git a/patches/user32-rawinput-hid/0004-server-Add-HID-input-message-type-to-send_hardware_m.patch b/patches/user32-rawinput-hid/0004-server-Add-HID-input-message-type-to-send_hardware_m.patch index 0acae971..a488a754 100644 --- a/patches/user32-rawinput-hid/0004-server-Add-HID-input-message-type-to-send_hardware_m.patch +++ b/patches/user32-rawinput-hid/0004-server-Add-HID-input-message-type-to-send_hardware_m.patch @@ -1,4 +1,4 @@ -From 2c92d595325accce44db85552efda8070f526569 Mon Sep 17 00:00:00 2001 +From f836f939423f02291ba1ee175542f195ec6eb182 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Bernon?= Date: Mon, 11 Nov 2019 18:35:18 +0100 Subject: [PATCH] server: Add HID input message type to send_hardware_message @@ -14,7 +14,7 @@ Subject: [PATCH] server: Add HID input message type to send_hardware_message 6 files changed, 143 insertions(+), 17 deletions(-) diff --git a/dlls/user32/message.c b/dlls/user32/message.c -index c5c7db667cf..bb7c79b9b2c 100644 +index aadec28b559..a6e0b3cf94d 100644 --- a/dlls/user32/message.c +++ b/dlls/user32/message.c @@ -3244,10 +3244,10 @@ NTSTATUS send_hardware_message( HWND hwnd, const INPUT *input, UINT flags ) @@ -46,7 +46,7 @@ index c5c7db667cf..bb7c79b9b2c 100644 req->input.hw.lparam = MAKELONG( input->u.hi.wParamL, input->u.hi.wParamH ); break; diff --git a/dlls/user32/rawinput.c b/dlls/user32/rawinput.c -index 43da5248faf..90dc911397d 100644 +index bcdb70bdb81..4914c67c98b 100644 --- a/dlls/user32/rawinput.c +++ b/dlls/user32/rawinput.c @@ -47,6 +47,7 @@ struct device @@ -110,7 +110,7 @@ index 43da5248faf..90dc911397d 100644 static void find_devices(void) { static ULONGLONG last_check; -@@ -325,6 +361,22 @@ BOOL rawinput_from_hardware_message(RAWINPUT *rawinput, const struct hardware_ms +@@ -327,6 +363,22 @@ BOOL rawinput_from_hardware_message(RAWINPUT *rawinput, const struct hardware_ms rawinput->data.keyboard.Message = msg_data->rawinput.kbd.message; rawinput->data.keyboard.ExtraInformation = msg_data->info; } @@ -133,16 +133,16 @@ index 43da5248faf..90dc911397d 100644 else { FIXME("Unhandled rawinput type %#x.\n", msg_data->rawinput.type); -@@ -514,7 +566,7 @@ UINT WINAPI DECLSPEC_HOTPATCH GetRawInputBuffer(RAWINPUT *data, UINT *data_size, - { +@@ -525,7 +577,7 @@ UINT WINAPI DECLSPEC_HOTPATCH GetRawInputBuffer(RAWINPUT *data, UINT *data_size, struct hardware_msg_data *msg_data; + struct rawinput_thread_data *thread_data; RAWINPUT *rawinput; - UINT count = 0, rawinput_size, next_size, overhead; + UINT count = 0, rawinput_size, msg_size, next_size, overhead; BOOL is_wow64; int i; -@@ -572,7 +624,10 @@ UINT WINAPI DECLSPEC_HOTPATCH GetRawInputBuffer(RAWINPUT *data, UINT *data_size, +@@ -585,7 +637,10 @@ UINT WINAPI DECLSPEC_HOTPATCH GetRawInputBuffer(RAWINPUT *data, UINT *data_size, data->header.dwSize - sizeof(RAWINPUTHEADER)); data->header.dwSize += overhead; data = NEXTRAWINPUTBLOCK(data); @@ -154,7 +154,7 @@ index 43da5248faf..90dc911397d 100644 } if (count == 0 && next_size == 0) *data_size = 0; -@@ -647,6 +702,7 @@ UINT WINAPI GetRawInputDeviceInfoW(HANDLE handle, UINT command, void *data, UINT +@@ -660,6 +715,7 @@ UINT WINAPI GetRawInputDeviceInfoW(HANDLE handle, UINT command, void *data, UINT handle, command, data, data_size); if (!data_size) return ~0U; @@ -163,10 +163,10 @@ index 43da5248faf..90dc911397d 100644 /* each case below must set: * *data_size: length (meaning defined by command) of data we want to copy diff --git a/dlls/user32/user_private.h b/dlls/user32/user_private.h -index eb828203597..6592927cfae 100644 +index 8fa54b9229a..460f3aa1c3e 100644 --- a/dlls/user32/user_private.h +++ b/dlls/user32/user_private.h -@@ -380,4 +380,6 @@ static inline WCHAR *heap_strdupW(const WCHAR *src) +@@ -386,4 +386,6 @@ static inline WCHAR *heap_strdupW(const WCHAR *src) return dst; } @@ -174,7 +174,7 @@ index eb828203597..6592927cfae 100644 + #endif /* __WINE_USER_PRIVATE_H */ diff --git a/server/protocol.def b/server/protocol.def -index 21de849e5d8..d49c33f63f9 100644 +index 521e2a78fa9..651e6423e82 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -312,6 +312,13 @@ struct hardware_msg_data @@ -234,7 +234,7 @@ index 21de849e5d8..d49c33f63f9 100644 typedef union { -@@ -2330,6 +2349,7 @@ enum message_type +@@ -2301,6 +2320,7 @@ enum message_type user_handle_t win; /* window handle */ hw_input_t input; /* input data */ unsigned int flags; /* flags (see below) */ @@ -243,10 +243,10 @@ index 21de849e5d8..d49c33f63f9 100644 int wait; /* do we need to wait for a reply? */ int prev_x; /* previous cursor position */ diff --git a/server/queue.c b/server/queue.c -index 59c6cbb6921..fbed47d6951 100644 +index 3ad376b776b..baf19fa17a6 100644 --- a/server/queue.c +++ b/server/queue.c -@@ -1594,7 +1594,7 @@ static int send_hook_ll_message( struct desktop *desktop, struct message *hardwa +@@ -1588,7 +1588,7 @@ static int send_hook_ll_message( struct desktop *desktop, struct message *hardwa struct msg_queue *queue; struct message *msg; timeout_t timeout = 2000 * -10000; /* FIXME: load from registry */ @@ -255,7 +255,7 @@ index 59c6cbb6921..fbed47d6951 100644 if (!(hook_thread = get_first_global_hook( id ))) return 0; if (!(queue = hook_thread->queue)) return 0; -@@ -1612,7 +1612,7 @@ static int send_hook_ll_message( struct desktop *desktop, struct message *hardwa +@@ -1606,7 +1606,7 @@ static int send_hook_ll_message( struct desktop *desktop, struct message *hardwa msg->data_size = hardware_msg->data_size; msg->result = NULL; @@ -264,7 +264,7 @@ index 59c6cbb6921..fbed47d6951 100644 { unsigned short vkey = input->kbd.vkey; if (input->kbd.flags & KEYEVENTF_UNICODE) vkey = VK_PACKET; -@@ -1648,6 +1648,8 @@ struct rawinput_message +@@ -1642,6 +1642,8 @@ struct rawinput_message struct desktop *desktop; struct hw_msg_source source; unsigned int time; @@ -273,7 +273,7 @@ index 59c6cbb6921..fbed47d6951 100644 struct hardware_msg_data data; const void *extra; data_size_t extra_len; -@@ -1657,6 +1659,7 @@ struct rawinput_message +@@ -1651,6 +1653,7 @@ struct rawinput_message static int queue_rawinput_message( struct process* process, void *arg ) { const struct rawinput_message* raw_msg = arg; @@ -281,7 +281,7 @@ index 59c6cbb6921..fbed47d6951 100644 const struct rawinput_device *device = NULL; struct desktop *target_desktop = NULL, *desktop = NULL; struct thread *target_thread = NULL, *foreground = NULL; -@@ -1668,6 +1671,8 @@ static int queue_rawinput_message( struct process* process, void *arg ) +@@ -1662,6 +1665,8 @@ static int queue_rawinput_message( struct process* process, void *arg ) device = process->rawinput_mouse; else if (raw_msg->data.rawinput.type == RIM_TYPEKEYBOARD) device = process->rawinput_kbd; @@ -290,7 +290,7 @@ index 59c6cbb6921..fbed47d6951 100644 if (!device) return 0; if (raw_msg->desktop) desktop = (struct desktop *)grab_object( raw_msg->desktop ); -@@ -1986,6 +1991,37 @@ static void queue_custom_hardware_message( struct desktop *desktop, user_handle_ +@@ -1980,6 +1985,37 @@ static void queue_custom_hardware_message( struct desktop *desktop, user_handle_ queue_hardware_message( desktop, msg, 1 ); } @@ -328,7 +328,7 @@ index 59c6cbb6921..fbed47d6951 100644 /* check message filter for a hardware message */ static int check_hw_message_filter( user_handle_t win, unsigned int msg_code, user_handle_t filter_win, unsigned int first, unsigned int last ) -@@ -2491,15 +2527,18 @@ DECL_HANDLER(send_hardware_message) +@@ -2485,15 +2521,18 @@ DECL_HANDLER(send_hardware_message) switch (req->input.type) { @@ -350,7 +350,7 @@ index 59c6cbb6921..fbed47d6951 100644 default: set_error( STATUS_INVALID_PARAMETER ); } -@@ -3271,20 +3310,23 @@ DECL_HANDLER(get_rawinput_buffer) +@@ -3265,20 +3304,23 @@ DECL_HANDLER(get_rawinput_buffer) { struct message *msg = LIST_ENTRY( ptr, struct message, entry ); struct hardware_msg_data *data = msg->data; @@ -378,7 +378,7 @@ index 59c6cbb6921..fbed47d6951 100644 } diff --git a/server/trace.c b/server/trace.c -index 2fb5afd5ef1..bbf129ca4f1 100644 +index dfb39300668..3d2fc875176 100644 --- a/server/trace.c +++ b/server/trace.c @@ -386,24 +386,28 @@ static void dump_hw_input( const char *prefix, const hw_input_t *input ) diff --git a/patches/winebuild-Fake_Dlls/0004-winebuild-Use-multipass-label-system-to-generate-fak.patch b/patches/winebuild-Fake_Dlls/0004-winebuild-Use-multipass-label-system-to-generate-fak.patch deleted file mode 100644 index d4813799..00000000 --- a/patches/winebuild-Fake_Dlls/0004-winebuild-Use-multipass-label-system-to-generate-fak.patch +++ /dev/null @@ -1,430 +0,0 @@ -From 344eb39bdfee74d4d826fa2f61a95736f0ee9823 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michael=20M=C3=BCller?= -Date: Mon, 15 May 2017 02:05:49 +0200 -Subject: [PATCH] winebuild: Use multipass label system to generate fake dlls. - ---- - tools/winebuild/build.h | 6 ++ - tools/winebuild/res32.c | 1 - - tools/winebuild/spec32.c | 145 ++++++++++++++++++++++----------------- - tools/winebuild/utils.c | 92 +++++++++++++++++++++++++ - 4 files changed, 181 insertions(+), 63 deletions(-) - -diff --git a/tools/winebuild/build.h b/tools/winebuild/build.h -index 55d5b0b9dc28..8930df408d3b 100644 ---- a/tools/winebuild/build.h -+++ b/tools/winebuild/build.h -@@ -343,6 +343,7 @@ extern size_t input_buffer_pos; - extern size_t input_buffer_size; - extern unsigned char *output_buffer; - extern size_t output_buffer_pos; -+extern size_t output_buffer_rva; - extern size_t output_buffer_size; - - extern void init_input_buffer( const char *file ); -@@ -358,6 +359,11 @@ extern void put_dword( unsigned int val ); - extern void put_qword( unsigned int val ); - extern void put_pword( unsigned int val ); - extern void align_output( unsigned int align ); -+extern void align_output_rva( unsigned int file_align, unsigned int rva_align ); -+extern size_t label_pos( const char *name ); -+extern size_t label_rva( const char *name ); -+extern size_t label_rva_align( const char *name ); -+extern void put_label( const char *name ); - - /* global variables */ - -diff --git a/tools/winebuild/res32.c b/tools/winebuild/res32.c -index bd55bb2fa5c4..d9329019f8a3 100644 ---- a/tools/winebuild/res32.c -+++ b/tools/winebuild/res32.c -@@ -539,7 +539,6 @@ void output_bin_resources( DLLSPEC *spec, unsigned int start_rva ) - if (!spec->nb_resources) return; - - tree = build_resource_tree( spec, &data_offset ); -- init_output_buffer(); - - /* output the resource directories */ - -diff --git a/tools/winebuild/spec32.c b/tools/winebuild/spec32.c -index 22dd399cb2b4..c38f1fe663c7 100644 ---- a/tools/winebuild/spec32.c -+++ b/tools/winebuild/spec32.c -@@ -844,11 +844,11 @@ void output_spec32_file( DLLSPEC *spec ) - - - /******************************************************************* -- * output_fake_module -+ * output_fake_module_pass - * -- * Build a fake binary module from a spec file. -+ * Helper to create a fake binary module from a spec file. - */ --void output_fake_module( DLLSPEC *spec ) -+static void output_fake_module_pass( DLLSPEC *spec ) - { - static const unsigned char dll_code_section[] = { 0x31, 0xc0, /* xor %eax,%eax */ - 0xc2, 0x0c, 0x00 }; /* ret $12 */ -@@ -860,21 +860,8 @@ void output_fake_module( DLLSPEC *spec ) - const unsigned int section_align = page_size; - const unsigned int file_align = 0x200; - const unsigned int reloc_size = 8; -- const unsigned int lfanew = 0x40 + sizeof(fakedll_signature); -+ const unsigned int lfanew = (0x40 + sizeof(fakedll_signature) + 15) & ~15; - const unsigned int nb_sections = 2 + (spec->nb_resources != 0); -- const unsigned int text_size = (spec->characteristics & IMAGE_FILE_DLL) ? -- sizeof(dll_code_section) : sizeof(exe_code_section); -- unsigned char *resources; -- unsigned int resources_size; -- unsigned int image_size = 3 * section_align; -- -- resolve_imports( spec ); -- output_bin_resources( spec, 3 * section_align ); -- resources = output_buffer; -- resources_size = output_buffer_pos; -- if (resources_size) image_size += (resources_size + section_align - 1) & ~(section_align - 1); -- -- init_output_buffer(); - - put_word( 0x5a4d ); /* e_magic */ - put_word( 0x40 ); /* e_cblp */ -@@ -902,6 +889,7 @@ void output_fake_module( DLLSPEC *spec ) - put_dword( lfanew ); - - put_data( fakedll_signature, sizeof(fakedll_signature) ); -+ align_output_rva( 16, 16 ); - - put_dword( 0x4550 ); /* Signature */ - switch(target_cpu) -@@ -925,11 +913,11 @@ void output_fake_module( DLLSPEC *spec ) - IMAGE_NT_OPTIONAL_HDR32_MAGIC ); /* Magic */ - put_byte( 7 ); /* MajorLinkerVersion */ - put_byte( 10 ); /* MinorLinkerVersion */ -- put_dword( text_size ); /* SizeOfCode */ -+ put_dword( label_pos("text_end") - label_pos("text_start") ); /* SizeOfCode */ - put_dword( 0 ); /* SizeOfInitializedData */ - put_dword( 0 ); /* SizeOfUninitializedData */ -- put_dword( section_align ); /* AddressOfEntryPoint */ -- put_dword( section_align ); /* BaseOfCode */ -+ put_dword( label_rva("entrypoint") ); /* AddressOfEntryPoint */ -+ put_dword( label_rva("text_start") ); /* BaseOfCode */ - if (get_ptr_size() == 4) put_dword( 0 ); /* BaseOfData */ - put_pword( 0x10000000 ); /* ImageBase */ - put_dword( section_align ); /* SectionAlignment */ -@@ -941,8 +929,8 @@ void output_fake_module( DLLSPEC *spec ) - put_word( spec->subsystem_major ); /* MajorSubsystemVersion */ - put_word( spec->subsystem_minor ); /* MinorSubsystemVersion */ - put_dword( 0 ); /* Win32VersionValue */ -- put_dword( image_size ); /* SizeOfImage */ -- put_dword( file_align ); /* SizeOfHeaders */ -+ put_dword( label_rva_align("file_end") ); /* SizeOfImage */ -+ put_dword( label_pos("header_end") ); /* SizeOfHeaders */ - put_dword( 0 ); /* CheckSum */ - put_word( spec->subsystem ); /* Subsystem */ - put_word( spec->dll_characteristics ); /* DllCharacteristics */ -@@ -955,10 +943,10 @@ void output_fake_module( DLLSPEC *spec ) - - put_dword( 0 ); put_dword( 0 ); /* DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT] */ - put_dword( 0 ); put_dword( 0 ); /* DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT] */ -- if (resources_size) /* DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE] */ -+ if (spec->nb_resources) /* DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE] */ - { -- put_dword( 3 * section_align ); -- put_dword( resources_size ); -+ put_dword( label_rva("res_start") ); -+ put_dword( label_pos("res_end") - label_pos("res_start") ); - } - else - { -@@ -968,8 +956,8 @@ void output_fake_module( DLLSPEC *spec ) - - put_dword( 0 ); put_dword( 0 ); /* DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION] */ - put_dword( 0 ); put_dword( 0 ); /* DataDirectory[IMAGE_DIRECTORY_ENTRY_SECURITY] */ -- put_dword( 2 * section_align ); /* DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC] */ -- put_dword( reloc_size ); -+ put_dword( label_rva("reloc_start") ); /* DataDirectory[IMAGE_DIRECTORY_ENTRY_BASERELOC] */ -+ put_dword( label_pos("reloc_end") - label_pos("reloc_start") ); - put_dword( 0 ); put_dword( 0 ); /* DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG] */ - put_dword( 0 ); put_dword( 0 ); /* DataDirectory[IMAGE_DIRECTORY_ENTRY_COPYRIGHT] */ - put_dword( 0 ); put_dword( 0 ); /* DataDirectory[IMAGE_DIRECTORY_ENTRY_GLOBALPTR] */ -@@ -982,62 +970,95 @@ void output_fake_module( DLLSPEC *spec ) - put_dword( 0 ); put_dword( 0 ); /* DataDirectory[15] */ - - /* .text section */ -- put_data( ".text\0\0", 8 ); /* Name */ -- put_dword( section_align ); /* VirtualSize */ -- put_dword( section_align ); /* VirtualAddress */ -- put_dword( text_size ); /* SizeOfRawData */ -- put_dword( file_align ); /* PointerToRawData */ -- put_dword( 0 ); /* PointerToRelocations */ -- put_dword( 0 ); /* PointerToLinenumbers */ -- put_word( 0 ); /* NumberOfRelocations */ -- put_word( 0 ); /* NumberOfLinenumbers */ -- put_dword( 0x60000020 /* CNT_CODE|MEM_EXECUTE|MEM_READ */ ); /* Characteristics */ -+ put_data( ".text\0\0", 8 ); /* Name */ -+ put_dword( label_rva_align("text_end") - label_rva("text_start") ); /* VirtualSize */ -+ put_dword( label_rva("text_start") ); /* VirtualAddress */ -+ put_dword( label_pos("text_end") - label_pos("text_start") ); /* SizeOfRawData */ -+ put_dword( label_pos("text_start") ); /* PointerToRawData */ -+ put_dword( 0 ); /* PointerToRelocations */ -+ put_dword( 0 ); /* PointerToLinenumbers */ -+ put_word( 0 ); /* NumberOfRelocations */ -+ put_word( 0 ); /* NumberOfLinenumbers */ -+ put_dword( 0x60000020 /* CNT_CODE|MEM_EXECUTE|MEM_READ */ ); /* Characteristics */ - - /* .reloc section */ -- put_data( ".reloc\0", 8 ); /* Name */ -- put_dword( section_align ); /* VirtualSize */ -- put_dword( 2 * section_align );/* VirtualAddress */ -- put_dword( reloc_size ); /* SizeOfRawData */ -- put_dword( 2 * file_align ); /* PointerToRawData */ -- put_dword( 0 ); /* PointerToRelocations */ -- put_dword( 0 ); /* PointerToLinenumbers */ -- put_word( 0 ); /* NumberOfRelocations */ -- put_word( 0 ); /* NumberOfLinenumbers */ -+ put_data( ".reloc\0", 8 ); /* Name */ -+ put_dword( label_rva_align("reloc_end") - label_rva("reloc_start") ); /* VirtualSize */ -+ put_dword( label_rva("reloc_start") ); /* VirtualAddress */ -+ put_dword( label_pos("reloc_end") - label_pos("reloc_start") ); /* SizeOfRawData */ -+ put_dword( label_pos("reloc_start") ); /* PointerToRawData */ -+ put_dword( 0 ); /* PointerToRelocations */ -+ put_dword( 0 ); /* PointerToLinenumbers */ -+ put_word( 0 ); /* NumberOfRelocations */ -+ put_word( 0 ); /* NumberOfLinenumbers */ - put_dword( 0x42000040 /* CNT_INITIALIZED_DATA|MEM_DISCARDABLE|MEM_READ */ ); /* Characteristics */ - - /* .rsrc section */ -- if (resources_size) -+ if (spec->nb_resources) - { -- put_data( ".rsrc\0\0", 8 ); /* Name */ -- put_dword( (resources_size + section_align - 1) & ~(section_align - 1) ); /* VirtualSize */ -- put_dword( 3 * section_align );/* VirtualAddress */ -- put_dword( resources_size ); /* SizeOfRawData */ -- put_dword( 3 * file_align ); /* PointerToRawData */ -- put_dword( 0 ); /* PointerToRelocations */ -- put_dword( 0 ); /* PointerToLinenumbers */ -- put_word( 0 ); /* NumberOfRelocations */ -- put_word( 0 ); /* NumberOfLinenumbers */ -- put_dword( 0x40000040 /* CNT_INITIALIZED_DATA|MEM_READ */ ); /* Characteristics */ -+ put_data( ".rsrc\0\0", 8 ); /* Name */ -+ put_dword( label_rva_align("res_end") - label_rva("res_start") ); /* VirtualSize */ -+ put_dword( label_rva("res_start") ); /* VirtualAddress */ -+ put_dword( label_pos("res_end") - label_pos("res_start") ); /* SizeOfRawData */ -+ put_dword( label_pos("res_start") ); /* PointerToRawData */ -+ put_dword( 0 ); /* PointerToRelocations */ -+ put_dword( 0 ); /* PointerToLinenumbers */ -+ put_word( 0 ); /* NumberOfRelocations */ -+ put_word( 0 ); /* NumberOfLinenumbers */ -+ put_dword( 0x40000040 /* CNT_INITIALIZED_DATA|MEM_READ */ ); /* Characteristics */ - } - -+ align_output_rva( file_align, file_align ); -+ put_label( "header_end" ); -+ - /* .text contents */ -- align_output( file_align ); -+ align_output_rva( file_align, section_align ); -+ put_label( "text_start" ); -+ put_label( "entrypoint" ); - if (spec->characteristics & IMAGE_FILE_DLL) - put_data( dll_code_section, sizeof(dll_code_section) ); - else - put_data( exe_code_section, sizeof(exe_code_section) ); -+ put_label( "text_end" ); - - /* .reloc contents */ -- align_output( file_align ); -+ align_output_rva( file_align, section_align ); -+ put_label( "reloc_start" ); - put_dword( 0 ); /* VirtualAddress */ - put_dword( 0 ); /* SizeOfBlock */ -+ put_label( "reloc_end" ); - - /* .rsrc contents */ -- if (resources_size) -+ if (spec->nb_resources) - { -- align_output( file_align ); -- put_data( resources, resources_size ); -+ align_output_rva( file_align, section_align ); -+ put_label( "res_start" ); -+ output_bin_resources( spec, label_rva("res_start") ); -+ put_label( "res_end" ); - } -+ -+ put_label( "file_end" ); -+} -+ -+ -+/******************************************************************* -+ * output_fake_module -+ * -+ * Build a fake binary module from a spec file. -+ */ -+void output_fake_module( DLLSPEC *spec ) -+{ -+ resolve_imports( spec ); -+ -+ /* First pass */ -+ init_output_buffer(); -+ output_fake_module_pass( spec ); -+ -+ /* Second pass */ -+ output_buffer_pos = 0; -+ output_buffer_rva = 0; -+ output_fake_module_pass( spec ); -+ - flush_output_buffer(); - } - -diff --git a/tools/winebuild/utils.c b/tools/winebuild/utils.c -index 07a579004adc..80dec6db29ea 100644 ---- a/tools/winebuild/utils.c -+++ b/tools/winebuild/utils.c -@@ -34,6 +34,7 @@ - # include - #endif - -+#include "wine/list.h" - #include "build.h" - - #if defined(_WIN32) && !defined(__CYGWIN__) -@@ -542,8 +543,86 @@ size_t input_buffer_pos; - size_t input_buffer_size; - unsigned char *output_buffer; - size_t output_buffer_pos; -+size_t output_buffer_rva; - size_t output_buffer_size; - -+struct label -+{ -+ struct list entry; -+ const char *name; -+ size_t pos; -+ size_t rva; -+}; -+ -+static struct list labels = LIST_INIT( labels ); -+ -+struct label *get_label( const char *name ) -+{ -+ struct label *label; -+ -+ LIST_FOR_EACH_ENTRY( label, &labels, struct label, entry ) -+ { -+ if (!strcmp(name, label->name)) -+ return label; -+ } -+ -+ label = xmalloc( sizeof(*label) ); -+ label->name = name; -+ label->pos = 0; -+ label->rva = 0; -+ -+ list_add_tail( &labels, &label->entry ); -+ -+ return label; -+} -+ -+size_t label_pos( const char *name ) -+{ -+ struct label *label = get_label( name ); -+ return label->pos; -+} -+ -+size_t label_rva( const char *name ) -+{ -+ struct label *label = get_label( name ); -+ return label->rva; -+} -+ -+size_t label_rva_align( const char *name ) -+{ -+ const unsigned int page_size = get_page_size(); -+ size_t rva = label_rva( name ); -+ size_t size = page_size - (rva % page_size); -+ -+ if (size != page_size) rva += size; -+ return rva; -+} -+ -+void put_label( const char *name ) -+{ -+ struct label *label = get_label( name ); -+ -+ if (label->pos || label->rva) -+ { -+ assert( label->pos == output_buffer_pos ); -+ assert( label->rva == output_buffer_rva ); -+ } -+ -+ label->pos = output_buffer_pos; -+ label->rva = output_buffer_rva; -+} -+ -+void free_labels( void ) -+{ -+ struct label *label, *label2; -+ -+ LIST_FOR_EACH_ENTRY_SAFE( label, label2, &labels, struct label, entry ) -+ { -+ list_remove( &label->entry ); -+ free( label ); -+ } -+} -+ - static void check_output_buffer_space( size_t size ) - { - if (output_buffer_pos + size >= output_buffer_size) -@@ -575,7 +654,9 @@ void init_output_buffer(void) - { - output_buffer_size = 1024; - output_buffer_pos = 0; -+ output_buffer_rva = 0; - output_buffer = xmalloc( output_buffer_size ); -+ free_labels(); - } - - void flush_output_buffer(void) -@@ -585,6 +666,7 @@ void flush_output_buffer(void) - fatal_error( "Error writing to %s\n", output_file_name ); - close_output_file(); - free( output_buffer ); -+ free_labels(); - } - - unsigned char get_byte(void) -@@ -624,12 +706,14 @@ void put_data( const void *data, size_t size ) - check_output_buffer_space( size ); - memcpy( output_buffer + output_buffer_pos, data, size ); - output_buffer_pos += size; -+ output_buffer_rva += size; - } - - void put_byte( unsigned char val ) - { - check_output_buffer_space( 1 ); - output_buffer[output_buffer_pos++] = val; -+ output_buffer_rva++; - } - - void put_word( unsigned short val ) -@@ -676,6 +760,14 @@ void align_output( unsigned int align ) - output_buffer_pos += size; - } - -+void align_output_rva( unsigned int file_align, unsigned int rva_align ) -+{ -+ size_t size = rva_align - (output_buffer_rva % rva_align); -+ -+ if (size != rva_align) output_buffer_rva += size; -+ align_output( file_align ); -+} -+ - /* output a standard header for generated files */ - void output_standard_file_header(void) - { --- -2.26.2 - diff --git a/patches/winebuild-Fake_Dlls/0005-winebuild-Add-stub-functions-in-fake-dlls.patch b/patches/winebuild-Fake_Dlls/0005-winebuild-Add-stub-functions-in-fake-dlls.patch deleted file mode 100644 index ddd580f1..00000000 --- a/patches/winebuild-Fake_Dlls/0005-winebuild-Add-stub-functions-in-fake-dlls.patch +++ /dev/null @@ -1,469 +0,0 @@ -From 56e581b1709c2def25db836cc8126c0eabfb11e7 Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michael=20M=C3=BCller?= -Date: Mon, 15 May 2017 16:27:56 +0200 -Subject: [PATCH] winebuild: Add stub functions in fake dlls. - ---- - dlls/kernel32/tests/loader.c | 8 +- - dlls/ntdll/loader.c | 2 + - dlls/ntdll/thread.c | 35 ++++++ - include/winternl.h | 2 +- - tools/winebuild/build.h | 1 + - tools/winebuild/spec32.c | 209 +++++++++++++++++++++++++++++++++-- - tools/winebuild/utils.c | 10 +- - 7 files changed, 252 insertions(+), 15 deletions(-) - -diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c -index 984246681cb..78100205c9d 100644 ---- a/dlls/kernel32/tests/loader.c -+++ b/dlls/kernel32/tests/loader.c -@@ -1594,9 +1594,7 @@ static void test_FakeDLL(void) - ok(ptr != NULL, "MapViewOfFile failed with error %u\n", GetLastError()); - - dir = RtlImageDirectoryEntryToData(ptr, TRUE, IMAGE_DIRECTORY_ENTRY_EXPORT, &size); --todo_wine - ok(dir != NULL, "RtlImageDirectoryEntryToData failed\n"); -- if (dir == NULL) goto done; - - names = RVAToAddr(dir->AddressOfNames, ptr); - ordinals = RVAToAddr(dir->AddressOfNameOrdinals, ptr); -@@ -1625,17 +1623,20 @@ todo_wine - /* check position in memory */ - dll_rva = (DWORD_PTR)dll_func - (DWORD_PTR)module; - map_rva = funcs[ordinals[i]]; -+ todo_wine - ok(map_rva == dll_rva, "%s: Rva of mapped function (0x%x) does not match dll (0x%x)\n", - func_name, dll_rva, map_rva); - - /* check position in file */ - map_offset = (DWORD_PTR)RtlImageRvaToVa(RtlImageNtHeader(ptr), ptr, map_rva, NULL) - (DWORD_PTR)ptr; - dll_offset = (DWORD_PTR)RtlImageRvaToVa(RtlImageNtHeader(module), module, dll_rva, NULL) - (DWORD_PTR)module; -+ todo_wine - ok(map_offset == dll_offset, "%s: File offset of mapped function (0x%x) does not match dll (0x%x)\n", - func_name, map_offset, dll_offset); - - /* check function content */ - map_func = RVAToAddr(map_rva, ptr); -+ todo_wine - ok(!memcmp(map_func, dll_func, 0x20), "%s: Function content does not match!\n", func_name); - - if (!strcmp(func_name, "NtSetEvent")) -@@ -1649,10 +1650,11 @@ todo_wine - ok(event != NULL, "CreateEvent failed with error %u\n", GetLastError()); - pNtSetEvent(event, 0); - ok(WaitForSingleObject(event, 0) == WAIT_OBJECT_0, "Event was not signaled\n"); -+ pNtSetEvent(event, 0); -+ ok(WaitForSingleObject(event, 0) == WAIT_OBJECT_0, "Event was not signaled\n"); - CloseHandle(event); - } - --done: - UnmapViewOfFile(ptr); - CloseHandle(map); - CloseHandle(file); -diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c -index 339b54a9e67..995dcd48786 100644 ---- a/dlls/ntdll/loader.c -+++ b/dlls/ntdll/loader.c -@@ -3388,6 +3388,7 @@ PIMAGE_NT_HEADERS WINAPI RtlImageNtHeader(HMODULE hModule) - } - - extern void DECLSPEC_NORETURN __wine_syscall_dispatcher( void ); -+extern void *WINAPI __wine_fakedll_dispatcher( const char *module, ULONG ord ); - - /****************************************************************** - * LdrInitializeThunk (NTDLL.@) -@@ -3405,6 +3406,7 @@ void WINAPI LdrInitializeThunk( CONTEXT *context, void **entry, ULONG_PTR unknow - LPCWSTR load_path = NtCurrentTeb()->Peb->ProcessParameters->DllPath.Buffer; - - NtCurrentTeb()->WOW32Reserved = __wine_syscall_dispatcher; -+ NtCurrentTeb()->Spare2 = (ULONG_PTR)__wine_fakedll_dispatcher; - - if (process_detaching) return; - -diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c -index 3f84beb8f26..0eb7d901c4d 100644 ---- a/dlls/ntdll/thread.c -+++ b/dlls/ntdll/thread.c -@@ -36,6 +36,7 @@ - #include "ddk/wdm.h" - #include "wine/exception.h" - -+WINE_DEFAULT_DEBUG_CHANNEL(thread); - WINE_DECLARE_DEBUG_CHANNEL(relay); - - struct _KUSER_SHARED_DATA *user_shared_data = (void *)0x7ffe0000; -@@ -104,6 +105,39 @@ void __wine_syscall_dispatcher( void ) - } - #endif - -+void *WINAPI __wine_fakedll_dispatcher( const char *module, ULONG ord ) -+{ -+ UNICODE_STRING name; -+ NTSTATUS status; -+ HMODULE base; -+ WCHAR *moduleW; -+ void *proc = NULL; -+ DWORD len = strlen(module); -+ -+ TRACE( "(%s, %u)\n", debugstr_a(module), ord ); -+ -+ if (!(moduleW = RtlAllocateHeap( GetProcessHeap(), 0, (len + 1) * sizeof(WCHAR) ))) -+ return NULL; -+ -+ ascii_to_unicode( moduleW, module, len ); -+ moduleW[ len ] = 0; -+ RtlInitUnicodeString( &name, moduleW ); -+ -+ status = LdrGetDllHandle( NULL, 0, &name, &base ); -+ if (status == STATUS_DLL_NOT_FOUND) -+ status = LdrLoadDll( NULL, 0, &name, &base ); -+ if (status == STATUS_SUCCESS) -+ status = LdrAddRefDll( LDR_ADDREF_DLL_PIN, base ); -+ if (status == STATUS_SUCCESS) -+ status = LdrGetProcedureAddress( base, NULL, ord, &proc ); -+ -+ if (status) -+ FIXME( "No procedure address found for %s.#%u, status %x\n", debugstr_a(module), ord, status ); -+ -+ RtlFreeHeap( GetProcessHeap(), 0, moduleW ); -+ return proc; -+} -+ - /*********************************************************************** - * thread_init - * -@@ -116,6 +150,7 @@ TEB *thread_init( SIZE_T *info_size ) - ULONG_PTR val; - TEB *teb = unix_funcs->init_threading( &nb_threads, &__wine_ldt_copy, info_size, __wine_syscall_dispatcher ); - -+ teb->Spare2 = (ULONG_PTR)__wine_fakedll_dispatcher; - peb = teb->Peb; - peb->FastPebLock = &peb_lock; - peb->ApiSetMap = &apiset_map; -diff --git a/include/winternl.h b/include/winternl.h -index 6de209d6f07..d9c31156025 100644 ---- a/include/winternl.h -+++ b/include/winternl.h -@@ -399,7 +399,7 @@ typedef struct _TEB - PVOID Instrumentation[16]; /* f2c/16b8 */ - PVOID WinSockData; /* f6c/1738 */ - ULONG GdiBatchCount; /* f70/1740 */ -- ULONG Spare2; /* f74/1744 */ -+ ULONG Spare2; /* f74/1744 used for fakedll thunks */ - ULONG GuaranteedStackBytes; /* f78/1748 */ - PVOID ReservedForPerf; /* f7c/1750 */ - PVOID ReservedForOle; /* f80/1758 */ -diff --git a/tools/winebuild/build.h b/tools/winebuild/build.h -index 8930df408d3..44113bad28a 100644 ---- a/tools/winebuild/build.h -+++ b/tools/winebuild/build.h -@@ -358,6 +358,7 @@ extern void put_word( unsigned short val ); - extern void put_dword( unsigned int val ); - extern void put_qword( unsigned int val ); - extern void put_pword( unsigned int val ); -+extern void put_str( const char *str ); - extern void align_output( unsigned int align ); - extern void align_output_rva( unsigned int file_align, unsigned int rva_align ); - extern size_t label_pos( const char *name ); -diff --git a/tools/winebuild/spec32.c b/tools/winebuild/spec32.c -index c38f1fe663c..bf82ca497c0 100644 ---- a/tools/winebuild/spec32.c -+++ b/tools/winebuild/spec32.c -@@ -843,6 +843,163 @@ void output_spec32_file( DLLSPEC *spec ) - } - - -+static int needs_stub_exports( DLLSPEC *spec ) -+{ -+ if (target_cpu != CPU_x86) -+ return 0; -+ if (!(spec->characteristics & IMAGE_FILE_DLL)) -+ return 0; -+ if (!spec->nb_entry_points) -+ return 0; -+ return 1; -+} -+ -+ -+static void create_stub_exports_text( DLLSPEC *spec ) -+{ -+ int i, nr_exports = spec->base <= spec->limit ? spec->limit - spec->base + 1 : 0; -+ size_t rva, thunk; -+ -+ /* output stub code for exports */ -+ for (i = 0; i < spec->nb_entry_points; i++) -+ { -+ ORDDEF *odp = &spec->entry_points[i]; -+ const char *name = get_stub_name( odp, spec ); -+ -+ align_output_rva( 16, 16 ); -+ put_label( name ); -+ put_byte( 0x8b ); put_byte( 0xff ); /* mov edi, edi */ -+ put_byte( 0x55 ); /* push ebp */ -+ put_byte( 0x8b ); put_byte( 0xec ); /* mov ebp, esp */ -+ put_byte( 0x68 ); put_dword( 0 ); /* push dword 0 */ -+ put_byte( 0x68 ); put_dword( odp->ordinal ); /* push ORDINAL */ -+ rva = output_buffer_rva + 5; -+ put_byte( 0xe8 ); put_dword( label_rva("_forward") - rva ); /* call _forward */ -+ put_byte( 0x89 ); put_byte( 0xec ); /* mov esp, ebp */ -+ put_byte( 0x5d ); /* pop ebp */ -+ if (odp->type == TYPE_STDCALL) -+ { -+ put_byte( 0xc2 ); put_word( get_args_size(odp) ); /* ret X */ -+ } -+ else -+ { -+ put_byte( 0xc3 ); /* ret */ -+ } -+ } -+ -+ /* output entry point */ -+ align_output_rva( 16, 16 ); -+ put_label( "entrypoint" ); -+ put_byte( 0xb8 ); put_dword( 1 ); /* mov eax, 1 */ -+ put_byte( 0xc2 ); put_word( 12 ); /* ret 12 */ -+ -+ /* output forward function */ -+ align_output_rva( 16, 16 ); -+ put_label( "_forward" ); -+ put_byte( 0x8b ); put_byte( 0x6d ); put_byte( 0x00 ); /* mov ebp, dword[ebp] */ -+ put_byte( 0x89 ); put_byte( 0x44 ); /* mov dword[esp+8], eax */ -+ put_byte( 0x24 ); put_byte( 0x08 ); -+ put_byte( 0x89 ); put_byte( 0x14 ); put_byte( 0x24 ); /* mov dword[esp], edx */ -+ put_byte( 0x8b ); put_byte( 0x54 ); /* mov edx, dword[esp+4] */ -+ put_byte( 0x24 ); put_byte( 0x04 ); -+ put_byte( 0x89 ); put_byte( 0x4c ); /* mov dword[esp+4], ecx */ -+ put_byte( 0x24 ); put_byte( 0x04 ); -+ put_byte( 0xe8 ); put_dword( 0 ); /* call 1f */ -+ thunk = output_buffer_rva; -+ put_byte( 0x59 ); /* pop ecx */ -+ put_byte( 0x8b ); put_byte( 0x84 ); put_byte( 0x91 ); /* mov eax, dword[_functions + 4 * (edx - BASE)] */ -+ put_dword( label_rva("_functions") - thunk - 4 * spec->base ); -+ put_byte( 0x09 ); put_byte( 0xc0 ); /* or eax, eax */ -+ rva = output_buffer_rva + 2; -+ put_byte( 0x74 ); put_byte( label_rva("_forward_load") - rva ); /* je _forward_load */ -+ -+ put_label( "_forward_done" ); -+ put_byte( 0x89 ); put_byte( 0x44 ); /* mov dword[esp+12], eax */ -+ put_byte( 0x24 ); put_byte( 0x0c ); -+ put_byte( 0x5a ); /* pop edx */ -+ put_byte( 0x59 ); /* pop ecx */ -+ put_byte( 0x58 ); /* pop eax */ -+ put_byte( 0xc3 ); /* ret */ -+ -+ align_output_rva( 16, 16 ); -+ put_label( "_forward_load" ); -+ put_byte( 0x8d ); put_byte( 0x84 ); put_byte( 0x91 ); /* lea eax, [_functions + 4 * (edx - BASE)] */ -+ put_dword( label_rva("_functions") - thunk - 4 * spec->base ); -+ put_byte( 0x50 ); /* push eax */ -+ put_byte( 0x52 ); /* push edx */ -+ put_byte( 0x8d ); put_byte( 0x81 ); /* lea eax, [dll_name] */ -+ put_dword( label_rva("dll_name") - thunk ); -+ put_byte( 0x50 ); /* push eax */ -+ put_byte( 0x64 ); put_byte( 0xff ); /* call dword ptr fs:[0F74h] */ -+ put_byte( 0x15 ); put_dword( 0xf74 ); -+ put_byte( 0x5a ); /* pop edx */ -+ put_byte( 0x89 ); put_byte( 0x02 ); /* mov dword[edx], eax */ -+ rva = output_buffer_rva + 2; -+ put_byte( 0xeb ); put_byte( label_rva("_forward_done") - rva ); /* jmp _forward_done */ -+ -+ /* export directory */ -+ align_output_rva( 16, 16 ); -+ put_label( "export_start" ); -+ put_dword( 0 ); /* Characteristics */ -+ put_dword( 0 ); /* TimeDateStamp */ -+ put_dword( 0 ); /* MajorVersion/MinorVersion */ -+ put_dword( label_rva("dll_name") ); /* Name */ -+ put_dword( spec->base ); /* Base */ -+ put_dword( nr_exports ); /* NumberOfFunctions */ -+ put_dword( spec->nb_names ); /* NumberOfNames */ -+ put_dword( label_rva("export_funcs") ); /* AddressOfFunctions */ -+ put_dword( label_rva("export_names") ); /* AddressOfNames */ -+ put_dword( label_rva("export_ordinals") ); /* AddressOfNameOrdinals */ -+ -+ put_label( "export_funcs" ); -+ for (i = spec->base; i <= spec->limit; i++) -+ { -+ ORDDEF *odp = spec->ordinals[i]; -+ if (odp) -+ { -+ const char *name = get_stub_name( odp, spec ); -+ put_dword( label_rva( name ) ); -+ } -+ else -+ put_dword( 0 ); -+ } -+ -+ if (spec->nb_names) -+ { -+ put_label( "export_names" ); -+ for (i = 0; i < spec->nb_names; i++) -+ put_dword( label_rva(strmake("str_%s", get_stub_name(spec->names[i], spec))) ); -+ -+ put_label( "export_ordinals" ); -+ for (i = 0; i < spec->nb_names; i++) -+ put_word( spec->names[i]->ordinal - spec->base ); -+ if (spec->nb_names % 2) -+ put_word( 0 ); -+ } -+ -+ put_label( "dll_name" ); -+ put_str( spec->file_name ); -+ -+ for (i = 0; i < spec->nb_names; i++) -+ { -+ put_label( strmake("str_%s", get_stub_name(spec->names[i], spec)) ); -+ put_str( spec->names[i]->name ); -+ } -+ -+ put_label( "export_end" ); -+} -+ -+ -+static void create_stub_exports_data( DLLSPEC *spec ) -+{ -+ int i; -+ -+ put_label( "_functions" ); -+ for (i = spec->base; i <= spec->limit; i++) -+ put_dword( 0 ); -+} -+ -+ - /******************************************************************* - * output_fake_module_pass - * -@@ -861,7 +1018,7 @@ static void output_fake_module_pass( DLLSPEC *spec ) - const unsigned int file_align = 0x200; - const unsigned int reloc_size = 8; - const unsigned int lfanew = (0x40 + sizeof(fakedll_signature) + 15) & ~15; -- const unsigned int nb_sections = 2 + (spec->nb_resources != 0); -+ const unsigned int nb_sections = 2 + (needs_stub_exports( spec ) != 0) + (spec->nb_resources != 0); - - put_word( 0x5a4d ); /* e_magic */ - put_word( 0x40 ); /* e_cblp */ -@@ -918,7 +1075,7 @@ static void output_fake_module_pass( DLLSPEC *spec ) - put_dword( 0 ); /* SizeOfUninitializedData */ - put_dword( label_rva("entrypoint") ); /* AddressOfEntryPoint */ - put_dword( label_rva("text_start") ); /* BaseOfCode */ -- if (get_ptr_size() == 4) put_dword( 0 ); /* BaseOfData */ -+ if (get_ptr_size() == 4) put_dword( label_rva("data_start") ); /* BaseOfData */ - put_pword( 0x10000000 ); /* ImageBase */ - put_dword( section_align ); /* SectionAlignment */ - put_dword( file_align ); /* FileAlignment */ -@@ -941,7 +1098,8 @@ static void output_fake_module_pass( DLLSPEC *spec ) - put_dword( 0 ); /* LoaderFlags */ - put_dword( 16 ); /* NumberOfRvaAndSizes */ - -- put_dword( 0 ); put_dword( 0 ); /* DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT] */ -+ put_dword( label_rva("export_start") ); /* DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT] */ -+ put_dword( label_pos("export_end") - label_pos("export_start") ); - put_dword( 0 ); put_dword( 0 ); /* DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT] */ - if (spec->nb_resources) /* DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE] */ - { -@@ -981,6 +1139,21 @@ static void output_fake_module_pass( DLLSPEC *spec ) - put_word( 0 ); /* NumberOfLinenumbers */ - put_dword( 0x60000020 /* CNT_CODE|MEM_EXECUTE|MEM_READ */ ); /* Characteristics */ - -+ /* .data section */ -+ if (needs_stub_exports( spec )) -+ { -+ put_data( ".data\0\0", 8 ); /* Name */ -+ put_dword( label_rva_align("data_end") - label_rva("data_start") ); /* VirtualSize */ -+ put_dword( label_rva("data_start") ); /* VirtualAddress */ -+ put_dword( label_pos("data_end") - label_pos("data_start") ); /* SizeOfRawData */ -+ put_dword( label_pos("data_start") ); /* PointerToRawData */ -+ put_dword( 0 ); /* PointerToRelocations */ -+ put_dword( 0 ); /* PointerToLinenumbers */ -+ put_word( 0 ); /* NumberOfRelocations */ -+ put_word( 0 ); /* NumberOfLinenumbers */ -+ put_dword( 0xc0000040 /* CNT_INITIALIZED_DATA|MEM_READ|MEM_WRITE */ ); /* Characteristics */ -+ } -+ - /* .reloc section */ - put_data( ".reloc\0", 8 ); /* Name */ - put_dword( label_rva_align("reloc_end") - label_rva("reloc_start") ); /* VirtualSize */ -@@ -1013,13 +1186,31 @@ static void output_fake_module_pass( DLLSPEC *spec ) - - /* .text contents */ - align_output_rva( file_align, section_align ); -- put_label( "text_start" ); -- put_label( "entrypoint" ); -- if (spec->characteristics & IMAGE_FILE_DLL) -- put_data( dll_code_section, sizeof(dll_code_section) ); -+ if (needs_stub_exports( spec )) -+ { -+ put_label( "text_start" ); -+ create_stub_exports_text( spec ); -+ put_label( "text_end" ); -+ } - else -- put_data( exe_code_section, sizeof(exe_code_section) ); -- put_label( "text_end" ); -+ { -+ put_label( "text_start" ); -+ put_label( "entrypoint" ); -+ if (spec->characteristics & IMAGE_FILE_DLL) -+ put_data( dll_code_section, sizeof(dll_code_section) ); -+ else -+ put_data( exe_code_section, sizeof(exe_code_section) ); -+ put_label( "text_end" ); -+ } -+ -+ /* .data contents */ -+ align_output_rva( file_align, section_align ); -+ if (needs_stub_exports( spec )) -+ { -+ put_label( "data_start" ); -+ create_stub_exports_data( spec ); -+ put_label( "data_end" ); -+ } - - /* .reloc contents */ - align_output_rva( file_align, section_align ); -diff --git a/tools/winebuild/utils.c b/tools/winebuild/utils.c -index 80dec6db29e..d394a1382c6 100644 ---- a/tools/winebuild/utils.c -+++ b/tools/winebuild/utils.c -@@ -549,7 +549,7 @@ size_t output_buffer_size; - struct label - { - struct list entry; -- const char *name; -+ char *name; - size_t pos; - size_t rva; - }; -@@ -567,7 +567,7 @@ struct label *get_label( const char *name ) - } - - label = xmalloc( sizeof(*label) ); -- label->name = name; -+ label->name = xstrdup( name ); - label->pos = 0; - label->rva = 0; - -@@ -619,6 +619,7 @@ void free_labels( void ) - LIST_FOR_EACH_ENTRY_SAFE( label, label2, &labels, struct label, entry ) - { - list_remove( &label->entry ); -+ free( label->name ); - free( label ); - } - } -@@ -750,6 +751,11 @@ void put_pword( unsigned int val ) - else put_dword( val ); - } - -+void put_str( const char *str ) -+{ -+ put_data( str, strlen(str) + 1 ); -+} -+ - void align_output( unsigned int align ) - { - size_t size = align - (output_buffer_pos % align); --- -2.27.0 - diff --git a/patches/winebuild-Fake_Dlls/0006-winebuild-Add-syscall-thunks-in-fake-dlls.patch b/patches/winebuild-Fake_Dlls/0006-winebuild-Add-syscall-thunks-in-fake-dlls.patch deleted file mode 100644 index 13f46d6b..00000000 --- a/patches/winebuild-Fake_Dlls/0006-winebuild-Add-syscall-thunks-in-fake-dlls.patch +++ /dev/null @@ -1,76 +0,0 @@ -From fd72d405abba827ab5e2603551d48200aedad3ce Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michael=20M=C3=BCller?= -Date: Mon, 15 May 2017 17:56:48 +0200 -Subject: [PATCH] winebuild: Add syscall thunks in fake dlls. - ---- - dlls/kernel32/tests/loader.c | 1 - - tools/winebuild/spec32.c | 27 +++++++++++++++++++++++++-- - 2 files changed, 25 insertions(+), 3 deletions(-) - -diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c -index 182b61b731a2..98369c7d508c 100644 ---- a/dlls/kernel32/tests/loader.c -+++ b/dlls/kernel32/tests/loader.c -@@ -1639,7 +1639,6 @@ static void test_FakeDLL(void) - - /* check function content */ - map_func = RVAToAddr(map_rva, ptr); -- todo_wine - ok(!memcmp(map_func, dll_func, 0x20), "%s: Function content does not match!\n", func_name); - - if (!strcmp(func_name, "NtSetEvent")) -diff --git a/tools/winebuild/spec32.c b/tools/winebuild/spec32.c -index bf82ca497c0d..6968e41260f1 100644 ---- a/tools/winebuild/spec32.c -+++ b/tools/winebuild/spec32.c -@@ -860,13 +860,36 @@ static void create_stub_exports_text( DLLSPEC *spec ) - int i, nr_exports = spec->base <= spec->limit ? spec->limit - spec->base + 1 : 0; - size_t rva, thunk; - -+ /* output syscalls */ -+ for (i = 0; i < spec->nb_syscalls; i++) -+ { -+ ORDDEF *odp = spec->syscalls[i]; -+ -+ align_output_rva( 16, 16 ); -+ put_label( odp->link_name ); -+ put_byte( 0xb8 ); put_dword( i ); /* mov eax, SYSCALL */ -+ put_byte( 0x64 ); put_byte( 0xff ); /* call dword ptr fs:[0C0h] */ -+ put_byte( 0x15 ); put_dword( 0xc0 ); -+ put_byte( 0xc2 ); put_word( get_args_size(odp) ); /* ret X */ -+ } -+ -+ if (spec->nb_syscalls) -+ { -+ for (i = 0; i < 0x20; i++) -+ put_byte( 0 ); -+ } -+ - /* output stub code for exports */ - for (i = 0; i < spec->nb_entry_points; i++) - { - ORDDEF *odp = &spec->entry_points[i]; -- const char *name = get_stub_name( odp, spec ); -+ const char *name; -+ -+ if (odp->flags & FLAG_SYSCALL) -+ continue; - - align_output_rva( 16, 16 ); -+ name = get_stub_name( odp, spec ); - put_label( name ); - put_byte( 0x8b ); put_byte( 0xff ); /* mov edi, edi */ - put_byte( 0x55 ); /* push ebp */ -@@ -957,7 +980,7 @@ static void create_stub_exports_text( DLLSPEC *spec ) - ORDDEF *odp = spec->ordinals[i]; - if (odp) - { -- const char *name = get_stub_name( odp, spec ); -+ const char *name = (odp->flags & FLAG_SYSCALL) ? odp->link_name : get_stub_name( odp, spec ); - put_dword( label_rva( name ) ); - } - else --- -2.26.2 - diff --git a/patches/winebuild-Fake_Dlls/0007-winebuild-Fix-size-of-relocation-information-in-fake.patch b/patches/winebuild-Fake_Dlls/0007-winebuild-Fix-size-of-relocation-information-in-fake.patch deleted file mode 100644 index 3b3745ed..00000000 --- a/patches/winebuild-Fake_Dlls/0007-winebuild-Fix-size-of-relocation-information-in-fake.patch +++ /dev/null @@ -1,27 +0,0 @@ -From f92fc0572be02ce2eee2a9cbf60724372678a5af Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michael=20M=C3=BCller?= -Date: Thu, 25 May 2017 03:22:25 +0200 -Subject: [PATCH] winebuild: Fix size of relocation information in fake dlls. - ---- - tools/winebuild/spec32.c | 4 ++-- - 1 file changed, 2 insertions(+), 2 deletions(-) - -diff --git a/tools/winebuild/spec32.c b/tools/winebuild/spec32.c -index 6968e41260f1..f95b45b9a0d5 100644 ---- a/tools/winebuild/spec32.c -+++ b/tools/winebuild/spec32.c -@@ -1238,8 +1238,8 @@ static void output_fake_module_pass( DLLSPEC *spec ) - /* .reloc contents */ - align_output_rva( file_align, section_align ); - put_label( "reloc_start" ); -- put_dword( 0 ); /* VirtualAddress */ -- put_dword( 0 ); /* SizeOfBlock */ -+ put_dword( label_rva("text_start") ); /* VirtualAddress */ -+ put_dword( 8 ); /* SizeOfBlock */ - put_label( "reloc_end" ); - - /* .rsrc contents */ --- -2.26.2 - diff --git a/patches/winebuild-Fake_Dlls/0008-winebuild-Try-to-make-sure-RVA-matches-between-fake-.patch b/patches/winebuild-Fake_Dlls/0008-winebuild-Try-to-make-sure-RVA-matches-between-fake-.patch deleted file mode 100644 index 2cb4b7cf..00000000 --- a/patches/winebuild-Fake_Dlls/0008-winebuild-Try-to-make-sure-RVA-matches-between-fake-.patch +++ /dev/null @@ -1,99 +0,0 @@ -From 59efee63a7442dfee4d9e76b11f651a11a4b523e Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michael=20M=C3=BCller?= -Date: Thu, 25 May 2017 21:46:27 +0200 -Subject: [PATCH] winebuild: Try to make sure RVA matches between fake and - builtin DLLs. - ---- - dlls/kernel32/tests/loader.c | 1 - - libs/wine/loader.c | 13 +++++++++++-- - tools/winebuild/spec32.c | 17 +++++++++++++++-- - 3 files changed, 26 insertions(+), 5 deletions(-) - -diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c -index 98369c7d508c..77e73b3ca37b 100644 ---- a/dlls/kernel32/tests/loader.c -+++ b/dlls/kernel32/tests/loader.c -@@ -1626,7 +1626,6 @@ static void test_FakeDLL(void) - /* check position in memory */ - dll_rva = (DWORD_PTR)dll_func - (DWORD_PTR)module; - map_rva = funcs[ordinals[i]]; -- todo_wine - ok(map_rva == dll_rva, "%s: Rva of mapped function (0x%x) does not match dll (0x%x)\n", - func_name, dll_rva, map_rva); - -diff --git a/libs/wine/loader.c b/libs/wine/loader.c -index c3b59d902243..b6847ca77b31 100644 ---- a/libs/wine/loader.c -+++ b/libs/wine/loader.c -@@ -335,8 +335,12 @@ static void *map_dll( const IMAGE_NT_HEADERS *nt_descr ) - assert( size <= page_size ); - - /* module address must be aligned on 64K boundary */ -- addr = (BYTE *)((nt_descr->OptionalHeader.ImageBase + 0xffff) & ~0xffff); -- if (wine_anon_mmap( addr, page_size, PROT_READ|PROT_WRITE, MAP_FIXED ) != addr) return NULL; -+ addr = *(BYTE **)&nt_descr->OptionalHeader.DataDirectory[15]; -+ if (!addr || ((ULONG_PTR)addr & 0xffff) || mprotect( addr, page_size, PROT_READ | PROT_WRITE )) -+ { -+ addr = (BYTE *)((nt_descr->OptionalHeader.ImageBase + 0xffff) & ~0xffff); -+ if (wine_anon_mmap( addr, page_size, PROT_READ|PROT_WRITE, MAP_FIXED ) != addr) return NULL; -+ } - - dos = (IMAGE_DOS_HEADER *)addr; - nt = (IMAGE_NT_HEADERS *)(dos + 1); -@@ -383,6 +387,11 @@ static void *map_dll( const IMAGE_NT_HEADERS *nt_descr ) - nt->OptionalHeader.SizeOfImage = data_end; - nt->OptionalHeader.ImageBase = (ULONG_PTR)addr; - -+ /* Clear DataDirectory[15] */ -+ -+ nt->OptionalHeader.DataDirectory[15].VirtualAddress = 0; -+ nt->OptionalHeader.DataDirectory[15].Size = 0; -+ - /* Build the code section */ - - memcpy( sec->Name, ".text", sizeof(".text") ); -diff --git a/tools/winebuild/spec32.c b/tools/winebuild/spec32.c -index f95b45b9a0d5..07d6eed05fcc 100644 ---- a/tools/winebuild/spec32.c -+++ b/tools/winebuild/spec32.c -@@ -381,14 +381,25 @@ static void output_relay_debug( DLLSPEC *spec ) - */ - static void output_syscall_thunks( DLLSPEC *spec ) - { -+ const unsigned int page_size = get_page_size(); - int i; - - if (!spec->nb_syscalls) - return; - -- output( "\n/* syscall thunks */\n\n" ); -- output( "\t.text\n" ); -+ /* Reserve space for PE header directly before syscalls. */ -+ if (target_platform == PLATFORM_APPLE) -+ output( "\t.text\n" ); -+ else -+ output( "\n\t.section \".text.startup\"\n" ); -+ -+ output( "\t.align %d\n", get_alignment(65536) ); -+ output( "__wine_spec_pe_header_syscalls:\n" ); -+ output( "__wine_spec_pe_header_syscalls_end:\n" ); -+ output( "\t.byte 0\n" ); -+ output( "\t.balign %d, 0\n", page_size ); - -+ output( "\n/* syscall thunks */\n\n" ); - for (i = 0; i < spec->nb_syscalls; i++) - { - ORDDEF *odp = spec->syscalls[i]; -@@ -813,6 +824,8 @@ void output_module( DLLSPEC *spec ) - data_dirs[1] = ".L__wine_spec_imports"; /* DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT] */ - if (spec->nb_resources) - data_dirs[2] = ".L__wine_spec_resources"; /* DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE] */ -+ if (spec->nb_syscalls) -+ data_dirs[15] = "__wine_spec_pe_header_syscalls"; - - output_data_directories( data_dirs ); - --- -2.26.2 - diff --git a/patches/winebuild-Fake_Dlls/0009-libs-wine-Use-same-file-alignment-for-fake-and-built.patch b/patches/winebuild-Fake_Dlls/0009-libs-wine-Use-same-file-alignment-for-fake-and-built.patch deleted file mode 100644 index 9113beb5..00000000 --- a/patches/winebuild-Fake_Dlls/0009-libs-wine-Use-same-file-alignment-for-fake-and-built.patch +++ /dev/null @@ -1,38 +0,0 @@ -From 370eccb19c65a8b02abfa31a76651ae533dda22f Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Michael=20M=C3=BCller?= -Date: Thu, 25 May 2017 21:56:06 +0200 -Subject: [PATCH] libs/wine: Use same file alignment for fake and builtin DLLs. - ---- - dlls/kernel32/tests/loader.c | 1 - - libs/wine/loader.c | 2 +- - 2 files changed, 1 insertion(+), 2 deletions(-) - -diff --git a/dlls/kernel32/tests/loader.c b/dlls/kernel32/tests/loader.c -index 77e73b3ca37b..1f525194ce73 100644 ---- a/dlls/kernel32/tests/loader.c -+++ b/dlls/kernel32/tests/loader.c -@@ -1632,7 +1632,6 @@ static void test_FakeDLL(void) - /* check position in file */ - map_offset = (DWORD_PTR)RtlImageRvaToVa(RtlImageNtHeader(ptr), ptr, map_rva, NULL) - (DWORD_PTR)ptr; - dll_offset = (DWORD_PTR)RtlImageRvaToVa(RtlImageNtHeader(module), module, dll_rva, NULL) - (DWORD_PTR)module; -- todo_wine - ok(map_offset == dll_offset, "%s: File offset of mapped function (0x%x) does not match dll (0x%x)\n", - func_name, map_offset, dll_offset); - -diff --git a/libs/wine/loader.c b/libs/wine/loader.c -index b6847ca77b31..4597a6cb3243 100644 ---- a/libs/wine/loader.c -+++ b/libs/wine/loader.c -@@ -398,7 +398,7 @@ static void *map_dll( const IMAGE_NT_HEADERS *nt_descr ) - sec->SizeOfRawData = code_end - code_start; - sec->Misc.VirtualSize = sec->SizeOfRawData; - sec->VirtualAddress = code_start; -- sec->PointerToRawData = code_start; -+ sec->PointerToRawData = 0x200; /* file alignment */ - sec->Characteristics = (IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | IMAGE_SCN_MEM_READ); - sec++; - --- -2.26.2 - diff --git a/patches/winebuild-Fake_Dlls/0011-ntdll-Call-NtOpenFile-through-syscall-thunk.patch b/patches/winebuild-Fake_Dlls/0011-ntdll-Call-NtOpenFile-through-syscall-thunk.patch deleted file mode 100644 index 460b270f..00000000 --- a/patches/winebuild-Fake_Dlls/0011-ntdll-Call-NtOpenFile-through-syscall-thunk.patch +++ /dev/null @@ -1,104 +0,0 @@ -From ac99500b2479f2c9cfed43408c26e0f78261c46b Mon Sep 17 00:00:00 2001 -From: Paul Gofman -Date: Fri, 3 Jan 2020 17:39:08 +0300 -Subject: [PATCH] ntdll: Call NtOpenFile through syscall thunk. - -Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48410 ---- - dlls/ntdll/actctx.c | 4 ++-- - dlls/ntdll/loader.c | 2 +- - dlls/ntdll/locale.c | 4 ++-- - dlls/ntdll/ntdll_misc.h | 8 ++++++++ - dlls/ntdll/path.c | 2 +- - 5 files changed, 14 insertions(+), 6 deletions(-) - -diff --git a/dlls/ntdll/actctx.c b/dlls/ntdll/actctx.c -index 1fa97ac0379..9bf425c6e2d 100644 ---- a/dlls/ntdll/actctx.c -+++ b/dlls/ntdll/actctx.c -@@ -2926,7 +2926,7 @@ static NTSTATUS open_nt_file( HANDLE *handle, UNICODE_STRING *name ) - attr.ObjectName = name; - attr.SecurityDescriptor = NULL; - attr.SecurityQualityOfService = NULL; -- return NtOpenFile( handle, GENERIC_READ | SYNCHRONIZE, &attr, &io, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_ALERT ); -+ return __syscall_NtOpenFile( handle, GENERIC_READ | SYNCHRONIZE, &attr, &io, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_ALERT ); - } - - static NTSTATUS get_manifest_in_module( struct actctx_loader* acl, struct assembly_identity* ai, -@@ -3243,7 +3243,7 @@ static NTSTATUS lookup_winsxs(struct actctx_loader* acl, struct assembly_identit - attr.SecurityDescriptor = NULL; - attr.SecurityQualityOfService = NULL; - -- if (!NtOpenFile( &handle, GENERIC_READ | SYNCHRONIZE, &attr, &io, FILE_SHARE_READ | FILE_SHARE_WRITE, -+ if (!__syscall_NtOpenFile( &handle, GENERIC_READ | SYNCHRONIZE, &attr, &io, FILE_SHARE_READ | FILE_SHARE_WRITE, - FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT )) - { - sxs_ai = *ai; -diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c -index 5b26a556f0d..053d6a8ef1d 100644 ---- a/dlls/ntdll/loader.c -+++ b/dlls/ntdll/loader.c -@@ -2327,7 +2327,7 @@ static NTSTATUS open_dll_file( UNICODE_STRING *nt_name, WINE_MODREF **pwm, - attr.ObjectName = nt_name; - attr.SecurityDescriptor = NULL; - attr.SecurityQualityOfService = NULL; -- if ((status = NtOpenFile( &handle, GENERIC_READ | SYNCHRONIZE, &attr, &io, -+ if ((status = __syscall_NtOpenFile( &handle, GENERIC_READ | SYNCHRONIZE, &attr, &io, - FILE_SHARE_READ | FILE_SHARE_DELETE, - FILE_SYNCHRONOUS_IO_NONALERT | FILE_NON_DIRECTORY_FILE ))) - { -diff --git a/dlls/ntdll/locale.c b/dlls/ntdll/locale.c -index d6bde700e42..16a7f911173 100644 ---- a/dlls/ntdll/locale.c -+++ b/dlls/ntdll/locale.c -@@ -654,7 +654,7 @@ static NTSTATUS open_nls_data_file( ULONG type, ULONG id, HANDLE *file ) - return STATUS_NO_MEMORY; - valueW.Length = NTDLL_swprintf( valueW.Buffer, pathfmtW, dir, name ) * sizeof(WCHAR); - InitializeObjectAttributes( &attr, &valueW, 0, 0, NULL ); -- status = NtOpenFile( file, GENERIC_READ, &attr, &io, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_ALERT ); -+ status = __syscall_NtOpenFile( file, GENERIC_READ, &attr, &io, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_ALERT ); - if (!status) TRACE( "found %s\n", debugstr_w( valueW.Buffer )); - RtlFreeUnicodeString( &valueW ); - if (status != STATUS_OBJECT_NAME_NOT_FOUND && status != STATUS_OBJECT_PATH_NOT_FOUND) return status; -@@ -678,7 +678,7 @@ static NTSTATUS open_nls_data_file( ULONG type, ULONG id, HANDLE *file ) - wcscat( valueW.Buffer, name ); - valueW.Length = wcslen(valueW.Buffer) * sizeof(WCHAR); - InitializeObjectAttributes( &attr, &valueW, 0, 0, NULL ); -- status = NtOpenFile( file, GENERIC_READ, &attr, &io, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_ALERT ); -+ status = __syscall_NtOpenFile( file, GENERIC_READ, &attr, &io, FILE_SHARE_READ, FILE_SYNCHRONOUS_IO_ALERT ); - if (!status) TRACE( "found %s\n", debugstr_w( valueW.Buffer )); - } - RtlFreeUnicodeString( &valueW ); -diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h -index 47800db41b1..749edaa57cf 100644 ---- a/dlls/ntdll/ntdll_misc.h -+++ b/dlls/ntdll/ntdll_misc.h -@@ -227,4 +227,12 @@ static inline void ascii_to_unicode( WCHAR *dst, const char *src, size_t len ) - while (len--) *dst++ = (unsigned char)*src++; - } - -+#if defined(__i386__) || defined(__x86_64__) -+NTSTATUS WINAPI __syscall_NtOpenFile( PHANDLE handle, ACCESS_MASK access, -+ POBJECT_ATTRIBUTES attr, PIO_STATUS_BLOCK io, -+ ULONG sharing, ULONG options ); -+#else -+#define __syscall_NtOpenFile NtOpenFile -+#endif -+ - #endif -diff --git a/dlls/ntdll/path.c b/dlls/ntdll/path.c -index 5f4eb11316f..d2112d1af0d 100644 ---- a/dlls/ntdll/path.c -+++ b/dlls/ntdll/path.c -@@ -929,7 +929,7 @@ NTSTATUS WINAPI RtlSetCurrentDirectory_U(const UNICODE_STRING* dir) - attr.SecurityDescriptor = NULL; - attr.SecurityQualityOfService = NULL; - -- nts = NtOpenFile( &handle, FILE_TRAVERSE | SYNCHRONIZE, &attr, &io, FILE_SHARE_READ | FILE_SHARE_WRITE, -+ nts = __syscall_NtOpenFile( &handle, FILE_TRAVERSE | SYNCHRONIZE, &attr, &io, FILE_SHARE_READ | FILE_SHARE_WRITE, - FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT ); - if (nts != STATUS_SUCCESS) goto out; - --- -2.27.0 - diff --git a/staging/upstream-commit b/staging/upstream-commit index 393685f9..71f3d79f 100644 --- a/staging/upstream-commit +++ b/staging/upstream-commit @@ -1 +1 @@ -6e2a54ec76d225d76506fe909a9c300702636d5b +e0e3b6bc91f7db956e3a66f2938eea45d4055a39