winehq.org
Sign In
Sign Up
Sign In
Sign Up
Manage this list
×
Keyboard Shortcuts
Thread View
j
: Next unread message
k
: Previous unread message
j a
: Jump to all threads
j l
: Jump to MailingList overview
2025
February
January
2024
December
November
October
September
August
July
June
May
April
March
February
January
2023
December
November
October
September
August
July
June
May
April
March
February
January
2022
December
November
October
September
August
July
June
May
April
March
February
January
2021
December
November
October
September
August
July
June
May
April
March
February
January
2020
December
November
October
September
August
July
June
May
April
March
February
January
2019
December
November
October
September
August
July
June
May
April
March
February
January
2018
December
November
October
September
August
July
June
May
April
March
February
January
2017
December
November
October
September
August
July
June
May
April
March
February
January
2016
December
November
October
September
August
July
June
May
April
March
February
January
2015
December
November
October
September
August
July
June
May
April
March
February
January
2014
December
November
October
September
August
July
June
May
April
March
February
January
2013
December
November
October
September
August
July
June
May
April
March
February
January
2012
December
November
October
September
August
July
June
May
April
March
February
January
2011
December
November
October
September
August
July
June
May
April
March
February
January
2010
December
November
October
September
August
July
June
May
April
March
February
January
2009
December
November
October
September
August
July
June
May
April
March
February
January
2008
December
November
October
September
August
July
June
May
April
March
February
January
2007
December
November
October
September
August
July
June
May
April
March
February
January
2006
December
November
October
September
August
July
June
May
April
March
February
January
2005
December
November
October
September
August
July
June
May
April
March
February
January
2004
December
November
October
September
August
July
June
May
April
March
February
January
2003
December
November
October
September
August
July
June
May
April
March
February
January
2002
December
November
October
September
August
July
June
May
April
March
February
January
2001
December
November
October
September
August
July
June
May
April
March
February
List overview
wine-commits
June 2021
----- 2025 -----
February 2025
January 2025
----- 2024 -----
December 2024
November 2024
October 2024
September 2024
August 2024
July 2024
June 2024
May 2024
April 2024
March 2024
February 2024
January 2024
----- 2023 -----
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
----- 2022 -----
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
----- 2021 -----
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
----- 2020 -----
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
----- 2019 -----
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
----- 2018 -----
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
----- 2017 -----
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
----- 2016 -----
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
----- 2015 -----
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
----- 2014 -----
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
----- 2013 -----
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
----- 2012 -----
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
----- 2011 -----
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
----- 2010 -----
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
----- 2009 -----
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
----- 2008 -----
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
----- 2007 -----
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
----- 2006 -----
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
----- 2005 -----
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
----- 2004 -----
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
----- 2003 -----
December 2003
November 2003
October 2003
September 2003
August 2003
July 2003
June 2003
May 2003
April 2003
March 2003
February 2003
January 2003
----- 2002 -----
December 2002
November 2002
October 2002
September 2002
August 2002
July 2002
June 2002
May 2002
April 2002
March 2002
February 2002
January 2002
----- 2001 -----
December 2001
November 2001
October 2001
September 2001
August 2001
July 2001
June 2001
May 2001
April 2001
March 2001
February 2001
wine-commits@winehq.org
1 participants
811 discussions
Start a n
N
ew thread
Alexandre Julliard : server: Remove the no longer used pid/tid fields in the init_thread request.
by Alexandre Julliard
29 Jun '21
29 Jun '21
Module: wine Branch: master Commit: cc63b76833aa96e573800ff5b4dd6c7f01f324f7 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=cc63b76833aa96e573800ff5…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Mon Jun 28 11:41:06 2021 +0200 server: Remove the no longer used pid/tid fields in the init_thread request. Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- include/wine/server_protocol.h | 6 ++---- server/protocol.def | 2 -- server/request.h | 6 ++---- server/thread.c | 2 -- server/trace.c | 4 +--- 5 files changed, 5 insertions(+), 15 deletions(-) diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 51ee6ee4aa3..1720eef506e 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -952,10 +952,8 @@ struct init_thread_request struct init_thread_reply { struct reply_header __header; - process_id_t pid; - thread_id_t tid; int suspend; - char __pad_20[4]; + char __pad_12[4]; }; @@ -6236,7 +6234,7 @@ union generic_reply /* ### protocol_version begin ### */ -#define SERVER_PROTOCOL_VERSION 718 +#define SERVER_PROTOCOL_VERSION 719 /* ### protocol_version end ### */ diff --git a/server/protocol.def b/server/protocol.def index 557311e2b3f..762be1fa7c0 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -924,8 +924,6 @@ typedef struct client_ptr_t teb; /* TEB of new thread (in thread address space) */ client_ptr_t entry; /* entry point (in thread address space) */ @REPLY - process_id_t pid; /* process id of the new thread's process */ - thread_id_t tid; /* thread id of the new thread */ int suspend; /* is thread suspended? */ @END diff --git a/server/request.h b/server/request.h index 0221cbd33ae..1c45ac34cc7 100644 --- a/server/request.h +++ b/server/request.h @@ -758,10 +758,8 @@ C_ASSERT( FIELD_OFFSET(struct init_thread_request, wait_fd) == 20 ); C_ASSERT( FIELD_OFFSET(struct init_thread_request, teb) == 24 ); C_ASSERT( FIELD_OFFSET(struct init_thread_request, entry) == 32 ); C_ASSERT( sizeof(struct init_thread_request) == 40 ); -C_ASSERT( FIELD_OFFSET(struct init_thread_reply, pid) == 8 ); -C_ASSERT( FIELD_OFFSET(struct init_thread_reply, tid) == 12 ); -C_ASSERT( FIELD_OFFSET(struct init_thread_reply, suspend) == 16 ); -C_ASSERT( sizeof(struct init_thread_reply) == 24 ); +C_ASSERT( FIELD_OFFSET(struct init_thread_reply, suspend) == 8 ); +C_ASSERT( sizeof(struct init_thread_reply) == 16 ); C_ASSERT( FIELD_OFFSET(struct terminate_process_request, handle) == 12 ); C_ASSERT( FIELD_OFFSET(struct terminate_process_request, exit_code) == 16 ); C_ASSERT( sizeof(struct terminate_process_request) == 24 ); diff --git a/server/thread.c b/server/thread.c index 703b23d73d1..f9535a7b25b 100644 --- a/server/thread.c +++ b/server/thread.c @@ -1457,8 +1457,6 @@ DECL_HANDLER(init_thread) generate_debug_event( current, DbgCreateThreadStateChange, &req->entry ); set_thread_affinity( current, current->affinity ); - reply->pid = get_process_id( current->process ); - reply->tid = get_thread_id( current ); reply->suspend = (current->suspend || current->process->suspend || current->context != NULL); } diff --git a/server/trace.c b/server/trace.c index bbdf17feb1a..55068d1179b 100644 --- a/server/trace.c +++ b/server/trace.c @@ -1545,9 +1545,7 @@ static void dump_init_thread_request( const struct init_thread_request *req ) static void dump_init_thread_reply( const struct init_thread_reply *req ) { - fprintf( stderr, " pid=%04x", req->pid ); - fprintf( stderr, ", tid=%04x", req->tid ); - fprintf( stderr, ", suspend=%d", req->suspend ); + fprintf( stderr, " suspend=%d", req->suspend ); } static void dump_terminate_process_request( const struct terminate_process_request *req )
1
0
0
0
Alexandre Julliard : ntdll: Don't rely on get_thread_context() updating the context flags.
by Alexandre Julliard
29 Jun '21
29 Jun '21
Module: wine Branch: master Commit: 7404ef3ef5f0fccf08e37f2f189e421b810ffe99 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=7404ef3ef5f0fccf08e37f2f…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Tue Jun 29 14:46:30 2021 +0200 ntdll: Don't rely on get_thread_context() updating the context flags. Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/unix/signal_arm.c | 66 +++++++------- dlls/ntdll/unix/signal_arm64.c | 48 +++++----- dlls/ntdll/unix/signal_i386.c | 3 +- dlls/ntdll/unix/signal_x86_64.c | 193 +++++++++++++++++++--------------------- 4 files changed, 146 insertions(+), 164 deletions(-) Diff:
https://source.winehq.org/git/wine.git/?a=commitdiff;h=7404ef3ef5f0fccf08e3…
1
0
0
0
Alexandre Julliard : ntdll: Implement NtWow64AllocateVirtualMemory64().
by Alexandre Julliard
29 Jun '21
29 Jun '21
Module: wine Branch: master Commit: 19f19d0e2e5c049c21ed9cb925c3d9da24a0f23a URL:
https://source.winehq.org/git/wine.git/?a=commit;h=19f19d0e2e5c049c21ed9cb9…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Mon Jun 28 20:25:03 2021 +0200 ntdll: Implement NtWow64AllocateVirtualMemory64(). Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/ntdll.spec | 2 ++ dlls/ntdll/tests/wow64.c | 69 +++++++++++++++++++++++++++++++++++++++++++++++ dlls/ntdll/unix/virtual.c | 57 +++++++++++++++++++++++++++++++++++++++ include/winternl.h | 1 + 4 files changed, 129 insertions(+) Diff:
https://source.winehq.org/git/wine.git/?a=commitdiff;h=19f19d0e2e5c049c21ed…
1
0
0
0
Alexandre Julliard : ntdll: Implement NtWow64Read/WriteVirtualMemory64().
by Alexandre Julliard
29 Jun '21
29 Jun '21
Module: wine Branch: master Commit: bfd2d1d77d8efd7dfc0613140e6281c924c3a1c7 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=bfd2d1d77d8efd7dfc061314…
Author: Alexandre Julliard <julliard(a)winehq.org> Date: Mon Jun 28 20:24:56 2021 +0200 ntdll: Implement NtWow64Read/WriteVirtualMemory64(). Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/ntdll.spec | 4 +++ dlls/ntdll/tests/wow64.c | 42 +++++++++++++++++++++++++++++ dlls/ntdll/unix/virtual.c | 67 +++++++++++++++++++++++++++++++++++++++++++++++ include/winternl.h | 16 +++++------ 4 files changed, 121 insertions(+), 8 deletions(-) diff --git a/dlls/ntdll/ntdll.spec b/dlls/ntdll/ntdll.spec index bd72f50b864..70e752eb43b 100644 --- a/dlls/ntdll/ntdll.spec +++ b/dlls/ntdll/ntdll.spec @@ -430,6 +430,8 @@ @ stdcall -syscall NtWaitForSingleObject(long long ptr) @ stub NtWaitHighEventPair @ stub NtWaitLowEventPair +@ stdcall -syscall -arch=win32 NtWow64ReadVirtualMemory64(long int64 ptr int64 ptr) +@ stdcall -syscall -arch=win32 NtWow64WriteVirtualMemory64(long int64 ptr int64 ptr) @ stdcall -syscall NtWriteFile(long long ptr ptr ptr ptr long ptr ptr) @ stdcall -syscall NtWriteFileGather(long long ptr ptr ptr ptr long ptr ptr) @ stub NtWriteRequestData @@ -1444,6 +1446,8 @@ @ stdcall -private -syscall ZwWaitForSingleObject(long long ptr) NtWaitForSingleObject @ stub ZwWaitHighEventPair @ stub ZwWaitLowEventPair +@ stdcall -syscall -arch=win32 ZwWow64ReadVirtualMemory64(long int64 ptr int64 ptr) NtWow64ReadVirtualMemory64 +@ stdcall -syscall -arch=win32 ZwWow64WriteVirtualMemory64(long int64 ptr int64 ptr) NtWow64WriteVirtualMemory64 @ stdcall -private -syscall ZwWriteFile(long long ptr ptr ptr ptr long ptr ptr) NtWriteFile @ stdcall -private -syscall ZwWriteFileGather(long long ptr ptr ptr ptr long ptr ptr) NtWriteFileGather @ stub ZwWriteRequestData diff --git a/dlls/ntdll/tests/wow64.c b/dlls/ntdll/tests/wow64.c index 17082d2d329..8146ab0363e 100644 --- a/dlls/ntdll/tests/wow64.c +++ b/dlls/ntdll/tests/wow64.c @@ -27,6 +27,9 @@ static NTSTATUS (WINAPI *pRtlWow64GetProcessMachines)(HANDLE,WORD*,WORD*); static NTSTATUS (WINAPI *pRtlWow64IsWowGuestMachineSupported)(USHORT,BOOLEAN*); #ifdef _WIN64 static NTSTATUS (WINAPI *pRtlWow64GetCpuAreaInfo)(WOW64_CPURESERVED*,ULONG,WOW64_CPU_AREA_INFO*); +#else +static NTSTATUS (WINAPI *pNtWow64ReadVirtualMemory64)(HANDLE,ULONG64,void*,ULONG64,ULONG64*); +static NTSTATUS (WINAPI *pNtWow64WriteVirtualMemory64)(HANDLE,ULONG64,const void *,ULONG64,ULONG64*); #endif static BOOL is_wow64; @@ -44,6 +47,9 @@ static void init(void) GET_PROC( RtlWow64IsWowGuestMachineSupported ); #ifdef _WIN64 GET_PROC( RtlWow64GetCpuAreaInfo ); +#else + GET_PROC( NtWow64ReadVirtualMemory64 ); + GET_PROC( NtWow64WriteVirtualMemory64 ); #endif #undef GET_PROC } @@ -453,6 +459,40 @@ static void test_cpu_area(void) else win_skip( "RtlWow64GetCpuAreaInfo not supported\n" ); } +#else /* _WIN64 */ + +static void test_nt_wow64(void) +{ + const char str[] = "hello wow64"; + char buffer[100]; + NTSTATUS status; + ULONG64 res; + HANDLE process = OpenProcess( PROCESS_ALL_ACCESS, FALSE, GetCurrentProcessId() ); + + ok( process != 0, "failed to open current process %u\n", GetLastError() ); + if (pNtWow64ReadVirtualMemory64) + { + status = pNtWow64ReadVirtualMemory64( process, (ULONG_PTR)str, buffer, sizeof(str), &res ); + ok( !status, "NtWow64ReadVirtualMemory64 failed %x\n", status ); + ok( res == sizeof(str), "wrong size %s\n", wine_dbgstr_longlong(res) ); + ok( !strcmp( buffer, str ), "wrong data %s\n", debugstr_a(buffer) ); + status = pNtWow64WriteVirtualMemory64( process, (ULONG_PTR)buffer, " bye ", 5, &res ); + ok( !status, "NtWow64WriteVirtualMemory64 failed %x\n", status ); + ok( res == 5, "wrong size %s\n", wine_dbgstr_longlong(res) ); + ok( !strcmp( buffer, " bye wow64" ), "wrong data %s\n", debugstr_a(buffer) ); + /* current process pseudo-handle is broken on some Windows versions */ + status = pNtWow64ReadVirtualMemory64( GetCurrentProcess(), (ULONG_PTR)str, buffer, sizeof(str), &res ); + ok( !status || broken( status == STATUS_INVALID_HANDLE ), + "NtWow64ReadVirtualMemory64 failed %x\n", status ); + status = pNtWow64WriteVirtualMemory64( GetCurrentProcess(), (ULONG_PTR)buffer, " bye ", 5, &res ); + ok( !status || broken( status == STATUS_INVALID_HANDLE ), + "NtWow64WriteVirtualMemory64 failed %x\n", status ); + } + else win_skip( "NtWow64ReadVirtualMemory64 not supported\n" ); + + NtClose( process ); +} + #endif /* _WIN64 */ @@ -463,5 +503,7 @@ START_TEST(wow64) test_peb_teb(); #ifdef _WIN64 test_cpu_area(); +#else + test_nt_wow64(); #endif } diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c index 52af195aa56..d42cf74208a 100644 --- a/dlls/ntdll/unix/virtual.c +++ b/dlls/ntdll/unix/virtual.c @@ -4833,3 +4833,70 @@ NTSTATUS WINAPI NtCreatePagingFile( UNICODE_STRING *name, LARGE_INTEGER *min_siz FIXME( "(%s %p %p %p) stub\n", debugstr_us(name), min_size, max_size, actual_size ); return STATUS_SUCCESS; } + +#ifndef _WIN64 + +/*********************************************************************** + * NtWow64ReadVirtualMemory64 (NTDLL.@) + * ZwWow64ReadVirtualMemory64 (NTDLL.@) + */ +NTSTATUS WINAPI NtWow64ReadVirtualMemory64( HANDLE process, ULONG64 addr, void *buffer, + ULONG64 size, ULONG64 *bytes_read ) +{ + NTSTATUS status; + + if (size > MAXLONG) size = MAXLONG; + + if (virtual_check_buffer_for_write( buffer, size )) + { + SERVER_START_REQ( read_process_memory ) + { + req->handle = wine_server_obj_handle( process ); + req->addr = addr; + wine_server_set_reply( req, buffer, size ); + if ((status = wine_server_call( req ))) size = 0; + } + SERVER_END_REQ; + } + else + { + status = STATUS_ACCESS_VIOLATION; + size = 0; + } + if (bytes_read) *bytes_read = size; + return status; +} + + +/*********************************************************************** + * NtWow64WriteVirtualMemory64 (NTDLL.@) + * ZwWow64WriteVirtualMemory64 (NTDLL.@) + */ +NTSTATUS WINAPI NtWow64WriteVirtualMemory64( HANDLE process, ULONG64 addr, const void *buffer, + ULONG64 size, ULONG64 *bytes_written ) +{ + NTSTATUS status; + + if (size > MAXLONG) size = MAXLONG; + + if (virtual_check_buffer_for_read( buffer, size )) + { + SERVER_START_REQ( write_process_memory ) + { + req->handle = wine_server_obj_handle( process ); + req->addr = addr; + wine_server_add_data( req, buffer, size ); + if ((status = wine_server_call( req ))) size = 0; + } + SERVER_END_REQ; + } + else + { + status = STATUS_PARTIAL_COPY; + size = 0; + } + if (bytes_written) *bytes_written = size; + return status; +} + +#endif /* _WIN64 */ diff --git a/include/winternl.h b/include/winternl.h index 7221c0632b0..042936f4a7f 100644 --- a/include/winternl.h +++ b/include/winternl.h @@ -4396,19 +4396,19 @@ NTSYSAPI NTSTATUS WINAPI RtlpUnWaitCriticalSection(RTL_CRITICAL_SECTION *); NTSYSAPI NTSTATUS WINAPI vDbgPrintEx(ULONG,ULONG,LPCSTR,__ms_va_list); NTSYSAPI NTSTATUS WINAPI vDbgPrintExWithPrefix(LPCSTR,ULONG,ULONG,LPCSTR,__ms_va_list); -#ifdef _WIN64 -NTSYSAPI NTSTATUS WINAPI RtlWow64GetCpuAreaInfo(WOW64_CPURESERVED*,ULONG,WOW64_CPU_AREA_INFO*); -NTSYSAPI NTSTATUS WINAPI RtlWow64GetThreadContext(HANDLE,WOW64_CONTEXT*); -NTSYSAPI NTSTATUS WINAPI RtlWow64SetThreadContext(HANDLE,const WOW64_CONTEXT*); -#endif - #ifndef __WINE_USE_MSVCRT NTSYSAPI int __cdecl _strnicmp(LPCSTR,LPCSTR,size_t); #endif -/* 32-bit only functions */ +/* 32-bit or 64-bit only functions */ -#ifndef _WIN64 +#ifdef _WIN64 +NTSYSAPI NTSTATUS WINAPI RtlWow64GetCpuAreaInfo(WOW64_CPURESERVED*,ULONG,WOW64_CPU_AREA_INFO*); +NTSYSAPI NTSTATUS WINAPI RtlWow64GetThreadContext(HANDLE,WOW64_CONTEXT*); +NTSYSAPI NTSTATUS WINAPI RtlWow64SetThreadContext(HANDLE,const WOW64_CONTEXT*); +#else +NTSYSAPI NTSTATUS WINAPI NtWow64ReadVirtualMemory64(HANDLE,ULONG64,void*,ULONG64,ULONG64*); +NTSYSAPI NTSTATUS WINAPI NtWow64WriteVirtualMemory64(HANDLE,ULONG64,const void*,ULONG64,ULONG64*); NTSYSAPI LONGLONG WINAPI RtlConvertLongToLargeInteger(LONG); NTSYSAPI ULONGLONG WINAPI RtlConvertUlongToLargeInteger(ULONG); NTSYSAPI LONGLONG WINAPI RtlEnlargedIntegerMultiply(INT,INT);
1
0
0
0
Bernhard Übelacker : ntdll: Allow 16-bit executables to be loaded from build directory.
by Alexandre Julliard
29 Jun '21
29 Jun '21
Module: wine Branch: master Commit: cbf7a101763790ca03307c72d32dd8969a381be6 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=cbf7a101763790ca03307c72…
Author: Bernhard Übelacker <bernhardu(a)mailbox.org> Date: Mon Jun 28 10:39:58 2021 +0200 ntdll: Allow 16-bit executables to be loaded from build directory. Wine-Bug:
https://bugs.winehq.org/show_bug.cgi?id=51214
Signed-off-by: Bernhard Übelacker <bernhardu(a)mailbox.org> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/loader.c | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c index 14cc105b64d..cfec779dd59 100644 --- a/dlls/ntdll/loader.c +++ b/dlls/ntdll/loader.c @@ -2675,6 +2675,7 @@ static NTSTATUS find_builtin_without_file( const WCHAR *name, UNICODE_STRING *ne if (!get_env_var( L"WINEBUILDDIR", 20 + 2 * wcslen(name), new_name )) { + len = new_name->Length; RtlAppendUnicodeToString( new_name, L"\\dlls\\" ); RtlAppendUnicodeToString( new_name, name ); if ((ext = wcsrchr( name, '.' )) && !wcscmp( ext, L".dll" )) new_name->Length -= 4 * sizeof(WCHAR); @@ -2685,6 +2686,17 @@ static NTSTATUS find_builtin_without_file( const WCHAR *name, UNICODE_STRING *ne RtlAppendUnicodeToString( new_name, L".fake" ); status = open_dll_file( new_name, pwm, mapping, image_info, id ); if (status != STATUS_DLL_NOT_FOUND) goto done; + + new_name->Length = len; + RtlAppendUnicodeToString( new_name, L"\\programs\\" ); + RtlAppendUnicodeToString( new_name, name ); + RtlAppendUnicodeToString( new_name, L"\\" ); + RtlAppendUnicodeToString( new_name, name ); + status = open_dll_file( new_name, pwm, mapping, image_info, id ); + if (status != STATUS_DLL_NOT_FOUND) goto done; + RtlAppendUnicodeToString( new_name, L".fake" ); + status = open_dll_file( new_name, pwm, mapping, image_info, id ); + if (status != STATUS_DLL_NOT_FOUND) goto done; RtlFreeUnicodeString( new_name ); }
1
0
0
0
Qian Hong : server: Forbid shrinking files which are mapped to memory.
by Alexandre Julliard
29 Jun '21
29 Jun '21
Module: wine Branch: master Commit: be55038f3d139964de0daf2e7b6086b5de11a136 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=be55038f3d139964de0daf2e…
Author: Qian Hong <qhong(a)codeweavers.com> Date: Fri Jun 25 00:28:52 2021 -0500 server: Forbid shrinking files which are mapped to memory. Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/kernel32/tests/file.c | 18 +++++++++--------- server/fd.c | 26 ++++++++++++++++++-------- 2 files changed, 27 insertions(+), 17 deletions(-) diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c index c09438e09bd..ea0a32f258d 100644 --- a/dlls/kernel32/tests/file.c +++ b/dlls/kernel32/tests/file.c @@ -6052,11 +6052,11 @@ static void test_eof(void) SetLastError(0xdeadbeef); SetFilePointer(file, 6, NULL, SEEK_SET); ret = SetEndOfFile(file); - todo_wine ok(!ret, "expected failure\n"); - todo_wine ok(GetLastError() == ERROR_USER_MAPPED_FILE, "got error %u\n", GetLastError()); + ok(!ret, "expected failure\n"); + ok(GetLastError() == ERROR_USER_MAPPED_FILE, "got error %u\n", GetLastError()); ret = GetFileSizeEx(file, &file_size); ok(ret, "failed to get size, error %u\n", GetLastError()); - todo_wine ok(file_size.QuadPart == 8, "got size %I64d\n", file_size.QuadPart); + ok(file_size.QuadPart == 8, "got size %I64d\n", file_size.QuadPart); SetFilePointer(file, 8192, NULL, SEEK_SET); ret = SetEndOfFile(file); @@ -6067,11 +6067,11 @@ static void test_eof(void) SetFilePointer(file, 8191, NULL, SEEK_SET); ret = SetEndOfFile(file); - todo_wine ok(!ret, "expected failure\n"); - todo_wine ok(GetLastError() == ERROR_USER_MAPPED_FILE, "got error %u\n", GetLastError()); + ok(!ret, "expected failure\n"); + ok(GetLastError() == ERROR_USER_MAPPED_FILE, "got error %u\n", GetLastError()); ret = GetFileSizeEx(file, &file_size); ok(ret, "failed to get size, error %u\n", GetLastError()); - todo_wine ok(file_size.QuadPart == 8192, "got size %I64d\n", file_size.QuadPart); + ok(file_size.QuadPart == 8192, "got size %I64d\n", file_size.QuadPart); view = MapViewOfFile(mapping, map_tests[i].view_access, 0, 0, 4); ok(!!view, "failed to map view, error %u\n", GetLastError()); @@ -6087,11 +6087,11 @@ static void test_eof(void) SetFilePointer(file, 16383, NULL, SEEK_SET); ret = SetEndOfFile(file); - todo_wine ok(!ret, "expected failure\n"); - todo_wine ok(GetLastError() == ERROR_USER_MAPPED_FILE, "got error %u\n", GetLastError()); + ok(!ret, "expected failure\n"); + ok(GetLastError() == ERROR_USER_MAPPED_FILE, "got error %u\n", GetLastError()); ret = GetFileSizeEx(file, &file_size); ok(ret, "failed to get size, error %u\n", GetLastError()); - todo_wine ok(file_size.QuadPart == 16384, "got size %I64d\n", file_size.QuadPart); + ok(file_size.QuadPart == 16384, "got size %I64d\n", file_size.QuadPart); ret = UnmapViewOfFile(view); ok(ret, "failed to unmap view, error %u\n", GetLastError()); diff --git a/server/fd.c b/server/fd.c index 7204a8c51ba..b953da2ab85 100644 --- a/server/fd.c +++ b/server/fd.c @@ -2645,15 +2645,25 @@ static void set_fd_eof( struct fd *fd, file_pos_t eof ) set_error( fd->no_fd_status ); return; } - - /* first try normal truncate */ - if (ftruncate( fd->unix_fd, eof ) != -1) return; - - /* now check for the need to extend the file */ - if (fstat( fd->unix_fd, &st ) != -1 && eof > st.st_size) - grow_file( fd->unix_fd, eof ); - else + if (fstat( fd->unix_fd, &st) == -1) + { file_set_error(); + return; + } + if (eof < st.st_size) + { + struct fd *fd_ptr; + LIST_FOR_EACH_ENTRY( fd_ptr, &fd->inode->open, struct fd, inode_entry ) + { + if (fd_ptr->access & FILE_MAPPING_ACCESS) + { + set_error( STATUS_USER_MAPPED_FILE ); + return; + } + } + if (ftruncate( fd->unix_fd, eof ) == -1) file_set_error(); + } + else grow_file( fd->unix_fd, eof ); } struct completion *fd_get_completion( struct fd *fd, apc_param_t *p_key )
1
0
0
0
Qian Hong : ntdll: Truncate files through the server.
by Alexandre Julliard
29 Jun '21
29 Jun '21
Module: wine Branch: master Commit: 4e84a553a8f0e14dd9c36ea280003d8d96e6a9cd URL:
https://source.winehq.org/git/wine.git/?a=commit;h=4e84a553a8f0e14dd9c36ea2…
Author: Qian Hong <qhong(a)codeweavers.com> Date: Fri Jun 25 00:28:51 2021 -0500 ntdll: Truncate files through the server. Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/ntdll/unix/file.c | 23 +++++------------------ include/wine/server_protocol.h | 18 +++++++++++++++++- server/fd.c | 37 +++++++++++++++++++++++++++++++++++++ server/file.h | 1 + server/mapping.c | 2 +- server/protocol.def | 7 +++++++ server/request.h | 5 +++++ server/trace.c | 9 +++++++++ 8 files changed, 82 insertions(+), 20 deletions(-) diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c index 21f5d10f3f8..1a57a112a59 100644 --- a/dlls/ntdll/unix/file.c +++ b/dlls/ntdll/unix/file.c @@ -4360,28 +4360,15 @@ NTSTATUS WINAPI NtSetInformationFile( HANDLE handle, IO_STATUS_BLOCK *io, case FileEndOfFileInformation: if (len >= sizeof(FILE_END_OF_FILE_INFORMATION)) { - struct stat st; const FILE_END_OF_FILE_INFORMATION *info = ptr; - if ((io->u.Status = server_get_unix_fd( handle, 0, &fd, &needs_close, NULL, NULL ))) - return io->u.Status; - - /* first try normal truncate */ - if (ftruncate( fd, (off_t)info->EndOfFile.QuadPart ) != -1) break; - - /* now check for the need to extend the file */ - if (fstat( fd, &st ) != -1 && (off_t)info->EndOfFile.QuadPart > st.st_size) + SERVER_START_REQ( set_fd_eof_info ) { - static const char zero; - - /* extend the file one byte beyond the requested size and then truncate it */ - /* this should work around ftruncate implementations that can't extend files */ - if (pwrite( fd, &zero, 1, (off_t)info->EndOfFile.QuadPart ) != -1 && - ftruncate( fd, (off_t)info->EndOfFile.QuadPart ) != -1) break; + req->handle = wine_server_obj_handle( handle ); + req->eof = info->EndOfFile.QuadPart; + io->u.Status = wine_server_call( req ); } - io->u.Status = errno_to_status( errno ); - - if (needs_close) close( fd ); + SERVER_END_REQ; } else io->u.Status = STATUS_INVALID_PARAMETER_3; break; diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h index 58310a4d9a2..51ee6ee4aa3 100644 --- a/include/wine/server_protocol.h +++ b/include/wine/server_protocol.h @@ -5083,6 +5083,19 @@ struct set_fd_name_info_reply +struct set_fd_eof_info_request +{ + struct request_header __header; + obj_handle_t handle; + file_pos_t eof; +}; +struct set_fd_eof_info_reply +{ + struct reply_header __header; +}; + + + struct get_window_layered_info_request { struct request_header __header; @@ -5640,6 +5653,7 @@ enum request REQ_set_fd_completion_mode, REQ_set_fd_disp_info, REQ_set_fd_name_info, + REQ_set_fd_eof_info, REQ_get_window_layered_info, REQ_set_window_layered_info, REQ_alloc_user_handle, @@ -5919,6 +5933,7 @@ union generic_request struct set_fd_completion_mode_request set_fd_completion_mode_request; struct set_fd_disp_info_request set_fd_disp_info_request; struct set_fd_name_info_request set_fd_name_info_request; + struct set_fd_eof_info_request set_fd_eof_info_request; struct get_window_layered_info_request get_window_layered_info_request; struct set_window_layered_info_request set_window_layered_info_request; struct alloc_user_handle_request alloc_user_handle_request; @@ -6196,6 +6211,7 @@ union generic_reply struct set_fd_completion_mode_reply set_fd_completion_mode_reply; struct set_fd_disp_info_reply set_fd_disp_info_reply; struct set_fd_name_info_reply set_fd_name_info_reply; + struct set_fd_eof_info_reply set_fd_eof_info_reply; struct get_window_layered_info_reply get_window_layered_info_reply; struct set_window_layered_info_reply set_window_layered_info_reply; struct alloc_user_handle_reply alloc_user_handle_reply; @@ -6220,7 +6236,7 @@ union generic_reply /* ### protocol_version begin ### */ -#define SERVER_PROTOCOL_VERSION 717 +#define SERVER_PROTOCOL_VERSION 718 /* ### protocol_version end ### */ diff --git a/server/fd.c b/server/fd.c index e326354d127..7204a8c51ba 100644 --- a/server/fd.c +++ b/server/fd.c @@ -2630,6 +2630,32 @@ failed: free( name ); } +static void set_fd_eof( struct fd *fd, file_pos_t eof ) +{ + struct stat st; + + if (!fd->inode) + { + set_error( STATUS_OBJECT_TYPE_MISMATCH ); + return; + } + + if (fd->unix_fd == -1) + { + set_error( fd->no_fd_status ); + return; + } + + /* first try normal truncate */ + if (ftruncate( fd->unix_fd, eof ) != -1) return; + + /* now check for the need to extend the file */ + if (fstat( fd->unix_fd, &st ) != -1 && eof > st.st_size) + grow_file( fd->unix_fd, eof ); + else + file_set_error(); +} + struct completion *fd_get_completion( struct fd *fd, apc_param_t *p_key ) { *p_key = fd->comp_key; @@ -2922,3 +2948,14 @@ DECL_HANDLER(set_fd_name_info) } if (root_fd) release_object( root_fd ); } + +/* set fd eof information */ +DECL_HANDLER(set_fd_eof_info) +{ + struct fd *fd = get_handle_fd_obj( current->process, req->handle, 0 ); + if (fd) + { + set_fd_eof( fd, req->eof ); + release_object( fd ); + } +} diff --git a/server/file.h b/server/file.h index b8bc7645b19..10b5c0d0493 100644 --- a/server/file.h +++ b/server/file.h @@ -168,6 +168,7 @@ extern int is_file_executable( const char *name ); struct memory_view; +extern int grow_file( int unix_fd, file_pos_t new_size ); extern struct memory_view *find_mapped_view( struct process *process, client_ptr_t base ); extern struct memory_view *get_exe_view( struct process *process ); extern struct file *get_view_file( const struct memory_view *view, unsigned int access, unsigned int sharing ); diff --git a/server/mapping.c b/server/mapping.c index 529ce43bac9..2df337a172c 100644 --- a/server/mapping.c +++ b/server/mapping.c @@ -241,7 +241,7 @@ static void shared_map_destroy( struct object *obj ) } /* extend a file beyond the current end of file */ -static int grow_file( int unix_fd, file_pos_t new_size ) +int grow_file( int unix_fd, file_pos_t new_size ) { static const char zero; off_t size = new_size; diff --git a/server/protocol.def b/server/protocol.def index 5d165e7bfa4..557311e2b3f 100644 --- a/server/protocol.def +++ b/server/protocol.def @@ -3535,6 +3535,13 @@ struct handle_info @END +/* set fd eof information */ +@REQ(set_fd_eof_info) + obj_handle_t handle; /* handle to a file or directory */ + file_pos_t eof; /* offset of eof of file */ +@END + + /* Retrieve layered info for a window */ @REQ(get_window_layered_info) user_handle_t handle; /* handle to the window */ diff --git a/server/request.h b/server/request.h index defb3a640fd..0221cbd33ae 100644 --- a/server/request.h +++ b/server/request.h @@ -371,6 +371,7 @@ DECL_HANDLER(add_fd_completion); DECL_HANDLER(set_fd_completion_mode); DECL_HANDLER(set_fd_disp_info); DECL_HANDLER(set_fd_name_info); +DECL_HANDLER(set_fd_eof_info); DECL_HANDLER(get_window_layered_info); DECL_HANDLER(set_window_layered_info); DECL_HANDLER(alloc_user_handle); @@ -649,6 +650,7 @@ static const req_handler req_handlers[REQ_NB_REQUESTS] = (req_handler)req_set_fd_completion_mode, (req_handler)req_set_fd_disp_info, (req_handler)req_set_fd_name_info, + (req_handler)req_set_fd_eof_info, (req_handler)req_get_window_layered_info, (req_handler)req_set_window_layered_info, (req_handler)req_alloc_user_handle, @@ -2141,6 +2143,9 @@ C_ASSERT( FIELD_OFFSET(struct set_fd_name_info_request, namelen) == 20 ); C_ASSERT( FIELD_OFFSET(struct set_fd_name_info_request, link) == 24 ); C_ASSERT( FIELD_OFFSET(struct set_fd_name_info_request, replace) == 28 ); C_ASSERT( sizeof(struct set_fd_name_info_request) == 32 ); +C_ASSERT( FIELD_OFFSET(struct set_fd_eof_info_request, handle) == 12 ); +C_ASSERT( FIELD_OFFSET(struct set_fd_eof_info_request, eof) == 16 ); +C_ASSERT( sizeof(struct set_fd_eof_info_request) == 24 ); C_ASSERT( FIELD_OFFSET(struct get_window_layered_info_request, handle) == 12 ); C_ASSERT( sizeof(struct get_window_layered_info_request) == 16 ); C_ASSERT( FIELD_OFFSET(struct get_window_layered_info_reply, color_key) == 8 ); diff --git a/server/trace.c b/server/trace.c index 406be00008e..bbdf17feb1a 100644 --- a/server/trace.c +++ b/server/trace.c @@ -4355,6 +4355,12 @@ static void dump_set_fd_name_info_request( const struct set_fd_name_info_request dump_varargs_string( ", filename=", cur_size ); } +static void dump_set_fd_eof_info_request( const struct set_fd_eof_info_request *req ) +{ + fprintf( stderr, " handle=%04x", req->handle ); + dump_uint64( ", eof=", &req->eof ); +} + static void dump_get_window_layered_info_request( const struct get_window_layered_info_request *req ) { fprintf( stderr, " handle=%08x", req->handle ); @@ -4792,6 +4798,7 @@ static const dump_func req_dumpers[REQ_NB_REQUESTS] = { (dump_func)dump_set_fd_completion_mode_request, (dump_func)dump_set_fd_disp_info_request, (dump_func)dump_set_fd_name_info_request, + (dump_func)dump_set_fd_eof_info_request, (dump_func)dump_get_window_layered_info_request, (dump_func)dump_set_window_layered_info_request, (dump_func)dump_alloc_user_handle_request, @@ -5067,6 +5074,7 @@ static const dump_func reply_dumpers[REQ_NB_REQUESTS] = { NULL, NULL, NULL, + NULL, (dump_func)dump_get_window_layered_info_reply, NULL, (dump_func)dump_alloc_user_handle_reply, @@ -5342,6 +5350,7 @@ static const char * const req_names[REQ_NB_REQUESTS] = { "set_fd_completion_mode", "set_fd_disp_info", "set_fd_name_info", + "set_fd_eof_info", "get_window_layered_info", "set_window_layered_info", "alloc_user_handle",
1
0
0
0
Zebediah Figura : kernel32/tests: Add some tests for SetEndOfFile().
by Alexandre Julliard
29 Jun '21
29 Jun '21
Module: wine Branch: master Commit: 08c5e0106b0e5eb92a160ace97c5403d156c74c0 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=08c5e0106b0e5eb92a160ace…
Author: Zebediah Figura <z.figura12(a)gmail.com> Date: Fri Jun 25 00:28:50 2021 -0500 kernel32/tests: Add some tests for SetEndOfFile(). Signed-off-by: Zebediah Figura <z.figura12(a)gmail.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/kernel32/tests/file.c | 186 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 186 insertions(+) diff --git a/dlls/kernel32/tests/file.c b/dlls/kernel32/tests/file.c index 138f1e6c2d3..c09438e09bd 100644 --- a/dlls/kernel32/tests/file.c +++ b/dlls/kernel32/tests/file.c @@ -5924,6 +5924,191 @@ static void test_move_file(void) SetCurrentDirectoryA( cwd ); } +static void test_eof(void) +{ + char temp_path[MAX_PATH], filename[MAX_PATH], buffer[20]; + LARGE_INTEGER file_size; + HANDLE file, mapping; + unsigned int i; + void *view; + DWORD size; + BOOL ret; + + static const struct + { + DWORD protection; + DWORD view_access; + } + map_tests[] = + { + {PAGE_READONLY, FILE_MAP_READ}, + {PAGE_READWRITE, FILE_MAP_WRITE}, + }; + + GetTempPathA(sizeof(temp_path), temp_path); + GetTempFileNameA(temp_path, "eof", 0, filename); + + file = CreateFileA(filename, GENERIC_READ | GENERIC_WRITE | DELETE, 0, NULL, CREATE_ALWAYS, 0, 0); + ok(file != INVALID_HANDLE_VALUE, "failed to create file, error %u\n", GetLastError()); + + ret = GetFileSizeEx(file, &file_size); + ok(ret, "failed to get size, error %u\n", GetLastError()); + ok(!file_size.QuadPart, "got size %I64d\n", file_size.QuadPart); + + SetFilePointer(file, 2, NULL, SEEK_SET); + + ret = GetFileSizeEx(file, &file_size); + ok(ret, "failed to get size, error %u\n", GetLastError()); + ok(!file_size.QuadPart, "got size %I64d\n", file_size.QuadPart); + + ret = ReadFile(file, buffer, sizeof(buffer), &size, NULL); + ok(ret, "failed to read, error %u\n", GetLastError()); + ok(!size, "got size %u\n", size); + + ret = SetEndOfFile(file); + ok(ret, "failed to set EOF, error %u\n", GetLastError()); + + ret = GetFileSizeEx(file, &file_size); + ok(ret, "failed to get size, error %u\n", GetLastError()); + ok(file_size.QuadPart == 2, "got size %I64d\n", file_size.QuadPart); + + ret = WriteFile(file, "data", 4, &size, NULL); + ok(ret, "failed to write, error %u\n", GetLastError()); + ok(size == 4, "got size %u\n", size); + + ret = GetFileSizeEx(file, &file_size); + ok(ret, "failed to get size, error %u\n", GetLastError()); + ok(file_size.QuadPart == 6, "got size %I64d\n", file_size.QuadPart); + + SetFilePointer(file, 4, NULL, SEEK_SET); + ret = SetEndOfFile(file); + ok(ret, "failed to set EOF, error %u\n", GetLastError()); + + ret = GetFileSizeEx(file, &file_size); + ok(ret, "failed to get size, error %u\n", GetLastError()); + ok(file_size.QuadPart == 4, "got size %I64d\n", file_size.QuadPart); + + SetFilePointer(file, 0, NULL, SEEK_SET); + ret = ReadFile(file, buffer, sizeof(buffer), &size, NULL); + ok(ret, "failed to read, error %u\n", GetLastError()); + ok(size == 4, "got size %u\n", size); + ok(!memcmp(buffer, "\0\0da", 4), "wrong data\n"); + + SetFilePointer(file, 6, NULL, SEEK_SET); + ret = SetEndOfFile(file); + ok(ret, "failed to set EOF, error %u\n", GetLastError()); + + ret = GetFileSizeEx(file, &file_size); + ok(ret, "failed to get size, error %u\n", GetLastError()); + ok(file_size.QuadPart == 6, "got size %I64d\n", file_size.QuadPart); + + SetFilePointer(file, 0, NULL, SEEK_SET); + ret = ReadFile(file, buffer, sizeof(buffer), &size, NULL); + ok(ret, "failed to read, error %u\n", GetLastError()); + ok(size == 6, "got size %u\n", size); + ok(!memcmp(buffer, "\0\0da\0\0", 6), "wrong data\n"); + + ret = SetEndOfFile(file); + ok(ret, "failed to set EOF, error %u\n", GetLastError()); + + SetFilePointer(file, 2, NULL, SEEK_SET); + ret = WriteFile(file, "data", 4, &size, NULL); + ok(ret, "failed to write, error %u\n", GetLastError()); + ok(size == 4, "got size %u\n", size); + + ret = GetFileSizeEx(file, &file_size); + ok(ret, "failed to get size, error %u\n", GetLastError()); + ok(file_size.QuadPart == 6, "got size %I64d\n", file_size.QuadPart); + + SetFilePointer(file, 0, NULL, SEEK_SET); + ret = ReadFile(file, buffer, sizeof(buffer), &size, NULL); + ok(ret, "failed to read, error %u\n", GetLastError()); + ok(size == 6, "got size %u\n", size); + ok(!memcmp(buffer, "\0\0data", 6), "wrong data\n"); + + for (i = 0; i < ARRAY_SIZE(map_tests); ++i) + { + mapping = CreateFileMappingA(file, NULL, map_tests[i].protection, 0, 4, NULL); + ok(!!mapping, "failed to create mapping, error %u\n", GetLastError()); + + ret = GetFileSizeEx(file, &file_size); + ok(ret, "failed to get size, error %u\n", GetLastError()); + ok(file_size.QuadPart == 6, "got size %I64d\n", file_size.QuadPart); + + SetFilePointer(file, 6, NULL, SEEK_SET); + ret = SetEndOfFile(file); + ok(ret, "failed to set EOF, error %u\n", GetLastError()); + ret = GetFileSizeEx(file, &file_size); + ok(ret, "failed to get size, error %u\n", GetLastError()); + ok(file_size.QuadPart == 6, "got size %I64d\n", file_size.QuadPart); + + SetFilePointer(file, 8, NULL, SEEK_SET); + ret = SetEndOfFile(file); + ok(ret, "failed to set EOF, error %u\n", GetLastError()); + ret = GetFileSizeEx(file, &file_size); + ok(ret, "failed to get size, error %u\n", GetLastError()); + ok(file_size.QuadPart == 8, "got size %I64d\n", file_size.QuadPart); + + SetLastError(0xdeadbeef); + SetFilePointer(file, 6, NULL, SEEK_SET); + ret = SetEndOfFile(file); + todo_wine ok(!ret, "expected failure\n"); + todo_wine ok(GetLastError() == ERROR_USER_MAPPED_FILE, "got error %u\n", GetLastError()); + ret = GetFileSizeEx(file, &file_size); + ok(ret, "failed to get size, error %u\n", GetLastError()); + todo_wine ok(file_size.QuadPart == 8, "got size %I64d\n", file_size.QuadPart); + + SetFilePointer(file, 8192, NULL, SEEK_SET); + ret = SetEndOfFile(file); + ok(ret, "failed to set EOF, error %u\n", GetLastError()); + ret = GetFileSizeEx(file, &file_size); + ok(ret, "failed to get size, error %u\n", GetLastError()); + ok(file_size.QuadPart == 8192, "got size %I64d\n", file_size.QuadPart); + + SetFilePointer(file, 8191, NULL, SEEK_SET); + ret = SetEndOfFile(file); + todo_wine ok(!ret, "expected failure\n"); + todo_wine ok(GetLastError() == ERROR_USER_MAPPED_FILE, "got error %u\n", GetLastError()); + ret = GetFileSizeEx(file, &file_size); + ok(ret, "failed to get size, error %u\n", GetLastError()); + todo_wine ok(file_size.QuadPart == 8192, "got size %I64d\n", file_size.QuadPart); + + view = MapViewOfFile(mapping, map_tests[i].view_access, 0, 0, 4); + ok(!!view, "failed to map view, error %u\n", GetLastError()); + + CloseHandle(mapping); + + SetFilePointer(file, 16384, NULL, SEEK_SET); + ret = SetEndOfFile(file); + ok(ret, "failed to set EOF, error %u\n", GetLastError()); + ret = GetFileSizeEx(file, &file_size); + ok(ret, "failed to get size, error %u\n", GetLastError()); + ok(file_size.QuadPart == 16384, "got size %I64d\n", file_size.QuadPart); + + SetFilePointer(file, 16383, NULL, SEEK_SET); + ret = SetEndOfFile(file); + todo_wine ok(!ret, "expected failure\n"); + todo_wine ok(GetLastError() == ERROR_USER_MAPPED_FILE, "got error %u\n", GetLastError()); + ret = GetFileSizeEx(file, &file_size); + ok(ret, "failed to get size, error %u\n", GetLastError()); + todo_wine ok(file_size.QuadPart == 16384, "got size %I64d\n", file_size.QuadPart); + + ret = UnmapViewOfFile(view); + ok(ret, "failed to unmap view, error %u\n", GetLastError()); + + SetFilePointer(file, 6, NULL, SEEK_SET); + ret = SetEndOfFile(file); + ok(ret, "failed to set EOF, error %u\n", GetLastError()); + ret = GetFileSizeEx(file, &file_size); + ok(ret, "failed to get size, error %u\n", GetLastError()); + ok(file_size.QuadPart == 6, "got size %I64d\n", file_size.QuadPart); + } + + CloseHandle(file); + ret = DeleteFileA(filename); + ok(ret, "failed to delete %s, error %u\n", debugstr_a(filename), GetLastError()); +} + START_TEST(file) { char temp_path[MAX_PATH]; @@ -6001,4 +6186,5 @@ START_TEST(file) test_ReOpenFile(); test_hard_link(); test_move_file(); + test_eof(); }
1
0
0
0
Alexander Fischer : winhttp: Added stubs to function request_set_option.
by Alexandre Julliard
29 Jun '21
29 Jun '21
Module: wine Branch: master Commit: b9f012e14c180c992a60eb846a5e6a6fed354a48 URL:
https://source.winehq.org/git/wine.git/?a=commit;h=b9f012e14c180c992a60eb84…
Author: Alexander Fischer <fischeralex1993(a)gmail.com> Date: Sat Jun 26 15:25:38 2021 +0200 winhttp: Added stubs to function request_set_option. WINHTTP_OPTION_MAX_RESPONSE_DRAIN_SIZE and WINHTTP_OPTION_MAX_RESPONSE_HEADER_SIZE, (defined in include/winhttp.h) weren't handled yet, which caused 'Amazon Games App' downloads to fail. Signed-off-by: Alexander Fischer <fischeralex1993(a)gmail.com> Signed-off-by: Hans Leidekker <hans(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/winhttp/session.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/dlls/winhttp/session.c b/dlls/winhttp/session.c index dcea874306a..e4e8f1cec56 100644 --- a/dlls/winhttp/session.c +++ b/dlls/winhttp/session.c @@ -1041,6 +1041,14 @@ static BOOL request_set_option( struct object_header *hdr, DWORD option, void *b SetLastError(ERROR_INVALID_PARAMETER); return FALSE; + case WINHTTP_OPTION_MAX_RESPONSE_HEADER_SIZE: + FIXME("WINHTTP_OPTION_MAX_RESPONSE_HEADER_SIZE\n"); + return TRUE; + + case WINHTTP_OPTION_MAX_RESPONSE_DRAIN_SIZE: + FIXME("WINHTTP_OPTION_MAX_RESPONSE_DRAIN_SIZE\n"); + return TRUE; + default: FIXME("unimplemented option %u\n", option); SetLastError( ERROR_WINHTTP_INVALID_OPTION );
1
0
0
0
Paul Gofman : mshtml: Handle NULL nsstyle in HTMLWindow7_getComputedStyle().
by Alexandre Julliard
28 Jun '21
28 Jun '21
Module: wine Branch: master Commit: 362eed3ae30e17da64888407140334925499071c URL:
https://source.winehq.org/git/wine.git/?a=commit;h=362eed3ae30e17da64888407…
Author: Paul Gofman <pgofman(a)codeweavers.com> Date: Mon Jun 28 22:29:46 2021 +0300 mshtml: Handle NULL nsstyle in HTMLWindow7_getComputedStyle(). Signed-off-by: Paul Gofman <pgofman(a)codeweavers.com> Signed-off-by: Jacek Caban <jacek(a)codeweavers.com> Signed-off-by: Alexandre Julliard <julliard(a)winehq.org> --- dlls/mshtml/htmlwindow.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/dlls/mshtml/htmlwindow.c b/dlls/mshtml/htmlwindow.c index 4c57d457e41..0ca4cd6397e 100644 --- a/dlls/mshtml/htmlwindow.c +++ b/dlls/mshtml/htmlwindow.c @@ -2364,6 +2364,13 @@ static HRESULT WINAPI HTMLWindow7_getComputedStyle(IHTMLWindow7 *iface, IHTMLDOM return E_FAIL; } + if (!nsstyle) + { + FIXME("nsIDOMWindow_GetComputedStyle returned NULL nsstyle.\n"); + *p = NULL; + return S_OK; + } + hres = create_computed_style(nsstyle, dispex_compat_mode(&This->inner_window->event_target.dispex), p); nsIDOMCSSStyleDeclaration_Release(nsstyle); return hres;
1
0
0
0
← Newer
1
2
3
4
5
6
7
8
9
...
82
Older →
Jump to page:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
Results per page:
10
25
50
100
200