Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- 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
May 2019
- 96 participants
- 1957 messages
[PATCH v7 6/6] ntdll: Workaround NtAllocateVirtualMemory with zero_bits set to 1
by Rémi Bernon
Implement the correct zero_bits behavior for this single case:
* Limit the search in reserved areas to the lower 2G range,
* Pass the MAP_32BIT flag to mmap as a fallback.
LuaJIT <= v2.0.5 for example, when running in 64bit, allocates its
memory in the lower 2GB memory region by using the zero_bits parameter.
This will fix this particular scenario, while trying to minimize the
changes on all the other cases.
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
dlls/ntdll/tests/virtual.c | 1 -
dlls/ntdll/virtual.c | 35 +++++++++++++++++++++++++++--------
2 files changed, 27 insertions(+), 9 deletions(-)
diff --git a/dlls/ntdll/tests/virtual.c b/dlls/ntdll/tests/virtual.c
index e294688f1b3..3f140dc8313 100644
--- a/dlls/ntdll/tests/virtual.c
+++ b/dlls/ntdll/tests/virtual.c
@@ -55,7 +55,6 @@ static void test_AllocateVirtualMemory(void)
zero_bits = 1;
status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr2, 1, &size,
MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
- todo_wine
ok(((status == STATUS_SUCCESS || status == STATUS_NO_MEMORY) && ((UINT_PTR)addr2 >> (32 - zero_bits)) == 0) ||
broken(status == STATUS_INVALID_PARAMETER_3) /* winxp */,
"NtAllocateVirtualMemory returned %08x, addr2: %p\n", status, addr2);
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index a3ed96ff77f..84c9ec97ed3 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -1083,7 +1083,7 @@ static NTSTATUS map_fixed_area( void *base, size_t size, unsigned int vprot )
* The csVirtual section must be held by caller.
*/
static NTSTATUS map_view( struct file_view **view_ret, void *base, size_t size, size_t mask,
- int top_down, unsigned int vprot )
+ int top_down, unsigned int vprot, size_t zero_bits )
{
void *ptr;
NTSTATUS status;
@@ -1100,11 +1100,26 @@ static NTSTATUS map_view( struct file_view **view_ret, void *base, size_t size,
{
size_t view_size = size + mask + 1;
struct alloc_area alloc;
+ int flags = 0;
alloc.size = size;
alloc.mask = mask;
alloc.top_down = top_down;
alloc.limit = user_space_limit;
+
+#if defined(__x86_64__) && defined(MAP_32BIT)
+ /* HACK: only works for zero_bits == 1, this is a simple workaround
+ * for some 64bit code that tries to allocate memory in the lower
+ * 2GB segment using zero_bits parameter.
+ */
+ assert(zero_bits <= 1);
+ if (zero_bits == 1)
+ {
+ alloc.limit = (void*)(((~(UINT_PTR)0) >> (32 + zero_bits)) & ~0xffff);
+ flags = MAP_32BIT;
+ }
+#endif
+
if (wine_mmap_enum_reserved_areas( alloc_reserved_area_callback, &alloc, top_down ))
{
ptr = alloc.result;
@@ -1116,7 +1131,7 @@ static NTSTATUS map_view( struct file_view **view_ret, void *base, size_t size,
for (;;)
{
- if ((ptr = wine_anon_mmap( NULL, view_size, VIRTUAL_GetUnixProt(vprot), 0 )) == (void *)-1)
+ if ((ptr = wine_anon_mmap( NULL, view_size, VIRTUAL_GetUnixProt(vprot), flags )) == (void *)-1)
{
if (errno == ENOMEM) return STATUS_NO_MEMORY;
return STATUS_INVALID_PARAMETER;
@@ -1284,7 +1299,7 @@ static NTSTATUS allocate_dos_memory( struct file_view **view, unsigned int vprot
if (addr != low_64k)
{
if (addr != (void *)-1) munmap( addr, dosmem_size - 0x10000 );
- return map_view( view, NULL, dosmem_size, 0xffff, 0, vprot );
+ return map_view( view, NULL, dosmem_size, 0xffff, 0, vprot, 0 );
}
}
@@ -1388,11 +1403,11 @@ static NTSTATUS map_image( HANDLE hmapping, ACCESS_MASK access, int fd, SIZE_T m
if (base >= (char *)address_space_start) /* make sure the DOS area remains free */
status = map_view( &view, base, total_size, mask, FALSE, SEC_IMAGE | SEC_FILE |
- VPROT_COMMITTED | VPROT_READ | VPROT_EXEC | VPROT_WRITECOPY );
+ VPROT_COMMITTED | VPROT_READ | VPROT_EXEC | VPROT_WRITECOPY, 0 );
if (status != STATUS_SUCCESS)
status = map_view( &view, NULL, total_size, mask, FALSE, SEC_IMAGE | SEC_FILE |
- VPROT_COMMITTED | VPROT_READ | VPROT_EXEC | VPROT_WRITECOPY );
+ VPROT_COMMITTED | VPROT_READ | VPROT_EXEC | VPROT_WRITECOPY, 0 );
if (status != STATUS_SUCCESS) goto error;
@@ -1713,7 +1728,7 @@ NTSTATUS virtual_map_section( HANDLE handle, PVOID *addr_ptr, ULONG zero_bits, S
get_vprot_flags( protect, &vprot, sec_flags & SEC_IMAGE );
vprot |= sec_flags;
if (!(sec_flags & SEC_RESERVE)) vprot |= VPROT_COMMITTED;
- res = map_view( &view, *addr_ptr, size, mask, FALSE, vprot );
+ res = map_view( &view, *addr_ptr, size, mask, FALSE, vprot, 0 );
if (res)
{
server_leave_uninterrupted_section( &csVirtual, &sigset );
@@ -1946,7 +1961,7 @@ NTSTATUS virtual_alloc_thread_stack( TEB *teb, SIZE_T reserve_size, SIZE_T commi
server_enter_uninterrupted_section( &csVirtual, &sigset );
if ((status = map_view( &view, NULL, size + extra_size, 0xffff, 0,
- VPROT_READ | VPROT_WRITE | VPROT_COMMITTED )) != STATUS_SUCCESS)
+ VPROT_READ | VPROT_WRITE | VPROT_COMMITTED, 0 )) != STATUS_SUCCESS)
goto done;
#ifdef VALGRIND_STACK_REGISTER
@@ -2467,7 +2482,11 @@ NTSTATUS WINAPI NtAllocateVirtualMemory( HANDLE process, PVOID *ret, ULONG zero_
TRACE("%p %p %08lx %x %08x\n", process, *ret, size, type, protect );
if (!size) return STATUS_INVALID_PARAMETER;
+#if defined(__x86_64__) && !defined(MAP_32BIT)
if (zero_bits)
+#else
+ if (zero_bits > 1)
+#endif
{
FIXME("Unimplemented zero_bits handling\n");
return STATUS_INVALID_PARAMETER_3;
@@ -2569,7 +2588,7 @@ NTSTATUS virtual_alloc_aligned( PVOID *ret, ULONG zero_bits, SIZE_T *size_ptr,
if (vprot & VPROT_WRITECOPY) status = STATUS_INVALID_PAGE_PROTECTION;
else if (is_dos_memory) status = allocate_dos_memory( &view, vprot );
- else status = map_view( &view, base, size, mask, type & MEM_TOP_DOWN, vprot );
+ else status = map_view( &view, base, size, mask, type & MEM_TOP_DOWN, vprot, zero_bits );
if (status == STATUS_SUCCESS) base = view->base;
}
--
2.20.1
May 31, 2019
[PATCH v7 5/6] ntdll: Clarify NtAllocateVirtualMemory zero_bits parameter semantics
by Rémi Bernon
This parameter was misinterpreted as an alignment parameter for the
lower bits of the allocated memory region, although it is a constraint
on the higher bits.
Add a new internal ntdll virtual_alloc_aligned function that has a
separate alignment parameter which is now used instead of the zero_bits
parameter.
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
dlls/ntdll/directory.c | 4 ++--
dlls/ntdll/heap.c | 5 ++---
dlls/ntdll/ntdll_misc.h | 2 ++
dlls/ntdll/signal_arm.c | 12 ++++++------
dlls/ntdll/signal_arm64.c | 16 ++++++++--------
dlls/ntdll/signal_i386.c | 16 ++++++++--------
dlls/ntdll/signal_powerpc.c | 12 ++++++------
dlls/ntdll/signal_x86_64.c | 16 ++++++++--------
dlls/ntdll/tests/virtual.c | 3 ++-
dlls/ntdll/thread.c | 3 +--
dlls/ntdll/virtual.c | 33 ++++++++++++++++++++++++++-------
11 files changed, 71 insertions(+), 51 deletions(-)
diff --git a/dlls/ntdll/directory.c b/dlls/ntdll/directory.c
index bbdbbe9781f..6605999b824 100644
--- a/dlls/ntdll/directory.c
+++ b/dlls/ntdll/directory.c
@@ -1603,14 +1603,14 @@ static KERNEL_DIRENT *start_vfat_ioctl( int fd )
SIZE_T size = 2 * sizeof(*de) + page_size;
void *addr = NULL;
- if (NtAllocateVirtualMemory( GetCurrentProcess(), &addr, 1, &size, MEM_RESERVE, PAGE_READWRITE ))
+ if (virtual_alloc_aligned( &addr, 0, &size, MEM_RESERVE, PAGE_READWRITE, 1 ))
return NULL;
/* commit only the size needed for the dir entries */
/* this leaves an extra unaccessible page, which should make the kernel */
/* fail with -EFAULT before it stomps all over our memory */
de = addr;
size = 2 * sizeof(*de);
- NtAllocateVirtualMemory( GetCurrentProcess(), &addr, 1, &size, MEM_COMMIT, PAGE_READWRITE );
+ virtual_alloc_aligned( &addr, 0, &size, MEM_COMMIT, PAGE_READWRITE, 1 );
}
/* set d_reclen to 65535 to work around an AFS kernel bug */
diff --git a/dlls/ntdll/heap.c b/dlls/ntdll/heap.c
index cccaaee1d45..2d2caf551e3 100644
--- a/dlls/ntdll/heap.c
+++ b/dlls/ntdll/heap.c
@@ -726,8 +726,7 @@ static void *allocate_large_block( HEAP *heap, DWORD flags, SIZE_T size )
LPVOID address = NULL;
if (block_size < size) return NULL; /* overflow */
- if (NtAllocateVirtualMemory( NtCurrentProcess(), &address, 5,
- &block_size, MEM_COMMIT, get_protection_type( flags ) ))
+ if (virtual_alloc_aligned( &address, 0, &block_size, MEM_COMMIT, get_protection_type( flags ), 5 ))
{
WARN("Could not allocate block for %08lx bytes\n", size );
return NULL;
@@ -1521,7 +1520,7 @@ void heap_set_debug_flags( HANDLE handle )
void *ptr = NULL;
SIZE_T size = MAX_FREE_PENDING * sizeof(*heap->pending_free);
- if (!NtAllocateVirtualMemory( NtCurrentProcess(), &ptr, 4, &size, MEM_COMMIT, PAGE_READWRITE ))
+ if (!virtual_alloc_aligned( &ptr, 0, &size, MEM_COMMIT, PAGE_READWRITE, 4 ))
{
heap->pending_free = ptr;
heap->pending_pos = 0;
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h
index 2d83f541bd5..ae0e6b5742c 100644
--- a/dlls/ntdll/ntdll_misc.h
+++ b/dlls/ntdll/ntdll_misc.h
@@ -168,6 +168,8 @@ extern NTSTATUS nt_to_unix_file_name_attr( const OBJECT_ATTRIBUTES *attr, ANSI_S
UINT disposition ) DECLSPEC_HIDDEN;
/* virtual memory */
+extern NTSTATUS virtual_alloc_aligned( PVOID *ret, ULONG zero_bits, SIZE_T *size_ptr,
+ ULONG type, ULONG protect, ULONG alignment );
extern NTSTATUS virtual_map_section( HANDLE handle, PVOID *addr_ptr, ULONG zero_bits, SIZE_T commit_size,
const LARGE_INTEGER *offset_ptr, SIZE_T *size_ptr, ULONG protect,
pe_image_info_t *image_info ) DECLSPEC_HIDDEN;
diff --git a/dlls/ntdll/signal_arm.c b/dlls/ntdll/signal_arm.c
index e01c8ce2193..cf7f2d13160 100644
--- a/dlls/ntdll/signal_arm.c
+++ b/dlls/ntdll/signal_arm.c
@@ -967,22 +967,22 @@ int CDECL __wine_set_signal_handler(unsigned int sig, wine_signal_handler wsh)
*/
NTSTATUS signal_alloc_thread( TEB **teb )
{
- static size_t sigstack_zero_bits;
+ static size_t sigstack_alignment;
SIZE_T size;
NTSTATUS status;
- if (!sigstack_zero_bits)
+ if (!sigstack_alignment)
{
size_t min_size = page_size;
/* find the first power of two not smaller than min_size */
- while ((1u << sigstack_zero_bits) < min_size) sigstack_zero_bits++;
+ while ((1u << sigstack_alignment) < min_size) sigstack_alignment++;
assert( sizeof(TEB) <= min_size );
}
- size = 1 << sigstack_zero_bits;
+ size = 1 << sigstack_alignment;
*teb = NULL;
- if (!(status = NtAllocateVirtualMemory( NtCurrentProcess(), (void **)teb, sigstack_zero_bits,
- &size, MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE )))
+ if (!(status = virtual_alloc_aligned( (void **)teb, 0, &size, MEM_COMMIT | MEM_TOP_DOWN,
+ PAGE_READWRITE, sigstack_alignment )))
{
(*teb)->Tib.Self = &(*teb)->Tib;
(*teb)->Tib.ExceptionList = (void *)~0UL;
diff --git a/dlls/ntdll/signal_arm64.c b/dlls/ntdll/signal_arm64.c
index 94520c95ced..d2d43b34bc1 100644
--- a/dlls/ntdll/signal_arm64.c
+++ b/dlls/ntdll/signal_arm64.c
@@ -871,24 +871,24 @@ int CDECL __wine_set_signal_handler(unsigned int sig, wine_signal_handler wsh)
*/
NTSTATUS signal_alloc_thread( TEB **teb )
{
- static size_t sigstack_zero_bits;
+ static size_t sigstack_alignment;
SIZE_T size;
NTSTATUS status;
- if (!sigstack_zero_bits)
+ if (!sigstack_alignment)
{
size_t min_size = teb_size + max( MINSIGSTKSZ, 8192 );
/* find the first power of two not smaller than min_size */
- sigstack_zero_bits = 12;
- while ((1u << sigstack_zero_bits) < min_size) sigstack_zero_bits++;
- signal_stack_size = (1 << sigstack_zero_bits) - teb_size;
+ sigstack_alignment = 12;
+ while ((1u << sigstack_alignment) < min_size) sigstack_alignment++;
+ signal_stack_size = (1 << sigstack_alignment) - teb_size;
assert( sizeof(TEB) <= teb_size );
}
- size = 1 << sigstack_zero_bits;
+ size = 1 << sigstack_alignment;
*teb = NULL;
- if (!(status = NtAllocateVirtualMemory( NtCurrentProcess(), (void **)teb, sigstack_zero_bits,
- &size, MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE )))
+ if (!(status = virtual_alloc_aligned( (void **)teb, 0, &size, MEM_COMMIT | MEM_TOP_DOWN,
+ PAGE_READWRITE, sigstack_alignment )))
{
(*teb)->Tib.Self = &(*teb)->Tib;
(*teb)->Tib.ExceptionList = (void *)~0UL;
diff --git a/dlls/ntdll/signal_i386.c b/dlls/ntdll/signal_i386.c
index b4e88d125f1..b2925062bf7 100644
--- a/dlls/ntdll/signal_i386.c
+++ b/dlls/ntdll/signal_i386.c
@@ -2312,25 +2312,25 @@ static void ldt_unlock(void)
*/
NTSTATUS signal_alloc_thread( TEB **teb )
{
- static size_t sigstack_zero_bits;
+ static size_t sigstack_alignment;
struct x86_thread_data *thread_data;
SIZE_T size;
void *addr = NULL;
NTSTATUS status;
- if (!sigstack_zero_bits)
+ if (!sigstack_alignment)
{
size_t min_size = teb_size + max( MINSIGSTKSZ, 8192 );
/* find the first power of two not smaller than min_size */
- sigstack_zero_bits = 12;
- while ((1u << sigstack_zero_bits) < min_size) sigstack_zero_bits++;
- signal_stack_mask = (1 << sigstack_zero_bits) - 1;
- signal_stack_size = (1 << sigstack_zero_bits) - teb_size;
+ sigstack_alignment = 12;
+ while ((1u << sigstack_alignment) < min_size) sigstack_alignment++;
+ signal_stack_mask = (1 << sigstack_alignment) - 1;
+ signal_stack_size = (1 << sigstack_alignment) - teb_size;
}
size = signal_stack_mask + 1;
- if (!(status = NtAllocateVirtualMemory( NtCurrentProcess(), &addr, sigstack_zero_bits,
- &size, MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE )))
+ if (!(status = virtual_alloc_aligned( &addr, 0, &size, MEM_COMMIT | MEM_TOP_DOWN,
+ PAGE_READWRITE, sigstack_alignment )))
{
*teb = addr;
(*teb)->Tib.Self = &(*teb)->Tib;
diff --git a/dlls/ntdll/signal_powerpc.c b/dlls/ntdll/signal_powerpc.c
index 86398d8f54f..f23265445df 100644
--- a/dlls/ntdll/signal_powerpc.c
+++ b/dlls/ntdll/signal_powerpc.c
@@ -1018,22 +1018,22 @@ int CDECL __wine_set_signal_handler(unsigned int sig, wine_signal_handler wsh)
*/
NTSTATUS signal_alloc_thread( TEB **teb )
{
- static size_t sigstack_zero_bits;
+ static size_t sigstack_alignment;
SIZE_T size;
NTSTATUS status;
- if (!sigstack_zero_bits)
+ if (!sigstack_alignment)
{
size_t min_size = page_size; /* this is just for the TEB, we don't use a signal stack yet */
/* find the first power of two not smaller than min_size */
- while ((1u << sigstack_zero_bits) < min_size) sigstack_zero_bits++;
+ while ((1u << sigstack_alignment) < min_size) sigstack_alignment++;
assert( sizeof(TEB) <= min_size );
}
- size = 1 << sigstack_zero_bits;
+ size = 1 << sigstack_alignment;
*teb = NULL;
- if (!(status = NtAllocateVirtualMemory( NtCurrentProcess(), (void **)teb, sigstack_zero_bits,
- &size, MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE )))
+ if (!(status = virtual_alloc_aligned( (void **)teb, 0, &size, MEM_COMMIT | MEM_TOP_DOWN,
+ PAGE_READWRITE, sigstack_alignment )))
{
(*teb)->Tib.Self = &(*teb)->Tib;
(*teb)->Tib.ExceptionList = (void *)~0UL;
diff --git a/dlls/ntdll/signal_x86_64.c b/dlls/ntdll/signal_x86_64.c
index c2151f78c63..e56534068ff 100644
--- a/dlls/ntdll/signal_x86_64.c
+++ b/dlls/ntdll/signal_x86_64.c
@@ -3263,24 +3263,24 @@ int CDECL __wine_set_signal_handler(unsigned int sig, wine_signal_handler wsh)
*/
NTSTATUS signal_alloc_thread( TEB **teb )
{
- static size_t sigstack_zero_bits;
+ static size_t sigstack_alignment;
SIZE_T size;
NTSTATUS status;
- if (!sigstack_zero_bits)
+ if (!sigstack_alignment)
{
size_t min_size = teb_size + max( MINSIGSTKSZ, 8192 );
/* find the first power of two not smaller than min_size */
- sigstack_zero_bits = 12;
- while ((1u << sigstack_zero_bits) < min_size) sigstack_zero_bits++;
- signal_stack_size = (1 << sigstack_zero_bits) - teb_size;
+ sigstack_alignment = 12;
+ while ((1u << sigstack_alignment) < min_size) sigstack_alignment++;
+ signal_stack_size = (1 << sigstack_alignment) - teb_size;
assert( sizeof(TEB) <= teb_size );
}
- size = 1 << sigstack_zero_bits;
+ size = 1 << sigstack_alignment;
*teb = NULL;
- if (!(status = NtAllocateVirtualMemory( NtCurrentProcess(), (void **)teb, sigstack_zero_bits,
- &size, MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE )))
+ if (!(status = virtual_alloc_aligned( (void **)teb, 0, &size, MEM_COMMIT | MEM_TOP_DOWN,
+ PAGE_READWRITE, sigstack_alignment )))
{
(*teb)->Tib.Self = &(*teb)->Tib;
(*teb)->Tib.ExceptionList = (void *)~0UL;
diff --git a/dlls/ntdll/tests/virtual.c b/dlls/ntdll/tests/virtual.c
index 25cd36bd028..e294688f1b3 100644
--- a/dlls/ntdll/tests/virtual.c
+++ b/dlls/ntdll/tests/virtual.c
@@ -55,6 +55,7 @@ static void test_AllocateVirtualMemory(void)
zero_bits = 1;
status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr2, 1, &size,
MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
+ todo_wine
ok(((status == STATUS_SUCCESS || status == STATUS_NO_MEMORY) && ((UINT_PTR)addr2 >> (32 - zero_bits)) == 0) ||
broken(status == STATUS_INVALID_PARAMETER_3) /* winxp */,
"NtAllocateVirtualMemory returned %08x, addr2: %p\n", status, addr2);
@@ -71,7 +72,7 @@ static void test_AllocateVirtualMemory(void)
addr2 = NULL;
status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr2, zero_bits, &size,
MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
- todo_wine_if(zero_bits >= 12 || ((UINT_PTR)addr2 >> (32 - zero_bits)))
+ todo_wine
ok(((status == STATUS_SUCCESS || status == STATUS_NO_MEMORY) && ((UINT_PTR)addr2 >> (32 - zero_bits)) == 0) ||
broken(zero_bits == 20 && status == STATUS_CONFLICTING_ADDRESSES) /* w1064v1809 */,
"NtAllocateVirtualMemory with %d zero_bits returned %08x, addr2: %p\n", zero_bits, status, addr2);
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index 46de839400d..96aa6be7f2c 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -184,8 +184,7 @@ void thread_init(void)
addr = NULL;
size = sizeof(*peb);
- NtAllocateVirtualMemory( NtCurrentProcess(), &addr, 1, &size,
- MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE );
+ virtual_alloc_aligned( &addr, 0, &size, MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE, 1 );
peb = addr;
peb->FastPebLock = &peb_lock;
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index 78973a8cda4..a3ed96ff77f 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -2461,19 +2461,17 @@ void virtual_set_large_address_space(void)
NTSTATUS WINAPI NtAllocateVirtualMemory( HANDLE process, PVOID *ret, ULONG zero_bits,
SIZE_T *size_ptr, ULONG type, ULONG protect )
{
- void *base;
- unsigned int vprot;
SIZE_T size = *size_ptr;
- SIZE_T mask = get_mask( zero_bits );
NTSTATUS status = STATUS_SUCCESS;
- BOOL is_dos_memory = FALSE;
- struct file_view *view;
- sigset_t sigset;
TRACE("%p %p %08lx %x %08x\n", process, *ret, size, type, protect );
if (!size) return STATUS_INVALID_PARAMETER;
- if (!mask) return STATUS_INVALID_PARAMETER_3;
+ if (zero_bits)
+ {
+ FIXME("Unimplemented zero_bits handling\n");
+ return STATUS_INVALID_PARAMETER_3;
+ }
if (process != NtCurrentProcess())
{
@@ -2499,6 +2497,27 @@ NTSTATUS WINAPI NtAllocateVirtualMemory( HANDLE process, PVOID *ret, ULONG zero_
return result.virtual_alloc.status;
}
+ return virtual_alloc_aligned( ret, zero_bits, size_ptr, type, protect, 0 );
+}
+
+
+/***********************************************************************
+ * virtual_alloc_aligned (NTDLL.@)
+ *
+ * Same as NtAllocateVirtualMemory but with an alignment parameter
+ */
+NTSTATUS virtual_alloc_aligned( PVOID *ret, ULONG zero_bits, SIZE_T *size_ptr,
+ ULONG type, ULONG protect, ULONG alignment )
+{
+ void *base;
+ unsigned int vprot;
+ SIZE_T size = *size_ptr;
+ SIZE_T mask = get_mask( alignment );
+ NTSTATUS status = STATUS_SUCCESS;
+ BOOL is_dos_memory = FALSE;
+ struct file_view *view;
+ sigset_t sigset;
+
/* Round parameters to a page boundary */
if (is_beyond_limit( 0, size, working_set_limit )) return STATUS_WORKING_SET_LIMIT_RANGE;
--
2.20.1
May 31, 2019
[PATCH v7 4/6] commdlg: Allocate memory using VirtualAlloc instead of NtAllocateVirtualMemory
by Rémi Bernon
NtAllocateVirtualMemory was called for its zero_bits parameter, used
as an alignment value. But it is not, so call VirtualAlloc instead.
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
dlls/commdlg.dll16/filedlg.c | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/dlls/commdlg.dll16/filedlg.c b/dlls/commdlg.dll16/filedlg.c
index 5b72bfab100..050cddb0dd5 100644
--- a/dlls/commdlg.dll16/filedlg.c
+++ b/dlls/commdlg.dll16/filedlg.c
@@ -509,8 +509,7 @@ static LPOFNHOOKPROC alloc_hook( LPOFNHOOKPROC16 hook16 )
SIZE_T size = 0x1000;
unsigned int i;
- if (!hooks && NtAllocateVirtualMemory( GetCurrentProcess(), (void **)&hooks, 12, &size,
- MEM_COMMIT, PAGE_EXECUTE_READWRITE ))
+ if (!hooks && !(hooks = VirtualAlloc( NULL, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE )))
return NULL;
for (i = 0; i < count; i++)
--
2.20.1
May 31, 2019
[PATCH v7 3/6] ntdll/tests: Add NtAllocateVirtualMemory tests for zero_bits behavior
by Rémi Bernon
The zero_bits parameter doesn't behave as expected, and some 64bit code
use it to allocate memory in the lower 32bit address space.
The expected full behaviour is:
* zero_bits == 0: no constraint on address range
* 0 < zero_bits <= 15: returned address should have as many upper bits
set to 0, starting at bit 31. In 64bit mode,
upper 32bits should all be 0 as well.
* 15 < zero_bits <= 31: unsure, but probably same as zero_bits == 15.
* zero_bits > 31: (64bit/WoW64 only) zero_bits behaves as a bitmask, as
if it was set to the number of leading 0 in the
bitmask, works in the whole 64bit range.
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
dlls/ntdll/tests/virtual.c | 67 ++++++++++++++++++++++++++++++++++++++
1 file changed, 67 insertions(+)
diff --git a/dlls/ntdll/tests/virtual.c b/dlls/ntdll/tests/virtual.c
index 0434c29af31..25cd36bd028 100644
--- a/dlls/ntdll/tests/virtual.c
+++ b/dlls/ntdll/tests/virtual.c
@@ -11,11 +11,15 @@
#include "excpt.h"
#include "wine/test.h"
+static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL);
+
static void test_AllocateVirtualMemory(void)
{
void *addr1, *addr2;
NTSTATUS status;
SIZE_T size;
+ ULONG zero_bits;
+ BOOL is_wow64;
/* simple allocation should success */
size = 0x1000;
@@ -45,6 +49,40 @@ static void test_AllocateVirtualMemory(void)
ok(status == STATUS_SUCCESS, "NtFreeVirtualMemory return %08x, addr2: %p\n", status, addr2);
}
+ /* 1 zero bits should zero 63-31 upper bits */
+ size = 0x1000;
+ addr2 = NULL;
+ zero_bits = 1;
+ status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr2, 1, &size,
+ MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
+ ok(((status == STATUS_SUCCESS || status == STATUS_NO_MEMORY) && ((UINT_PTR)addr2 >> (32 - zero_bits)) == 0) ||
+ broken(status == STATUS_INVALID_PARAMETER_3) /* winxp */,
+ "NtAllocateVirtualMemory returned %08x, addr2: %p\n", status, addr2);
+ if (status == STATUS_SUCCESS)
+ {
+ size = 0;
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr2, &size, MEM_RELEASE);
+ ok(status == STATUS_SUCCESS, "NtFreeVirtualMemory return %08x, addr2: %p\n", status, addr2);
+ }
+
+ for (zero_bits = 2; zero_bits <= 20; zero_bits++)
+ {
+ size = 0x1000;
+ addr2 = NULL;
+ status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr2, zero_bits, &size,
+ MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
+ todo_wine_if(zero_bits >= 12 || ((UINT_PTR)addr2 >> (32 - zero_bits)))
+ ok(((status == STATUS_SUCCESS || status == STATUS_NO_MEMORY) && ((UINT_PTR)addr2 >> (32 - zero_bits)) == 0) ||
+ broken(zero_bits == 20 && status == STATUS_CONFLICTING_ADDRESSES) /* w1064v1809 */,
+ "NtAllocateVirtualMemory with %d zero_bits returned %08x, addr2: %p\n", zero_bits, status, addr2);
+ if (status == STATUS_SUCCESS)
+ {
+ size = 0;
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr2, &size, MEM_RELEASE);
+ ok(status == STATUS_SUCCESS, "NtFreeVirtualMemory return %08x, addr2: %p\n", status, addr2);
+ }
+ }
+
/* 21 zero bits never succeeds */
size = 0x1000;
addr2 = NULL;
@@ -74,6 +112,31 @@ static void test_AllocateVirtualMemory(void)
ok(status == STATUS_SUCCESS, "NtFreeVirtualMemory return %08x, addr2: %p\n", status, addr2);
}
+ /* zero bits > 31 should be considered as bitmask on 64bit and WoW64 */
+ size = 0x1000;
+ addr2 = NULL;
+ zero_bits = 0x1fffffff;
+ status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr2, zero_bits, &size,
+ MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
+
+ if (sizeof(void *) == sizeof(int) && (!pIsWow64Process ||
+ !pIsWow64Process(NtCurrentProcess(), &is_wow64) || !is_wow64))
+ {
+ ok(status == STATUS_INVALID_PARAMETER_3, "NtAllocateVirtualMemory returned %08x\n", status);
+ }
+ else
+ {
+ todo_wine
+ ok((status == STATUS_SUCCESS || status == STATUS_NO_MEMORY) && ((UINT_PTR)addr2 & ~zero_bits) == 0,
+ "NtAllocateVirtualMemory returned %08x, addr2: %p\n", status, addr2);
+ if (status == STATUS_SUCCESS)
+ {
+ size = 0;
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr2, &size, MEM_RELEASE);
+ ok(status == STATUS_SUCCESS, "NtFreeVirtualMemory return %08x, addr2: %p\n", status, addr2);
+ }
+ }
+
/* AT_ROUND_TO_PAGE flag is not supported for NtAllocateVirtualMemory */
size = 0x1000;
addr2 = (char *)addr1 + 0x1000;
@@ -90,6 +153,10 @@ static void test_AllocateVirtualMemory(void)
START_TEST(virtual)
{
SYSTEM_BASIC_INFORMATION sbi;
+ HMODULE hkernel32;
+
+ hkernel32 = GetModuleHandleA("kernel32.dll");
+ pIsWow64Process = (void *)GetProcAddress(hkernel32, "IsWow64Process");
NtQuerySystemInformation(SystemBasicInformation, &sbi, sizeof(sbi), NULL);
trace("system page size %#x\n", sbi.PageSize);
--
2.20.1
May 31, 2019
[PATCH v7 2/6] ntdll/tests: Move NtAllocateVirtualMemory tests that were in kernel32
by Rémi Bernon
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
dlls/kernel32/tests/virtual.c | 49 ------------------
dlls/ntdll/tests/Makefile.in | 3 +-
dlls/ntdll/tests/virtual.c | 98 +++++++++++++++++++++++++++++++++++
3 files changed, 100 insertions(+), 50 deletions(-)
create mode 100644 dlls/ntdll/tests/virtual.c
diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c
index d797df26f6c..0b718606d0e 100644
--- a/dlls/kernel32/tests/virtual.c
+++ b/dlls/kernel32/tests/virtual.c
@@ -52,8 +52,6 @@ static ULONG (WINAPI *pRtlRemoveVectoredExceptionHandler)(PVOID);
static BOOL (WINAPI *pGetProcessDEPPolicy)(HANDLE, LPDWORD, PBOOL);
static BOOL (WINAPI *pIsWow64Process)(HANDLE, PBOOL);
static NTSTATUS (WINAPI *pNtProtectVirtualMemory)(HANDLE, PVOID *, SIZE_T *, ULONG, ULONG *);
-static NTSTATUS (WINAPI *pNtAllocateVirtualMemory)(HANDLE, PVOID *, ULONG, SIZE_T *, ULONG, ULONG);
-static NTSTATUS (WINAPI *pNtFreeVirtualMemory)(HANDLE, PVOID *, SIZE_T *, ULONG);
/* ############################### */
@@ -230,8 +228,6 @@ static void test_VirtualAlloc(void)
void *addr1, *addr2;
DWORD old_prot;
MEMORY_BASIC_INFORMATION info;
- NTSTATUS status;
- SIZE_T size;
SetLastError(0xdeadbeef);
addr1 = VirtualAlloc(0, 0, MEM_RESERVE, PAGE_NOACCESS);
@@ -440,55 +436,12 @@ static void test_VirtualAlloc(void)
addr2 = VirtualAlloc(addr1, 0x1000, MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
ok(addr2 == addr1, "VirtualAlloc returned %p, expected %p\n", addr2, addr1);
- /* allocation conflicts because of 64k align */
- size = 0x1000;
- addr2 = (char *)addr1 + 0x1000;
- status = pNtAllocateVirtualMemory(GetCurrentProcess(), &addr2, 0, &size,
- MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
- ok(status == STATUS_CONFLICTING_ADDRESSES, "NtAllocateVirtualMemory returned %08x\n", status);
-
- /* it should conflict, even when zero_bits is explicitly set */
- size = 0x1000;
- addr2 = (char *)addr1 + 0x1000;
- status = pNtAllocateVirtualMemory(GetCurrentProcess(), &addr2, 12, &size,
- MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
- todo_wine
- ok(status == STATUS_CONFLICTING_ADDRESSES, "NtAllocateVirtualMemory returned %08x\n", status);
- if (status == STATUS_SUCCESS) ok(VirtualFree(addr2, 0, MEM_RELEASE), "VirtualFree failed\n");
-
- /* 21 zero bits never succeeds */
- size = 0x1000;
- addr2 = NULL;
- status = pNtAllocateVirtualMemory(GetCurrentProcess(), &addr2, 21, &size,
- MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
- todo_wine
- ok(status == STATUS_NO_MEMORY || status == STATUS_INVALID_PARAMETER,
- "NtAllocateVirtualMemory returned %08x\n", status);
- if (status == STATUS_SUCCESS) ok(VirtualFree(addr2, 0, MEM_RELEASE), "VirtualFree failed\n");
-
- /* 22 zero bits is invalid */
- size = 0x1000;
- addr2 = NULL;
- status = pNtAllocateVirtualMemory(GetCurrentProcess(), &addr2, 22, &size,
- MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
- ok(status == STATUS_INVALID_PARAMETER_3 || status == STATUS_INVALID_PARAMETER,
- "NtAllocateVirtualMemory returned %08x\n", status);
- if (status == STATUS_SUCCESS) ok(VirtualFree(addr2, 0, MEM_RELEASE), "VirtualFree failed\n");
-
/* AT_ROUND_TO_PAGE flag is not supported for VirtualAlloc */
SetLastError(0xdeadbeef);
addr2 = VirtualAlloc(addr1, 0x1000, MEM_RESERVE | MEM_COMMIT | AT_ROUND_TO_PAGE, PAGE_EXECUTE_READWRITE);
ok(!addr2, "VirtualAlloc unexpectedly succeeded\n");
ok(GetLastError() == ERROR_INVALID_PARAMETER, "got %d, expected ERROR_INVALID_PARAMETER\n", GetLastError());
- /* AT_ROUND_TO_PAGE flag is not supported for NtAllocateVirtualMemory */
- size = 0x1000;
- addr2 = (char *)addr1 + 0x1000;
- status = pNtAllocateVirtualMemory(GetCurrentProcess(), &addr2, 0, &size, MEM_RESERVE |
- MEM_COMMIT | AT_ROUND_TO_PAGE, PAGE_EXECUTE_READWRITE);
- ok(status == STATUS_INVALID_PARAMETER_5 || status == STATUS_INVALID_PARAMETER,
- "NtAllocateVirtualMemory returned %08x\n", status);
-
ok(VirtualFree(addr1, 0, MEM_RELEASE), "VirtualFree failed\n");
}
@@ -4438,8 +4391,6 @@ START_TEST(virtual)
pRtlAddVectoredExceptionHandler = (void *)GetProcAddress( hntdll, "RtlAddVectoredExceptionHandler" );
pRtlRemoveVectoredExceptionHandler = (void *)GetProcAddress( hntdll, "RtlRemoveVectoredExceptionHandler" );
pNtProtectVirtualMemory = (void *)GetProcAddress( hntdll, "NtProtectVirtualMemory" );
- pNtAllocateVirtualMemory = (void *)GetProcAddress( hntdll, "NtAllocateVirtualMemory" );
- pNtFreeVirtualMemory = (void *)GetProcAddress( hntdll, "NtFreeVirtualMemory" );
GetSystemInfo(&si);
trace("system page size %#x\n", si.dwPageSize);
diff --git a/dlls/ntdll/tests/Makefile.in b/dlls/ntdll/tests/Makefile.in
index 5c70f3f01a0..ed15c51339f 100644
--- a/dlls/ntdll/tests/Makefile.in
+++ b/dlls/ntdll/tests/Makefile.in
@@ -22,4 +22,5 @@ C_SRCS = \
rtlstr.c \
string.c \
threadpool.c \
- time.c
+ time.c \
+ virtual.c
diff --git a/dlls/ntdll/tests/virtual.c b/dlls/ntdll/tests/virtual.c
new file mode 100644
index 00000000000..0434c29af31
--- /dev/null
+++ b/dlls/ntdll/tests/virtual.c
@@ -0,0 +1,98 @@
+#include <stdio.h>
+
+#include "ntstatus.h"
+#define WIN32_NO_STATUS
+#include "windef.h"
+#include "winbase.h"
+#include "winnt.h"
+#include "winternl.h"
+#include "winerror.h"
+#include "winuser.h"
+#include "excpt.h"
+#include "wine/test.h"
+
+static void test_AllocateVirtualMemory(void)
+{
+ void *addr1, *addr2;
+ NTSTATUS status;
+ SIZE_T size;
+
+ /* simple allocation should success */
+ size = 0x1000;
+ addr1 = NULL;
+ status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr1, 0, &size,
+ MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
+ ok(status == STATUS_SUCCESS, "NtAllocateVirtualMemory returned %08x\n", status);
+
+ /* allocation conflicts because of 64k align */
+ size = 0x1000;
+ addr2 = (char *)addr1 + 0x1000;
+ status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr2, 0, &size,
+ MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
+ ok(status == STATUS_CONFLICTING_ADDRESSES, "NtAllocateVirtualMemory returned %08x\n", status);
+
+ /* it should conflict, even when zero_bits is explicitly set */
+ size = 0x1000;
+ addr2 = (char *)addr1 + 0x1000;
+ status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr2, 12, &size,
+ MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
+ todo_wine
+ ok(status == STATUS_CONFLICTING_ADDRESSES, "NtAllocateVirtualMemory returned %08x\n", status);
+ if (status == STATUS_SUCCESS)
+ {
+ size = 0;
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr2, &size, MEM_RELEASE);
+ ok(status == STATUS_SUCCESS, "NtFreeVirtualMemory return %08x, addr2: %p\n", status, addr2);
+ }
+
+ /* 21 zero bits never succeeds */
+ size = 0x1000;
+ addr2 = NULL;
+ status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr2, 21, &size,
+ MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
+ todo_wine
+ ok(status == STATUS_NO_MEMORY || status == STATUS_INVALID_PARAMETER,
+ "NtAllocateVirtualMemory returned %08x\n", status);
+ if (status == STATUS_SUCCESS)
+ {
+ size = 0;
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr2, &size, MEM_RELEASE);
+ ok(status == STATUS_SUCCESS, "NtFreeVirtualMemory return %08x, addr2: %p\n", status, addr2);
+ }
+
+ /* 22 zero bits is invalid */
+ size = 0x1000;
+ addr2 = NULL;
+ status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr2, 22, &size,
+ MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
+ ok(status == STATUS_INVALID_PARAMETER_3 || status == STATUS_INVALID_PARAMETER,
+ "NtAllocateVirtualMemory returned %08x\n", status);
+ if (status == STATUS_SUCCESS)
+ {
+ size = 0;
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr2, &size, MEM_RELEASE);
+ ok(status == STATUS_SUCCESS, "NtFreeVirtualMemory return %08x, addr2: %p\n", status, addr2);
+ }
+
+ /* AT_ROUND_TO_PAGE flag is not supported for NtAllocateVirtualMemory */
+ size = 0x1000;
+ addr2 = (char *)addr1 + 0x1000;
+ status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr2, 0, &size, MEM_RESERVE |
+ MEM_COMMIT | AT_ROUND_TO_PAGE, PAGE_EXECUTE_READWRITE);
+ ok(status == STATUS_INVALID_PARAMETER_5 || status == STATUS_INVALID_PARAMETER,
+ "NtAllocateVirtualMemory returned %08x\n", status);
+
+ size = 0;
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr1, &size, MEM_RELEASE);
+ ok(status == STATUS_SUCCESS, "NtFreeVirtualMemory failed\n");
+}
+
+START_TEST(virtual)
+{
+ SYSTEM_BASIC_INFORMATION sbi;
+
+ NtQuerySystemInformation(SystemBasicInformation, &sbi, sizeof(sbi), NULL);
+ trace("system page size %#x\n", sbi.PageSize);
+
+ test_AllocateVirtualMemory();
+}
--
2.20.1
May 31, 2019
[PATCH v7 1/6] kernel32/tests: Fix NtAllocateVirtualMemory tests results on w1064v1809
by Rémi Bernon
Signed-off-by: Rémi Bernon <rbernon(a)codeweavers.com>
---
dlls/kernel32/tests/virtual.c | 12 +++++++-----
1 file changed, 7 insertions(+), 5 deletions(-)
diff --git a/dlls/kernel32/tests/virtual.c b/dlls/kernel32/tests/virtual.c
index 474955630fd..d797df26f6c 100644
--- a/dlls/kernel32/tests/virtual.c
+++ b/dlls/kernel32/tests/virtual.c
@@ -456,12 +456,13 @@ static void test_VirtualAlloc(void)
ok(status == STATUS_CONFLICTING_ADDRESSES, "NtAllocateVirtualMemory returned %08x\n", status);
if (status == STATUS_SUCCESS) ok(VirtualFree(addr2, 0, MEM_RELEASE), "VirtualFree failed\n");
- /* 21 zero bits is valid */
+ /* 21 zero bits never succeeds */
size = 0x1000;
addr2 = NULL;
status = pNtAllocateVirtualMemory(GetCurrentProcess(), &addr2, 21, &size,
MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
- ok(status == STATUS_SUCCESS || status == STATUS_NO_MEMORY,
+ todo_wine
+ ok(status == STATUS_NO_MEMORY || status == STATUS_INVALID_PARAMETER,
"NtAllocateVirtualMemory returned %08x\n", status);
if (status == STATUS_SUCCESS) ok(VirtualFree(addr2, 0, MEM_RELEASE), "VirtualFree failed\n");
@@ -470,7 +471,8 @@ static void test_VirtualAlloc(void)
addr2 = NULL;
status = pNtAllocateVirtualMemory(GetCurrentProcess(), &addr2, 22, &size,
MEM_RESERVE | MEM_COMMIT, PAGE_EXECUTE_READWRITE);
- ok(status == STATUS_INVALID_PARAMETER_3, "NtAllocateVirtualMemory returned %08x\n", status);
+ ok(status == STATUS_INVALID_PARAMETER_3 || status == STATUS_INVALID_PARAMETER,
+ "NtAllocateVirtualMemory returned %08x\n", status);
if (status == STATUS_SUCCESS) ok(VirtualFree(addr2, 0, MEM_RELEASE), "VirtualFree failed\n");
/* AT_ROUND_TO_PAGE flag is not supported for VirtualAlloc */
@@ -484,8 +486,8 @@ static void test_VirtualAlloc(void)
addr2 = (char *)addr1 + 0x1000;
status = pNtAllocateVirtualMemory(GetCurrentProcess(), &addr2, 0, &size, MEM_RESERVE |
MEM_COMMIT | AT_ROUND_TO_PAGE, PAGE_EXECUTE_READWRITE);
- todo_wine
- ok(status == STATUS_INVALID_PARAMETER_5, "NtAllocateVirtualMemory returned %08x\n", status);
+ ok(status == STATUS_INVALID_PARAMETER_5 || status == STATUS_INVALID_PARAMETER,
+ "NtAllocateVirtualMemory returned %08x\n", status);
ok(VirtualFree(addr1, 0, MEM_RELEASE), "VirtualFree failed\n");
}
--
2.20.1
May 31, 2019
[PATCH 3/3] mshtml: Add IMarkupContainer interface stub.
by Dmitry Timoshkov
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/mshtml/htmldoc.c | 43 ++++++++++++++++++++++++++++++++++++
dlls/mshtml/mshtml_private.h | 1 +
dlls/mshtml/tests/dom.c | 2 ++
3 files changed, 46 insertions(+)
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 665e7ffdcb..492216b426 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -4974,6 +4974,46 @@ static const IMarkupServicesVtbl MarkupServicesVtbl = {
markupsvcs_EndUndoUnit
};
+/**********************************************************
+ * IMarkupContainer implementation
+ */
+static inline HTMLDocument *impl_from_IMarkupContainer(IMarkupContainer *iface)
+{
+ return CONTAINING_RECORD(iface, HTMLDocument, IMarkupContainer_iface);
+}
+
+static HRESULT WINAPI markupcontainer_QueryInterface(IMarkupContainer *iface, REFIID riid, void **ppvObject)
+{
+ HTMLDocument *This = impl_from_IMarkupContainer(iface);
+ return htmldoc_query_interface(This, riid, ppvObject);
+}
+
+static ULONG WINAPI markupcontainer_AddRef(IMarkupContainer *iface)
+{
+ HTMLDocument *This = impl_from_IMarkupContainer(iface);
+ return htmldoc_addref(This);
+}
+
+static ULONG WINAPI markupcontainer_Release(IMarkupContainer *iface)
+{
+ HTMLDocument *This = impl_from_IMarkupContainer(iface);
+ return htmldoc_release(This);
+}
+
+static HRESULT WINAPI markupcontainer_OwningDoc(IMarkupContainer *iface, IHTMLDocument2 **ppDoc)
+{
+ HTMLDocument *This = impl_from_IMarkupContainer(iface);
+ FIXME("(%p)->(%p)\n", This, ppDoc);
+ return E_NOTIMPL;
+}
+
+static const IMarkupContainerVtbl MarkupContainerVtbl = {
+ markupcontainer_QueryInterface,
+ markupcontainer_AddRef,
+ markupcontainer_Release,
+ markupcontainer_OwningDoc
+};
+
static BOOL htmldoc_qi(HTMLDocument *This, REFIID riid, void **ppv)
{
*ppv = NULL;
@@ -5054,6 +5094,8 @@ static BOOL htmldoc_qi(HTMLDocument *This, REFIID riid, void **ppv)
*ppv = &This->IProvideMultipleClassInfo_iface;
else if(IsEqualGUID(&IID_IMarkupServices, riid))
*ppv = &This->IMarkupServices_iface;
+ else if(IsEqualGUID(&IID_IMarkupContainer, riid))
+ *ppv = &This->IMarkupContainer_iface;
else if(IsEqualGUID(&CLSID_CMarkup, riid)) {
FIXME("(%p)->(CLSID_CMarkup %p)\n", This, ppv);
*ppv = NULL;
@@ -5102,6 +5144,7 @@ static void init_doc(HTMLDocument *doc, IUnknown *outer, IDispatchEx *dispex)
doc->ISupportErrorInfo_iface.lpVtbl = &SupportErrorInfoVtbl;
doc->IProvideMultipleClassInfo_iface.lpVtbl = &ProvideMultipleClassInfoVtbl;
doc->IMarkupServices_iface.lpVtbl = &MarkupServicesVtbl;
+ doc->IMarkupContainer_iface.lpVtbl = &MarkupContainerVtbl;
doc->outer_unk = outer;
doc->dispex = dispex;
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 9ed2e5f4e6..7dc9367493 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -624,6 +624,7 @@ struct HTMLDocument {
IObjectSafety IObjectSafety_iface;
IProvideMultipleClassInfo IProvideMultipleClassInfo_iface;
IMarkupServices IMarkupServices_iface;
+ IMarkupContainer IMarkupContainer_iface;
IUnknown *outer_unk;
IDispatchEx *dispex;
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index d4ef42e94e..8a08282957 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -175,6 +175,7 @@ static const IID * const doc_node_iids[] = {
&IID_IDispatchEx,
&IID_IConnectionPointContainer,
&IID_IInternetHostSecurityManager,
+ &IID_IMarkupContainer,
&IID_IMarkupServices,
&IID_IOleContainer,
&IID_IObjectSafety,
@@ -192,6 +193,7 @@ static const IID * const doc_obj_iids[] = {
&IID_IDispatchEx,
&IID_IConnectionPointContainer,
&IID_ICustomDoc,
+ &IID_IMarkupContainer,
&IID_IMarkupServices,
&IID_IOleContainer,
&IID_IObjectSafety,
--
2.20.1
May 31, 2019
[PATCH 2/3] mshtml: Add IMarkupServices interface stub.
by Dmitry Timoshkov
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/mshtml/htmldoc.c | 215 +++++++++++++++++++++++++++++++++++
dlls/mshtml/mshtml_private.h | 1 +
dlls/mshtml/tests/dom.c | 2 +
3 files changed, 218 insertions(+)
diff --git a/dlls/mshtml/htmldoc.c b/dlls/mshtml/htmldoc.c
index 5b14678a6f..665e7ffdcb 100644
--- a/dlls/mshtml/htmldoc.c
+++ b/dlls/mshtml/htmldoc.c
@@ -4762,6 +4762,218 @@ static const IProvideMultipleClassInfoVtbl ProvideMultipleClassInfoVtbl = {
ProvideMultipleClassInfo_GetInfoOfIndex
};
+/**********************************************************
+ * IMarkupServices implementation
+ */
+static inline HTMLDocument *impl_from_IMarkupServices(IMarkupServices *iface)
+{
+ return CONTAINING_RECORD(iface, HTMLDocument, IMarkupServices_iface);
+}
+
+static HRESULT WINAPI markupsvcs_QueryInterface(IMarkupServices *iface, REFIID riid, void **ppvObject)
+{
+ HTMLDocument *This = impl_from_IMarkupServices(iface);
+ return htmldoc_query_interface(This, riid, ppvObject);
+}
+
+static ULONG WINAPI markupsvcs_AddRef(IMarkupServices *iface)
+{
+ HTMLDocument *This = impl_from_IMarkupServices(iface);
+ return htmldoc_addref(This);
+}
+
+static ULONG WINAPI markupsvcs_Release(IMarkupServices *iface)
+{
+ HTMLDocument *This = impl_from_IMarkupServices(iface);
+ return htmldoc_release(This);
+}
+
+static HRESULT WINAPI markupsvcs_CreateMarkupPointer(IMarkupServices *iface, IMarkupPointer **ppPointer)
+{
+ HTMLDocument *This = impl_from_IMarkupServices(iface);
+ FIXME("(%p)->(%p)\n", This, ppPointer);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI markupsvcs_CreateMarkupContainer(IMarkupServices *iface, IMarkupContainer **ppMarkupContainer)
+{
+ HTMLDocument *This = impl_from_IMarkupServices(iface);
+ FIXME("(%p)->(%p)\n", This, ppMarkupContainer);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI markupsvcs_CreateElement(IMarkupServices *iface,
+ ELEMENT_TAG_ID tagID, OLECHAR *pchAttributes, IHTMLElement **ppElement)
+{
+ HTMLDocument *This = impl_from_IMarkupServices(iface);
+ FIXME("(%p)->(%d,%s,%p)\n", This, tagID, debugstr_w(pchAttributes), ppElement);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI markupsvcs_CloneElement(IMarkupServices *iface,
+ IHTMLElement *pElemCloneThis, IHTMLElement **ppElementTheClone)
+{
+ HTMLDocument *This = impl_from_IMarkupServices(iface);
+ FIXME("(%p)->(%p,%p)\n", This, pElemCloneThis, ppElementTheClone);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI markupsvcs_InsertElement(IMarkupServices *iface,
+ IHTMLElement *pElementInsert, IMarkupPointer *pPointerStart,
+ IMarkupPointer *pPointerFinish)
+{
+ HTMLDocument *This = impl_from_IMarkupServices(iface);
+ FIXME("(%p)->(%p,%p,%p)\n", This, pElementInsert, pPointerStart, pPointerFinish);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI markupsvcs_RemoveElement(IMarkupServices *iface, IHTMLElement *pElementRemove)
+{
+ HTMLDocument *This = impl_from_IMarkupServices(iface);
+ FIXME("(%p)->(%p)\n", This, pElementRemove);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI markupsvcs_Remove(IMarkupServices *iface,
+ IMarkupPointer *pPointerStart, IMarkupPointer *pPointerFinish)
+{
+ HTMLDocument *This = impl_from_IMarkupServices(iface);
+ FIXME("(%p)->(%p,%p)\n", This, pPointerStart, pPointerFinish);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI markupsvcs_Copy(IMarkupServices *iface,
+ IMarkupPointer *pPointerSourceStart, IMarkupPointer *pPointerSourceFinish,
+ IMarkupPointer *pPointerTarget)
+{
+ HTMLDocument *This = impl_from_IMarkupServices(iface);
+ FIXME("(%p)->(%p,%p,%p)\n", This, pPointerSourceStart, pPointerSourceFinish, pPointerTarget);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI markupsvcs_Move(IMarkupServices *iface,
+ IMarkupPointer *pPointerSourceStart, IMarkupPointer *pPointerSourceFinish,
+ IMarkupPointer *pPointerTarget)
+{
+ HTMLDocument *This = impl_from_IMarkupServices(iface);
+ FIXME("(%p)->(%p,%p,%p)\n", This, pPointerSourceStart, pPointerSourceFinish, pPointerTarget);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI markupsvcs_InsertText(IMarkupServices *iface,
+ OLECHAR *pchText, LONG cch, IMarkupPointer *pPointerTarget)
+{
+ HTMLDocument *This = impl_from_IMarkupServices(iface);
+ FIXME("(%p)->(%s,%x,%p)\n", This, debugstr_w(pchText), cch, pPointerTarget);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI markupsvcs_ParseString(IMarkupServices *iface,
+ OLECHAR *pchHTML, DWORD dwFlags, IMarkupContainer **ppContainerResult,
+ IMarkupPointer *pPointerStart, IMarkupPointer *pPointerFinish)
+{
+ HTMLDocument *This = impl_from_IMarkupServices(iface);
+ FIXME("(%p)->(%s,%x,%p,%p,%p)\n", This, debugstr_w(pchHTML), dwFlags, ppContainerResult, pPointerStart, pPointerFinish);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI markupsvcs_ParseGlobal(IMarkupServices *iface,
+ HGLOBAL hglobalHTML, DWORD dwFlags, IMarkupContainer **ppContainerResult,
+ IMarkupPointer *pPointerStart, IMarkupPointer *pPointerFinish)
+{
+ HTMLDocument *This = impl_from_IMarkupServices(iface);
+ FIXME("(%p)->(%s,%x,%p,%p,%p)\n", This, debugstr_w(hglobalHTML), dwFlags, ppContainerResult, pPointerStart, pPointerFinish);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI markupsvcs_IsScopedElement(IMarkupServices *iface,
+ IHTMLElement *pElement, BOOL *pfScoped)
+{
+ HTMLDocument *This = impl_from_IMarkupServices(iface);
+ FIXME("(%p)->(%p,%p)\n", This, pElement, pfScoped);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI markupsvcs_GetElementTagId(IMarkupServices *iface,
+ IHTMLElement *pElement, ELEMENT_TAG_ID *ptagId)
+{
+ HTMLDocument *This = impl_from_IMarkupServices(iface);
+ FIXME("(%p)->(%p,%p)\n", This, pElement, ptagId);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI markupsvcs_GetTagIDForName(IMarkupServices *iface,
+ BSTR bstrName, ELEMENT_TAG_ID *ptagId)
+{
+ HTMLDocument *This = impl_from_IMarkupServices(iface);
+ FIXME("(%p)->(%s,%p)\n", This, debugstr_w(bstrName), ptagId);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI markupsvcs_GetNameForTagID(IMarkupServices *iface,
+ ELEMENT_TAG_ID tagId, BSTR *pbstrName)
+{
+ HTMLDocument *This = impl_from_IMarkupServices(iface);
+ FIXME("(%p)->(%d,%p)\n", This, tagId, pbstrName);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI markupsvcs_MovePointersToRange(IMarkupServices *iface,
+ IHTMLTxtRange *pIRange, IMarkupPointer *pPointerStart, IMarkupPointer *pPointerFinish)
+{
+ HTMLDocument *This = impl_from_IMarkupServices(iface);
+ FIXME("(%p)->(%p,%p,%p)\n", This, pIRange, pPointerStart, pPointerFinish);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI markupsvcs_MoveRangeToPointers(IMarkupServices *iface,
+ IMarkupPointer *pPointerStart, IMarkupPointer *pPointerFinish, IHTMLTxtRange *pIRange)
+{
+ HTMLDocument *This = impl_from_IMarkupServices(iface);
+ FIXME("(%p)->(%p,%p,%p)\n", This, pPointerStart, pPointerFinish, pIRange);
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI markupsvcs_BeginUndoUnit(IMarkupServices *iface, OLECHAR *pchTitle)
+{
+ HTMLDocument *This = impl_from_IMarkupServices(iface);
+ FIXME("(%p)->(%s)\n", This, debugstr_w(pchTitle));
+ return E_NOTIMPL;
+}
+
+static HRESULT WINAPI markupsvcs_EndUndoUnit(IMarkupServices *iface)
+{
+ HTMLDocument *This = impl_from_IMarkupServices(iface);
+ FIXME("(%p)\n", This);
+ return E_NOTIMPL;
+}
+
+static const IMarkupServicesVtbl MarkupServicesVtbl = {
+ markupsvcs_QueryInterface,
+ markupsvcs_AddRef,
+ markupsvcs_Release,
+ markupsvcs_CreateMarkupPointer,
+ markupsvcs_CreateMarkupContainer,
+ markupsvcs_CreateElement,
+ markupsvcs_CloneElement,
+ markupsvcs_InsertElement,
+ markupsvcs_RemoveElement,
+ markupsvcs_Remove,
+ markupsvcs_Copy,
+ markupsvcs_Move,
+ markupsvcs_InsertText,
+ markupsvcs_ParseString,
+ markupsvcs_ParseGlobal,
+ markupsvcs_IsScopedElement,
+ markupsvcs_GetElementTagId,
+ markupsvcs_GetTagIDForName,
+ markupsvcs_GetNameForTagID,
+ markupsvcs_MovePointersToRange,
+ markupsvcs_MoveRangeToPointers,
+ markupsvcs_BeginUndoUnit,
+ markupsvcs_EndUndoUnit
+};
+
static BOOL htmldoc_qi(HTMLDocument *This, REFIID riid, void **ppv)
{
*ppv = NULL;
@@ -4840,6 +5052,8 @@ static BOOL htmldoc_qi(HTMLDocument *This, REFIID riid, void **ppv)
*ppv = &This->IProvideMultipleClassInfo_iface;
else if(IsEqualGUID(&IID_IProvideMultipleClassInfo, riid))
*ppv = &This->IProvideMultipleClassInfo_iface;
+ else if(IsEqualGUID(&IID_IMarkupServices, riid))
+ *ppv = &This->IMarkupServices_iface;
else if(IsEqualGUID(&CLSID_CMarkup, riid)) {
FIXME("(%p)->(CLSID_CMarkup %p)\n", This, ppv);
*ppv = NULL;
@@ -4887,6 +5101,7 @@ static void init_doc(HTMLDocument *doc, IUnknown *outer, IDispatchEx *dispex)
doc->IDocumentEvent_iface.lpVtbl = &DocumentEventVtbl;
doc->ISupportErrorInfo_iface.lpVtbl = &SupportErrorInfoVtbl;
doc->IProvideMultipleClassInfo_iface.lpVtbl = &ProvideMultipleClassInfoVtbl;
+ doc->IMarkupServices_iface.lpVtbl = &MarkupServicesVtbl;
doc->outer_unk = outer;
doc->dispex = dispex;
diff --git a/dlls/mshtml/mshtml_private.h b/dlls/mshtml/mshtml_private.h
index 5b94d075cb..9ed2e5f4e6 100644
--- a/dlls/mshtml/mshtml_private.h
+++ b/dlls/mshtml/mshtml_private.h
@@ -623,6 +623,7 @@ struct HTMLDocument {
IOleContainer IOleContainer_iface;
IObjectSafety IObjectSafety_iface;
IProvideMultipleClassInfo IProvideMultipleClassInfo_iface;
+ IMarkupServices IMarkupServices_iface;
IUnknown *outer_unk;
IDispatchEx *dispex;
diff --git a/dlls/mshtml/tests/dom.c b/dlls/mshtml/tests/dom.c
index d46c232f9b..d4ef42e94e 100644
--- a/dlls/mshtml/tests/dom.c
+++ b/dlls/mshtml/tests/dom.c
@@ -175,6 +175,7 @@ static const IID * const doc_node_iids[] = {
&IID_IDispatchEx,
&IID_IConnectionPointContainer,
&IID_IInternetHostSecurityManager,
+ &IID_IMarkupServices,
&IID_IOleContainer,
&IID_IObjectSafety,
&IID_IProvideClassInfo,
@@ -191,6 +192,7 @@ static const IID * const doc_obj_iids[] = {
&IID_IDispatchEx,
&IID_IConnectionPointContainer,
&IID_ICustomDoc,
+ &IID_IMarkupServices,
&IID_IOleContainer,
&IID_IObjectSafety,
&IID_IProvideClassInfo,
--
2.20.1
May 31, 2019
[PATCH 1/3] include/mshtml.idl: Add more interface declarations.
by Dmitry Timoshkov
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
include/mshtmdid.h | 32 ++++-
include/mshtml.idl | 342 ++++++++++++++++++++++++++++++++++++++++++---
2 files changed, 356 insertions(+), 18 deletions(-)
diff --git a/include/mshtmdid.h b/include/mshtmdid.h
index a8c010d3b1..82055f690b 100644
--- a/include/mshtmdid.h
+++ b/include/mshtmdid.h
@@ -38,9 +38,11 @@
#define DISPID_HEADER DISPID_NORMAL_FIRST
#define DISPID_HEDELEMS DISPID_NORMAL_FIRST
#define DISPID_HR DISPID_NORMAL_FIRST
+#define DISPID_IHTMLCOMPUTEDSTYLE DISPID_NORMAL_FIRST
+#define DISPID_ILINEINFO DISPID_NORMAL_FIRST
+#define DISPID_IMGBASE DISPID_NORMAL_FIRST
#define DISPID_LABEL DISPID_NORMAL_FIRST
#define DISPID_LI DISPID_NORMAL_FIRST
-#define DISPID_IMGBASE DISPID_NORMAL_FIRST
#define DISPID_MENU DISPID_NORMAL_FIRST
#define DISPID_OL DISPID_NORMAL_FIRST
#define DISPID_PARA DISPID_NORMAL_FIRST
@@ -1683,6 +1685,34 @@
#define DISPID_IHTMLDOCUMENT8_ONMSMANIPULATIONSTATECHANGED DISPID_EVPROP_ONMSMANIPULATIONSTATECHANGED
#define DISPID_IHTMLDOCUMENT8_MSCAPSLOCKWARNINGOFF DISPID_OMDOCUMENT+141
+/* ILineInfo */
+#define DISPID_ILINEINFO_X (DISPID_ILINEINFO+1)
+#define DISPID_ILINEINFO_BASELINE (DISPID_ILINEINFO+2)
+#define DISPID_ILINEINFO_TEXTDESCENT (DISPID_ILINEINFO+3)
+#define DISPID_ILINEINFO_TEXTHEIGHT (DISPID_ILINEINFO+4)
+#define DISPID_ILINEINFO_LINEDIRECTION (DISPID_ILINEINFO+5)
+
+/* IHTMLComputedStyle */
+#define DISPID_IHTMLCOMPUTEDSTYLE_BOLD (DISPID_IHTMLCOMPUTEDSTYLE+1)
+#define DISPID_IHTMLCOMPUTEDSTYLE_ITALIC (DISPID_IHTMLCOMPUTEDSTYLE+2)
+#define DISPID_IHTMLCOMPUTEDSTYLE_UNDERLINE (DISPID_IHTMLCOMPUTEDSTYLE+3)
+#define DISPID_IHTMLCOMPUTEDSTYLE_OVERLINE (DISPID_IHTMLCOMPUTEDSTYLE+4)
+#define DISPID_IHTMLCOMPUTEDSTYLE_STRIKEOUT (DISPID_IHTMLCOMPUTEDSTYLE+5)
+#define DISPID_IHTMLCOMPUTEDSTYLE_SUBSCRIPT (DISPID_IHTMLCOMPUTEDSTYLE+6)
+#define DISPID_IHTMLCOMPUTEDSTYLE_SUPERSCRIPT (DISPID_IHTMLCOMPUTEDSTYLE+7)
+#define DISPID_IHTMLCOMPUTEDSTYLE_EXPLICITFACE (DISPID_IHTMLCOMPUTEDSTYLE+8)
+#define DISPID_IHTMLCOMPUTEDSTYLE_FONTWEIGHT (DISPID_IHTMLCOMPUTEDSTYLE+9)
+#define DISPID_IHTMLCOMPUTEDSTYLE_FONTSIZE (DISPID_IHTMLCOMPUTEDSTYLE+10)
+#define DISPID_IHTMLCOMPUTEDSTYLE_FONTNAME (DISPID_IHTMLCOMPUTEDSTYLE+11)
+#define DISPID_IHTMLCOMPUTEDSTYLE_HASBGCOLOR (DISPID_IHTMLCOMPUTEDSTYLE+12)
+#define DISPID_IHTMLCOMPUTEDSTYLE_TEXTCOLOR (DISPID_IHTMLCOMPUTEDSTYLE+13)
+#define DISPID_IHTMLCOMPUTEDSTYLE_BACKGROUNDCOLOR (DISPID_IHTMLCOMPUTEDSTYLE+14)
+#define DISPID_IHTMLCOMPUTEDSTYLE_PREFORMATTED (DISPID_IHTMLCOMPUTEDSTYLE+15)
+#define DISPID_IHTMLCOMPUTEDSTYLE_DIRECTION (DISPID_IHTMLCOMPUTEDSTYLE+16)
+#define DISPID_IHTMLCOMPUTEDSTYLE_BLOCKDIRECTION (DISPID_IHTMLCOMPUTEDSTYLE+17)
+#define DISPID_IHTMLCOMPUTEDSTYLE_OL (DISPID_IHTMLCOMPUTEDSTYLE+18)
+#define DISPID_IHTMLCOMPUTEDSTYLE_ISEQUAL
+
/* DWebBridgeEvents */
#define DISPID_DWEBBRIDGEEVENTS_ONSCRIPTLETEVENT 1
#define DISPID_DWEBBRIDGEEVENTS_ONREADYSTATECHANGE DISPID_HTMLDOCUMENTEVENTS_ONREADYSTATECHANGE
diff --git a/include/mshtml.idl b/include/mshtml.idl
index 7cc9e93af2..de15c6c2ce 100644
--- a/include/mshtml.idl
+++ b/include/mshtml.idl
@@ -45,6 +45,15 @@ cpp_quote("#ifdef WINE_NO_UNICODE_MACROS")
cpp_quote("#undef FindText")
cpp_quote("#endif")
+[
+ version(4.0),
+ uuid(3050F1C5-98B5-11CF-BB82-00AA00BDCE0B)
+]
+library MSHTML
+{
+
+importlib("stdole2.tlb");
+
typedef enum {
POINTER_GRAVITY_Left,
POINTER_GRAVITY_Right,
@@ -100,14 +109,155 @@ typedef enum _SELECTION_TYPE {
SELECTION_TYPE_Max = 2147483647
} SELECTION_TYPE;
-[
- version(4.0),
- uuid(3050F1C5-98B5-11CF-BB82-00AA00BDCE0B)
-]
-library MSHTML
-{
-
-importlib("stdole2.tlb");
+typedef enum _ELEMENT_TAG_ID {
+ TAGID_NULL,
+ TAGID_UNKNOWN,
+ TAGID_A,
+ TAGID_ACRONYM,
+ TAGID_ADDRESS,
+ TAGID_APPLET,
+ TAGID_AREA,
+ TAGID_B,
+ TAGID_BASE,
+ TAGID_BASEFONT,
+ TAGID_BDO,
+ TAGID_BGSOUND,
+ TAGID_BIG,
+ TAGID_BLINK,
+ TAGID_BLOCKQUOTE,
+ TAGID_BODY,
+ TAGID_BR,
+ TAGID_BUTTON,
+ TAGID_CAPTION,
+ TAGID_CENTER,
+ TAGID_CITE,
+ TAGID_CODE,
+ TAGID_COL,
+ TAGID_COLGROUP,
+ TAGID_COMMENT,
+ TAGID_COMMENT_RAW,
+ TAGID_DD,
+ TAGID_DEL,
+ TAGID_DFN,
+ TAGID_DIR,
+ TAGID_DIV,
+ TAGID_DL,
+ TAGID_DT,
+ TAGID_EM,
+ TAGID_EMBED,
+ TAGID_FIELDSET,
+ TAGID_FONT,
+ TAGID_FORM,
+ TAGID_FRAME,
+ TAGID_FRAMESET,
+ TAGID_GENERIC,
+ TAGID_H1,
+ TAGID_H2,
+ TAGID_H3,
+ TAGID_H4,
+ TAGID_H5,
+ TAGID_H6,
+ TAGID_HEAD,
+ TAGID_HR,
+ TAGID_HTML,
+ TAGID_I,
+ TAGID_IFRAME,
+ TAGID_IMG,
+ TAGID_INPUT,
+ TAGID_INS,
+ TAGID_KBD,
+ TAGID_LABEL,
+ TAGID_LEGEND,
+ TAGID_LI,
+ TAGID_LINK,
+ TAGID_LISTING,
+ TAGID_MAP,
+ TAGID_MARQUEE,
+ TAGID_MENU,
+ TAGID_META,
+ TAGID_NEXTID,
+ TAGID_NOBR,
+ TAGID_NOEMBED,
+ TAGID_NOFRAMES,
+ TAGID_NOSCRIPT,
+ TAGID_OBJECT,
+ TAGID_OL,
+ TAGID_OPTION,
+ TAGID_P,
+ TAGID_PARAM,
+ TAGID_PLAINTEXT,
+ TAGID_PRE,
+ TAGID_Q,
+ TAGID_RP,
+ TAGID_RT,
+ TAGID_RUBY,
+ TAGID_S,
+ TAGID_SAMP,
+ TAGID_SCRIPT,
+ TAGID_SELECT,
+ TAGID_SMALL,
+ TAGID_SPAN,
+ TAGID_STRIKE,
+ TAGID_STRONG,
+ TAGID_STYLE,
+ TAGID_SUB,
+ TAGID_SUP,
+ TAGID_TABLE,
+ TAGID_TBODY,
+ TAGID_TC,
+ TAGID_TD,
+ TAGID_TEXTAREA,
+ TAGID_TFOOT,
+ TAGID_TH,
+ TAGID_THEAD,
+ TAGID_TITLE,
+ TAGID_TR,
+ TAGID_TT,
+ TAGID_U,
+ TAGID_UL,
+ TAGID_VAR,
+ TAGID_WBR,
+ TAGID_XMP,
+ TAGID_ROOT,
+ TAGID_OPTGROUP,
+ TAGID_ABBR,
+ TAGID_COUNT,
+ TAGID_LAST_PREDEFINED = 10000,
+ ELEMENT_TAG_ID_Max = 2147483647
+} ELEMENT_TAG_ID;
+
+typedef enum _COORD_SYSTEM {
+ COORD_SYSTEM_GLOBAL,
+ COORD_SYSTEM_PARENT,
+ COORD_SYSTEM_CONTAINER,
+ COORD_SYSTEM_CONTENT,
+ COORD_SYSTEM_FRAME,
+ COORD_SYSTEM_Max = 2147483647
+} COORD_SYSTEM;
+
+typedef enum _DISPLAY_MOVEUNIT {
+ DISPLAY_MOVEUNIT_PreviousLine = 1,
+ DISPLAY_MOVEUNIT_NextLine,
+ DISPLAY_MOVEUNIT_CurrentLineStart,
+ DISPLAY_MOVEUNIT_CurrentLineEnd,
+ DISPLAY_MOVEUNIT_TopOfWindow,
+ DISPLAY_MOVEUNIT_BottomOfWindow,
+ DISPLAY_MOVEUNIT_Max = 2147483647
+} DISPLAY_MOVEUNIT;
+
+typedef enum _DISPLAY_GRAVITY {
+ DISPLAY_GRAVITY_PreviousLine = 1,
+ DISPLAY_GRAVITY_NextLine,
+ DISPLAY_GRAVITY_Max = 2147483647
+} DISPLAY_GRAVITY;
+
+typedef enum _CARET_DIRECTION {
+ CARET_DIRECTION_INDETERMINATE,
+ CARET_DIRECTION_SAME,
+ CARET_DIRECTION_BACKWARD,
+ CARET_DIRECTION_FORWARD,
+ CARET_DIRECTION_Max = 2147483647
+} CARET_DIRECTION;
typedef enum _DomConstructor {
DomConstructorObject = 0,
@@ -245,13 +395,25 @@ interface IHTMLDOMConstructor : IDispatch
[propget, id(DISPID_IHTMLDOMCONSTRUCTOR_CONSTRUCTOR), hidden] \
IDispatch *constructor()
+interface IHTMLCaret;
+interface IHTMLComputedStyle;
interface IHTMLDocument2;
interface IHTMLDocument7;
+interface IHTMLElement;
interface IHTMLElement2;
-interface IHTMLStyleSheetsCollection;
+interface IHTMLElementCollection;
+interface IHTMLEventObj;
interface IHTMLFrameBase;
interface IHTMLStorage;
+interface IHTMLStyleSheetsCollection;
+interface IHTMLTableSection;
interface IDOMEvent;
+interface IDisplayPointer;
+interface IDisplayServices;
+interface ILineInfo;
+interface IMarkupPointer;
+interface IMarkupContainer;
+interface ISVGSVGElement;
/*****************************************************************************
* IHTMLCSSStyleDeclaration interface
@@ -8706,8 +8868,6 @@ methods:
IDispatch *item([in] LONG index);
}
-interface IHTMLElementCollection;
-
/*****************************************************************************
* IHTMLElement interface
*/
@@ -12518,8 +12678,6 @@ methods:
VARIANT_BOOL onreset();
}
-interface IHTMLEventObj;
-
[
hidden,
uuid(3050F614-98B5-11CF-BB82-00AA00BDCE0B)
@@ -16122,8 +16280,6 @@ interface ISVGAnimatedEnumeration : IDispatch
HRESULT animVal([out, retval] USHORT *p);
}
-interface ISVGSVGElement;
-
/*****************************************************************************
* ISVGElement interface
*/
@@ -25111,8 +25267,6 @@ interface IHTMLTableCaption : IDispatch
HRESULT vAlign([retval, out] BSTR *p);
}
-interface IHTMLTableSection;
-
/*****************************************************************************
* IHTMLTable interface
*/
@@ -27871,6 +28025,160 @@ interface IDOMMessageEvent : IDispatch
[in] IHTMLWindow2 *source);
}
+/*****************************************************************************
+ * ILineInfo interface
+ */
+[
+ object,
+ pointer_default(unique),
+ uuid(3050f7e2-98b5-11cf-bb82-00aa00bdce0b)
+]
+interface ILineInfo : IUnknown
+{
+ [propget, id(DISPID_ILINEINFO_X)] HRESULT x([retval, out] long *p);
+ [propget, id(DISPID_ILINEINFO_BASELINE)] HRESULT baseLine([retval, out] long *p);
+ [propget, id(DISPID_ILINEINFO_TEXTDESCENT)] HRESULT textDescent([retval, out] long *p);
+ [propget, id(DISPID_ILINEINFO_TEXTHEIGHT)] HRESULT textHeight([retval, out] long *p);
+ [propget, id(DISPID_ILINEINFO_LINEDIRECTION)] HRESULT lineDirection([retval, out] long *p);
+};
+
+/*****************************************************************************
+ * IHTMLComputedStyle interface
+ */
+[
+ object,
+ pointer_default(unique),
+ uuid(3050f6c3-98b5-11cf-bb82-00aa00bdce0b)
+]
+interface IHTMLComputedStyle : IUnknown
+{
+ [propget, id(DISPID_IHTMLCOMPUTEDSTYLE_BOLD)] HRESULT bold([retval, out] VARIANT_BOOL **p);
+ [propget, id(DISPID_IHTMLCOMPUTEDSTYLE_ITALIC)] HRESULT italic([retval, out] VARIANT_BOOL **p);
+ [propget, id(DISPID_IHTMLCOMPUTEDSTYLE_UNDERLINE)] HRESULT underline([retval, out] VARIANT_BOOL **p);
+ [propget, id(DISPID_IHTMLCOMPUTEDSTYLE_OVERLINE)] HRESULT overline([retval, out] VARIANT_BOOL **p);
+ [propget, id(DISPID_IHTMLCOMPUTEDSTYLE_STRIKEOUT)] HRESULT strikeOut([retval, out] VARIANT_BOOL **p);
+ [propget, id(DISPID_IHTMLCOMPUTEDSTYLE_SUBSCRIPT)] HRESULT subScript([retval, out] VARIANT_BOOL **p);
+ [propget, id(DISPID_IHTMLCOMPUTEDSTYLE_SUPERSCRIPT)] HRESULT superScript([retval, out] VARIANT_BOOL **p);
+ [propget, id(DISPID_IHTMLCOMPUTEDSTYLE_EXPLICITFACE)] HRESULT explicitFace([retval, out] VARIANT_BOOL **p);
+ [propget, id(DISPID_IHTMLCOMPUTEDSTYLE_FONTWEIGHT)] HRESULT fontWeight([retval, out] long **p);
+ [propget, id(DISPID_IHTMLCOMPUTEDSTYLE_FONTSIZE)] HRESULT fontSize([retval, out] long **p);
+ [propget, id(DISPID_IHTMLCOMPUTEDSTYLE_FONTNAME)] HRESULT fontName([retval, out] WCHAR **p);
+ [propget, id(DISPID_IHTMLCOMPUTEDSTYLE_HASBGCOLOR)] HRESULT hasBgColor([retval, out] VARIANT_BOOL **p);
+ [propget, id(DISPID_IHTMLCOMPUTEDSTYLE_TEXTCOLOR)] HRESULT textColor([retval, out] DWORD **p);
+ [propget, id(DISPID_IHTMLCOMPUTEDSTYLE_BACKGROUNDCOLOR)] HRESULT backgroundColor([retval, out] DWORD **p);
+ [propget, id(DISPID_IHTMLCOMPUTEDSTYLE_PREFORMATTED)] HRESULT *preFormatted([retval, out] VARIANT_BOOL **p);
+ [propget, id(DISPID_IHTMLCOMPUTEDSTYLE_DIRECTION)] HRESULT direction([retval, out] VARIANT_BOOL **p);
+ [propget, id(DISPID_IHTMLCOMPUTEDSTYLE_BLOCKDIRECTION)] HRESULT blockDirection([retval, out] VARIANT_BOOL **p);
+ [propget, id(DISPID_IHTMLCOMPUTEDSTYLE_OL)] HRESULT OL([retval, out] VARIANT_BOOL *p);
+ HRESULT IsEqual([in] IHTMLComputedStyle *pComputedStyle,[out] VARIANT_BOOL *pfEqual);
+};
+
+/*****************************************************************************
+ * IDisplayPointer interface
+ */
+[
+ object,
+ pointer_default(unique),
+ uuid(3050f69e-98b5-11cf-bb82-00aa00bdce0b)
+]
+interface IDisplayPointer : IUnknown
+{
+ HRESULT MoveToPoint([in] POINT ptPoint,[in] COORD_SYSTEM eCoordSystem,[in] IHTMLElement *pElementContext,[in] DWORD dwHitTestOptions,[out] DWORD *pdwHitTestResults);
+ HRESULT MoveUnit([in] DISPLAY_MOVEUNIT eMoveUnit,[in] LONG lXPos);
+ HRESULT PositionMarkupPointer([in] IMarkupPointer *pMarkupPointer);
+ HRESULT MoveToPointer([in] IDisplayPointer *pDispPointer);
+ HRESULT SetPointerGravity([in] POINTER_GRAVITY eGravity);
+ HRESULT GetPointerGravity([out] POINTER_GRAVITY *peGravity);
+ HRESULT SetDisplayGravity([in] DISPLAY_GRAVITY eGravity);
+ HRESULT GetDisplayGravity([out] DISPLAY_GRAVITY *peGravity);
+ HRESULT IsPositioned([out] BOOL *pfPositioned);
+ HRESULT Unposition();
+ HRESULT IsEqualTo([in] IDisplayPointer *pDispPointer,[out] BOOL *pfIsEqual);
+ HRESULT IsLeftOf([in] IDisplayPointer *pDispPointer,[out] BOOL *pfIsLeftOf);
+ HRESULT IsRightOf([in] IDisplayPointer *pDispPointer,[out] BOOL *pfIsRightOf);
+ HRESULT IsAtBOL([out] BOOL *pfBOL);
+ HRESULT MoveToMarkupPointer([in] IMarkupPointer *pPointer,[in] IDisplayPointer *pDispLineContext);
+ HRESULT ScrollIntoView();
+ HRESULT GetLineInfo([out] ILineInfo **ppLineInfo);
+ HRESULT GetFlowElement([out] IHTMLElement **ppLayoutElement);
+ HRESULT QueryBreaks([out] DWORD *pdwBreaks);
+};
+
+/*****************************************************************************
+ * IHTMLCaret interface
+ */
+[
+ object,
+ pointer_default(unique),
+ uuid(3050f604-98b5-11cf-bb82-00aa00bdce0b)
+]
+interface IHTMLCaret : IUnknown
+{
+ HRESULT MoveCaretToPointer([in] IDisplayPointer *pDispPointer,[in] BOOL fScrollIntoView,[in] CARET_DIRECTION eDir);
+ HRESULT MoveCaretToPointerEx([in] IDisplayPointer *pDispPointer,[in] BOOL fVisible,[in] BOOL fScrollIntoView,[in] CARET_DIRECTION eDir);
+ HRESULT MoveMarkupPointerToCaret([in] IMarkupPointer *pIMarkupPointer);
+ HRESULT MoveDisplayPointerToCaret([in] IDisplayPointer *pDispPointer);
+ HRESULT IsVisible([out] BOOL *pIsVisible);
+ HRESULT Show([in] BOOL fScrollIntoView);
+ HRESULT Hide();
+ HRESULT InsertText([in] OLECHAR *pText,[in] LONG lLen);
+ HRESULT ScrollIntoView();
+ HRESULT GetLocation([out] POINT *pPoint,[in] BOOL fTranslate);
+ HRESULT GetCaretDirection([out] CARET_DIRECTION *peDir);
+ HRESULT SetCaretDirection([in] CARET_DIRECTION eDir);
+};
+
+/*****************************************************************************
+ * IDisplayServices interface
+ */
+[
+ object,
+ pointer_default(unique),
+ uuid(3050f69d-98b5-11cf-bb82-00aa00bdce0b)
+]
+interface IDisplayServices : IUnknown
+{
+ HRESULT CreateDisplayPointer([out] IDisplayPointer **ppDispPointer);
+ HRESULT TransformRect([in, out] RECT *pRect,[in] COORD_SYSTEM eSource,[in] COORD_SYSTEM eDestination,[in] IHTMLElement *pIElement);
+ HRESULT TransformPoint([in, out] POINT *pPoint,[in] COORD_SYSTEM eSource,[in] COORD_SYSTEM eDestination,[in] IHTMLElement *pIElement);
+ HRESULT GetCaret([out] IHTMLCaret **ppCaret);
+ HRESULT GetComputedStyle([in] IMarkupPointer *pPointer,[out] IHTMLComputedStyle **ppComputedStyle);
+ HRESULT ScrollRectIntoView([in] IHTMLElement *pIElement,[in] RECT rect);
+ HRESULT HasFlowLayout([in] IHTMLElement *pIElement,[out] BOOL *pfHasFlowLayout);
+};
+
+/*****************************************************************************
+ * IMarkupServices interface
+ */
+[
+ object,
+ pointer_default(unique),
+ uuid(3050f4a0-98b5-11cf-bb82-00aa00bdce0b)
+]
+interface IMarkupServices : IUnknown
+{
+ HRESULT CreateMarkupPointer([out] IMarkupPointer **ppPointer);
+ HRESULT CreateMarkupContainer([out] IMarkupContainer **ppMarkupContainer);
+ HRESULT CreateElement([in] ELEMENT_TAG_ID tagID,[in] OLECHAR *pchAttributes,[out] IHTMLElement **ppElement);
+ HRESULT CloneElement([in] IHTMLElement *pElemCloneThis,[out] IHTMLElement **ppElementTheClone);
+ HRESULT InsertElement([in] IHTMLElement *pElementInsert,[in] IMarkupPointer *pPointerStart,[in] IMarkupPointer *pPointerFinish);
+ HRESULT RemoveElement([in] IHTMLElement *pElementRemove);
+ HRESULT Remove([in] IMarkupPointer *pPointerStart,[in] IMarkupPointer *pPointerFinish);
+ HRESULT Copy([in] IMarkupPointer *pPointerSourceStart,[in] IMarkupPointer *pPointerSourceFinish,[in] IMarkupPointer *pPointerTarget);
+ HRESULT Move([in] IMarkupPointer *pPointerSourceStart,[in] IMarkupPointer *pPointerSourceFinish,[in] IMarkupPointer *pPointerTarget);
+ HRESULT InsertText([in] OLECHAR *pchText,[in] long cch,[in] IMarkupPointer *pPointerTarget);
+ HRESULT ParseString([in] OLECHAR *pchHTML,[in] DWORD dwFlags,[out] IMarkupContainer **ppContainerResult,[in] IMarkupPointer *ppPointerStart,[in] IMarkupPointer *ppPointerFinish);
+ HRESULT ParseGlobal([in] HGLOBAL hglobalHTML,[in] DWORD dwFlags,[out] IMarkupContainer **ppContainerResult,[in] IMarkupPointer *pPointerStart,[in] IMarkupPointer *pPointerFinish);
+ HRESULT IsScopedElement([in] IHTMLElement *pElement,[out] BOOL *pfScoped);
+ HRESULT GetElementTagId([in] IHTMLElement *pElement,[out] ELEMENT_TAG_ID *ptagId);
+ HRESULT GetTagIDForName([in] BSTR bstrName,[out] ELEMENT_TAG_ID *ptagId);
+ HRESULT GetNameForTagID([in] ELEMENT_TAG_ID tagId,[out] BSTR *pbstrName);
+ HRESULT MovePointersToRange([in] IHTMLTxtRange *pIRange,[in] IMarkupPointer *pPointerStart,[in] IMarkupPointer *pPointerFinish);
+ HRESULT MoveRangeToPointers([in] IMarkupPointer *pPointerStart,[in] IMarkupPointer *pPointerFinish,[in] IHTMLTxtRange *pIRange);
+ HRESULT BeginUndoUnit([in] OLECHAR *pchTitle);
+ HRESULT EndUndoUnit();
+};
+
/*****************************************************************************
* IMarkupContainer interface
*/
--
2.20.1
May 31, 2019
Re: [PATCH] user32: Fix some leaks on error path (Coverity).
by Marvin
Hi,
While running your changed tests, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=53122
Your paranoid android.
=== debian9 (32 bit report) ===
user32:
win.c:10131: Test failed: GetActiveWindow() = 00000000
win.c:10131: Test failed: GetFocus() = 00000000
win.c:10133: Test failed: Expected foreground window 000E0120, got 00E300D4
win.c:10136: Test failed: Received WM_ACTIVATEAPP(0), did not expect it.
win.c:10143: Test failed: Expected foreground window 000E0120, got 00000000
win.c:10145: Test failed: GetActiveWindow() = 00000000
win.c:10145: Test failed: GetFocus() = 00000000
win.c:10150: Test failed: Expected foreground window 000E0120, got 00E300D4
win.c:10153: Test failed: Received WM_ACTIVATEAPP(1), did not expect it.
May 31, 2019