You've already forked wine-staging
mirror of
https://gitlab.winehq.org/wine/wine-staging.git
synced 2025-04-13 14:42:51 -07:00
Compare commits
9 Commits
Author | SHA1 | Date | |
---|---|---|---|
|
d935a41e61 | ||
|
31acabe792 | ||
|
1a2b47b084 | ||
|
2e9f238732 | ||
|
cf32a7092b | ||
|
4303e3ee3b | ||
|
49ed7ae4a0 | ||
|
eff142bc57 | ||
|
bd2608b12c |
@@ -1,4 +1,4 @@
|
||||
From 846f2603e9d2a3a3b5a56b0e1140bb49a95053a6 Mon Sep 17 00:00:00 2001
|
||||
From ec18233558b62aa736b5ecf20d2f7487e2823286 Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Thu, 7 Jun 2018 20:09:59 -0500
|
||||
Subject: [PATCH] server: Create server objects for eventfd-based
|
||||
@@ -15,7 +15,7 @@ Subject: [PATCH] server: Create server objects for eventfd-based
|
||||
create mode 100644 server/esync.h
|
||||
|
||||
diff --git a/server/Makefile.in b/server/Makefile.in
|
||||
index c81a2112632..da20dff9f56 100644
|
||||
index 3b9446fe224..776faec63e4 100644
|
||||
--- a/server/Makefile.in
|
||||
+++ b/server/Makefile.in
|
||||
@@ -11,6 +11,7 @@ C_SRCS = \
|
||||
@@ -28,7 +28,7 @@ index c81a2112632..da20dff9f56 100644
|
||||
file.c \
|
||||
diff --git a/server/esync.c b/server/esync.c
|
||||
new file mode 100644
|
||||
index 00000000000..b9dbfa322bc
|
||||
index 00000000000..35b4833fd4c
|
||||
--- /dev/null
|
||||
+++ b/server/esync.c
|
||||
@@ -0,0 +1,318 @@
|
||||
@@ -158,7 +158,7 @@ index 00000000000..b9dbfa322bc
|
||||
+ NULL, /* satisfied */
|
||||
+ no_signal, /* signal */
|
||||
+ no_get_fd, /* get_fd */
|
||||
+ no_map_access, /* map_access */
|
||||
+ default_map_access, /* map_access */
|
||||
+ default_get_sd, /* get_sd */
|
||||
+ default_set_sd, /* set_sd */
|
||||
+ default_get_full_name, /* get_full_name */
|
||||
@@ -403,10 +403,10 @@ index a134d811d82..3436b0871b4 100644
|
||||
set_current_time();
|
||||
init_scheduler();
|
||||
diff --git a/server/protocol.def b/server/protocol.def
|
||||
index 6bfcda213a4..6b0e0e6f6e4 100644
|
||||
index 99df502e398..9e15ada5bd0 100644
|
||||
--- a/server/protocol.def
|
||||
+++ b/server/protocol.def
|
||||
@@ -3738,7 +3738,6 @@ struct handle_info
|
||||
@@ -3777,7 +3777,6 @@ struct handle_info
|
||||
obj_handle_t handle; /* process handle */
|
||||
@END
|
||||
|
||||
@@ -414,7 +414,7 @@ index 6bfcda213a4..6b0e0e6f6e4 100644
|
||||
/* Iterate thread list for process */
|
||||
@REQ(get_next_thread)
|
||||
obj_handle_t process; /* process handle */
|
||||
@@ -3749,3 +3748,27 @@ struct handle_info
|
||||
@@ -3788,3 +3787,27 @@ struct handle_info
|
||||
@REPLY
|
||||
obj_handle_t handle; /* next thread handle */
|
||||
@END
|
||||
@@ -443,5 +443,5 @@ index 6bfcda213a4..6b0e0e6f6e4 100644
|
||||
+ unsigned int shm_idx;
|
||||
+@END
|
||||
--
|
||||
2.35.1
|
||||
2.38.1
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
From c204c9ed2a8504868c3cbf487e7a29c4e7254d3f Mon Sep 17 00:00:00 2001
|
||||
From 271f43a1fafb19e1404b05ec597b504ecad74784 Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <zfigura@codeweavers.com>
|
||||
Date: Mon, 6 Jul 2020 12:09:22 -0500
|
||||
Subject: [PATCH] ntdll: Create eventfd-based objects for semaphores.
|
||||
@@ -16,10 +16,10 @@ Subject: [PATCH] ntdll: Create eventfd-based objects for semaphores.
|
||||
create mode 100644 dlls/ntdll/unix/esync.h
|
||||
|
||||
diff --git a/dlls/ntdll/Makefile.in b/dlls/ntdll/Makefile.in
|
||||
index 185bc563e68..d7c757cab32 100644
|
||||
index 07688a5fcf6..4e490c475a2 100644
|
||||
--- a/dlls/ntdll/Makefile.in
|
||||
+++ b/dlls/ntdll/Makefile.in
|
||||
@@ -46,6 +46,7 @@ C_SRCS = \
|
||||
@@ -47,6 +47,7 @@ C_SRCS = \
|
||||
unix/cdrom.c \
|
||||
unix/debug.c \
|
||||
unix/env.c \
|
||||
@@ -346,7 +346,7 @@ index 00000000000..a50a755149a
|
||||
+
|
||||
+extern int receive_fd( obj_handle_t *handle ) DECLSPEC_HIDDEN;
|
||||
diff --git a/dlls/ntdll/unix/loader.c b/dlls/ntdll/unix/loader.c
|
||||
index 10884a7a673..28cc48e04bf 100644
|
||||
index 35f2e5f986f..4d95c29ab24 100644
|
||||
--- a/dlls/ntdll/unix/loader.c
|
||||
+++ b/dlls/ntdll/unix/loader.c
|
||||
@@ -89,6 +89,7 @@
|
||||
@@ -357,8 +357,8 @@ index 10884a7a673..28cc48e04bf 100644
|
||||
#include "wine/list.h"
|
||||
#include "wine/debug.h"
|
||||
|
||||
@@ -2082,6 +2083,7 @@ static void start_main_thread(void)
|
||||
signal_init_thread( teb );
|
||||
@@ -2188,6 +2189,7 @@ static void start_main_thread(void)
|
||||
signal_alloc_thread( teb );
|
||||
dbg_init();
|
||||
startup_info_size = server_init_process();
|
||||
+ esync_init();
|
||||
@@ -366,7 +366,7 @@ index 10884a7a673..28cc48e04bf 100644
|
||||
init_cpu_info();
|
||||
init_files();
|
||||
diff --git a/dlls/ntdll/unix/server.c b/dlls/ntdll/unix/server.c
|
||||
index 6a3224d8385..de65f936a59 100644
|
||||
index b7d8733f2bc..8cd5f0474e6 100644
|
||||
--- a/dlls/ntdll/unix/server.c
|
||||
+++ b/dlls/ntdll/unix/server.c
|
||||
@@ -106,7 +106,7 @@ sigset_t server_block_set; /* signals to block during server calls */
|
||||
@@ -378,7 +378,7 @@ index 6a3224d8385..de65f936a59 100644
|
||||
|
||||
/* atomically exchange a 64-bit value */
|
||||
static inline LONG64 interlocked_xchg64( LONG64 *dest, LONG64 val )
|
||||
@@ -803,7 +803,7 @@ void wine_server_send_fd( int fd )
|
||||
@@ -834,7 +834,7 @@ void wine_server_send_fd( int fd )
|
||||
*
|
||||
* Receive a file descriptor passed from the server.
|
||||
*/
|
||||
@@ -388,7 +388,7 @@ index 6a3224d8385..de65f936a59 100644
|
||||
struct iovec vec;
|
||||
struct msghdr msghdr;
|
||||
diff --git a/dlls/ntdll/unix/sync.c b/dlls/ntdll/unix/sync.c
|
||||
index 442243d8bcf..72cbf92f93c 100644
|
||||
index 9112572c67d..c5f30428f79 100644
|
||||
--- a/dlls/ntdll/unix/sync.c
|
||||
+++ b/dlls/ntdll/unix/sync.c
|
||||
@@ -64,6 +64,7 @@
|
||||
@@ -399,7 +399,7 @@ index 442243d8bcf..72cbf92f93c 100644
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(sync);
|
||||
|
||||
@@ -262,6 +263,9 @@ NTSTATUS WINAPI NtCreateSemaphore( HANDLE *handle, ACCESS_MASK access, const OBJ
|
||||
@@ -273,6 +274,9 @@ NTSTATUS WINAPI NtCreateSemaphore( HANDLE *handle, ACCESS_MASK access, const OBJ
|
||||
if (max <= 0 || initial < 0 || initial > max) return STATUS_INVALID_PARAMETER;
|
||||
if ((ret = alloc_object_attributes( attr, &objattr, &len ))) return ret;
|
||||
|
||||
@@ -422,5 +422,5 @@ index b9dbfa322bc..99e57eca44c 100644
|
||||
int do_esync(void)
|
||||
{
|
||||
--
|
||||
2.34.1
|
||||
2.38.1
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
From 161ae4c64b5e3bd33771671f518c482a6a66700b Mon Sep 17 00:00:00 2001
|
||||
From 614c13aed3d20a772c3ccd26547fa93a56fcc40b Mon Sep 17 00:00:00 2001
|
||||
From: Zebediah Figura <z.figura12@gmail.com>
|
||||
Date: Sun, 10 Jun 2018 19:08:18 -0500
|
||||
Subject: [PATCH] server: Implement esync_map_access().
|
||||
@@ -8,10 +8,10 @@ Subject: [PATCH] server: Implement esync_map_access().
|
||||
1 file changed, 12 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/server/esync.c b/server/esync.c
|
||||
index 1703608263f..20f149cdad3 100644
|
||||
index eca9b6aa67d..3a334b3b330 100644
|
||||
--- a/server/esync.c
|
||||
+++ b/server/esync.c
|
||||
@@ -114,6 +114,7 @@ struct esync
|
||||
@@ -112,6 +112,7 @@ struct esync
|
||||
};
|
||||
|
||||
static void esync_dump( struct object *obj, int verbose );
|
||||
@@ -19,16 +19,16 @@ index 1703608263f..20f149cdad3 100644
|
||||
static void esync_destroy( struct object *obj );
|
||||
|
||||
const struct object_ops esync_ops =
|
||||
@@ -128,7 +129,7 @@ const struct object_ops esync_ops =
|
||||
@@ -126,7 +127,7 @@ const struct object_ops esync_ops =
|
||||
NULL, /* satisfied */
|
||||
no_signal, /* signal */
|
||||
no_get_fd, /* get_fd */
|
||||
- no_map_access, /* map_access */
|
||||
- default_map_access, /* map_access */
|
||||
+ esync_map_access, /* map_access */
|
||||
default_get_sd, /* get_sd */
|
||||
default_set_sd, /* set_sd */
|
||||
default_get_full_name, /* get_full_name */
|
||||
@@ -148,6 +149,16 @@ static void esync_dump( struct object *obj, int verbose )
|
||||
@@ -146,6 +147,16 @@ static void esync_dump( struct object *obj, int verbose )
|
||||
fprintf( stderr, "esync fd=%d\n", esync->fd );
|
||||
}
|
||||
|
||||
@@ -46,5 +46,5 @@ index 1703608263f..20f149cdad3 100644
|
||||
{
|
||||
struct esync *esync = (struct esync *)obj;
|
||||
--
|
||||
2.28.0
|
||||
2.38.1
|
||||
|
||||
|
@@ -1,114 +0,0 @@
|
||||
From bef93835ceb4a482c348b0aa6e62ce4fee5e3f35 Mon Sep 17 00:00:00 2001
|
||||
From: Zhenbo Li <litimetal@gmail.com>
|
||||
Date: Tue, 1 Jul 2014 19:45:43 +0800
|
||||
Subject: [PATCH] mshtml: Add IHTMLLocation::hash property's getter
|
||||
implementation.
|
||||
|
||||
---
|
||||
dlls/mshtml/htmllocation.c | 11 ++++++--
|
||||
dlls/mshtml/tests/htmldoc.c | 53 ++++++++++++++++++++++++++++++++++++-
|
||||
2 files changed, 61 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/dlls/mshtml/htmllocation.c b/dlls/mshtml/htmllocation.c
|
||||
index 8f7800ff2a3..2b42939a39f 100644
|
||||
--- a/dlls/mshtml/htmllocation.c
|
||||
+++ b/dlls/mshtml/htmllocation.c
|
||||
@@ -524,8 +524,15 @@ static HRESULT WINAPI HTMLLocation_get_search(IHTMLLocation *iface, BSTR *p)
|
||||
static HRESULT WINAPI HTMLLocation_put_hash(IHTMLLocation *iface, BSTR v)
|
||||
{
|
||||
HTMLLocation *This = impl_from_IHTMLLocation(iface);
|
||||
- FIXME("(%p)->(%s)\n", This, debugstr_w(v));
|
||||
- return E_NOTIMPL;
|
||||
+
|
||||
+ TRACE("(%p)->(%s)\n", This, debugstr_w(v));
|
||||
+
|
||||
+ if(!This->window || !This->window->base.outer_window) {
|
||||
+ FIXME("No window available\n");
|
||||
+ return E_FAIL;
|
||||
+ }
|
||||
+
|
||||
+ return navigate_url(This->window->base.outer_window, v, This->window->base.outer_window->uri, 0);
|
||||
}
|
||||
|
||||
static HRESULT WINAPI HTMLLocation_get_hash(IHTMLLocation *iface, BSTR *p)
|
||||
diff --git a/dlls/mshtml/tests/htmldoc.c b/dlls/mshtml/tests/htmldoc.c
|
||||
index ff050863b6f..2c118d89d1d 100644
|
||||
--- a/dlls/mshtml/tests/htmldoc.c
|
||||
+++ b/dlls/mshtml/tests/htmldoc.c
|
||||
@@ -5963,6 +5963,56 @@ static void test_Persist(IHTMLDocument2 *doc, IMoniker *mon)
|
||||
}
|
||||
}
|
||||
|
||||
+static void test_put_hash(IHTMLDocument2 *doc, const WCHAR *new_hash)
|
||||
+{
|
||||
+ static WCHAR nav_url_buff[256];
|
||||
+ IHTMLLocation *location;
|
||||
+ BSTR str;
|
||||
+ WCHAR *psharp;
|
||||
+ HRESULT hres;
|
||||
+
|
||||
+ trace("put_hash, url = %s, new hash = %s\n", debugstr_w(nav_url), debugstr_w(new_hash));
|
||||
+
|
||||
+ location = NULL;
|
||||
+ hres = IHTMLDocument2_get_location(doc, &location);
|
||||
+ ok(hres == S_OK, "get_location failed: %08lx\n", hres);
|
||||
+ ok(location != NULL, "location == NULL\n");
|
||||
+
|
||||
+ SET_EXPECT(TranslateUrl);
|
||||
+ SET_EXPECT(Exec_ShellDocView_67);
|
||||
+ SET_EXPECT(FireBeforeNavigate2);
|
||||
+ SET_EXPECT(FireDocumentComplete);
|
||||
+ SET_EXPECT(FireNavigateComplete2);
|
||||
+
|
||||
+ /* Edit nav_url */
|
||||
+ wcscpy(nav_url_buff, nav_url);
|
||||
+ psharp = wcschr(nav_url_buff, '#');
|
||||
+ if (psharp)
|
||||
+ *psharp = '\0';
|
||||
+ wcscat(nav_url_buff, new_hash);
|
||||
+ nav_url = nav_url_buff;
|
||||
+
|
||||
+ str = SysAllocString(new_hash);
|
||||
+ hres = IHTMLLocation_put_hash(location, str);
|
||||
+ ok (hres == S_OK, "put_hash failed: %08lx\n", hres);
|
||||
+ SysFreeString(str);
|
||||
+
|
||||
+ CHECK_CALLED(TranslateUrl);
|
||||
+ CHECK_CALLED_BROKEN(Exec_ShellDocView_67); /* Broken on Win7 and 8 */
|
||||
+ CHECK_CALLED(FireBeforeNavigate2);
|
||||
+ CHECK_CALLED(FireDocumentComplete);
|
||||
+ CHECK_CALLED(FireNavigateComplete2);
|
||||
+
|
||||
+
|
||||
+ /* Check the result */
|
||||
+ hres = IHTMLLocation_get_hash(location, &str);
|
||||
+ ok(hres == S_OK, "get_hash failed: %08lx\n", hres);
|
||||
+ ok(!wcscmp(str, new_hash), "expected %s, got %s\n", debugstr_w(new_hash), debugstr_w(str));
|
||||
+ SysFreeString(str);
|
||||
+
|
||||
+ IHTMLLocation_Release(location);
|
||||
+}
|
||||
+
|
||||
static void test_put_href(IHTMLDocument2 *doc, BOOL use_replace, const WCHAR *href, const WCHAR *new_nav_url, BOOL is_js,
|
||||
BOOL is_hash, DWORD dwl_flags)
|
||||
{
|
||||
@@ -6148,7 +6198,7 @@ static void test_load_history(IHTMLDocument2 *doc)
|
||||
ok(hres == S_OK, "Could not get IPersistHistory iface: %08lx\n", hres);
|
||||
|
||||
prev_url = nav_url;
|
||||
- nav_url = L"http://test.winehq.org/tests/winehq_snapshot/#test";
|
||||
+ nav_url = L"http://test.winehq.org/tests/winehq_snapshot/#hash_test";
|
||||
nav_serv_url = L"http://test.winehq.org/tests/winehq_snapshot/";
|
||||
|
||||
SET_EXPECT(Exec_ShellDocView_138);
|
||||
@@ -8017,6 +8067,7 @@ static void test_HTMLDocument_http(BOOL with_wbapp)
|
||||
nav_url = nav_serv_url = L"http://test.winehq.org/tests/winehq_snapshot/"; /* for valid prev nav_url */
|
||||
if(support_wbapp) {
|
||||
test_put_href(doc, FALSE, L"#test", L"http://test.winehq.org/tests/winehq_snapshot/#test", FALSE, TRUE, 0);
|
||||
+ test_put_hash(doc, L"#hash_test");
|
||||
test_travellog(doc);
|
||||
test_refresh(doc);
|
||||
}
|
||||
--
|
||||
2.34.1
|
||||
|
@@ -1 +0,0 @@
|
||||
Fixes: [32967] Add IHTMLLocation::hash property's getter implementation
|
@@ -1,4 +1,4 @@
|
||||
From d28a26a59e9837191cc48854d5dad16eba532f04 Mon Sep 17 00:00:00 2001
|
||||
From 5814a4b9c7d4dec027b0c2dd29822664aa56ada1 Mon Sep 17 00:00:00 2001
|
||||
From: Paul Gofman <pgofman@codeweavers.com>
|
||||
Date: Tue, 14 Jan 2020 21:39:23 +0300
|
||||
Subject: [PATCH] ntdll: Increase step after failed map attempt in
|
||||
@@ -9,10 +9,10 @@ Subject: [PATCH] ntdll: Increase step after failed map attempt in
|
||||
1 file changed, 1 insertion(+)
|
||||
|
||||
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
|
||||
index d79e3de662e..f8f317a6483 100644
|
||||
index 84a4e331ad7..a63882023e6 100644
|
||||
--- a/dlls/ntdll/unix/virtual.c
|
||||
+++ b/dlls/ntdll/unix/virtual.c
|
||||
@@ -1073,6 +1073,7 @@ static void* try_map_free_area( void *base, void *end, ptrdiff_t step,
|
||||
@@ -1327,6 +1327,7 @@ static void* try_map_free_area( void *base, void *end, ptrdiff_t step,
|
||||
step == 0)
|
||||
break;
|
||||
start = (char *)start + step;
|
||||
@@ -21,5 +21,5 @@ index d79e3de662e..f8f317a6483 100644
|
||||
|
||||
return NULL;
|
||||
--
|
||||
2.26.2
|
||||
2.38.1
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
From 266f5082387ec92cb79a2ec3ce71d956cf05190d Mon Sep 17 00:00:00 2001
|
||||
From b1e6d32e7dc3bac93419f3a573f509ee6e1177b2 Mon Sep 17 00:00:00 2001
|
||||
From: Paul Gofman <pgofman@codeweavers.com>
|
||||
Date: Thu, 23 Jul 2020 18:40:39 +0300
|
||||
Subject: [PATCH] ntdll: Increase free ranges view block size on 64 bit.
|
||||
@@ -8,10 +8,10 @@ Subject: [PATCH] ntdll: Increase free ranges view block size on 64 bit.
|
||||
1 file changed, 4 insertions(+)
|
||||
|
||||
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
|
||||
index f8f317a6483..4ca033b0e19 100644
|
||||
index a63882023e6..83909f57d4a 100644
|
||||
--- a/dlls/ntdll/unix/virtual.c
|
||||
+++ b/dlls/ntdll/unix/virtual.c
|
||||
@@ -183,7 +183,11 @@ static BYTE *pages_vprot;
|
||||
@@ -205,7 +205,11 @@ static BYTE *pages_vprot;
|
||||
#endif
|
||||
|
||||
static struct file_view *view_block_start, *view_block_end, *next_free_view;
|
||||
@@ -24,5 +24,5 @@ index f8f317a6483..4ca033b0e19 100644
|
||||
static void *preload_reserve_end;
|
||||
static BOOL force_exec_prot; /* whether to force PROT_EXEC on all PROT_READ mmaps */
|
||||
--
|
||||
2.26.2
|
||||
2.38.1
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -1,25 +1,25 @@
|
||||
From bcc882f5d1980cbf353891d1e1686e97c068f8c7 Mon Sep 17 00:00:00 2001
|
||||
From d29a79d8cca2220c838fbbea6ea81b9f73070ba5 Mon Sep 17 00:00:00 2001
|
||||
From: Paul Gofman <pgofman@codeweavers.com>
|
||||
Date: Tue, 2 Jun 2020 21:06:33 +0300
|
||||
Subject: [PATCH] ntdll: Exclude natively mapped areas from free areas list.
|
||||
|
||||
---
|
||||
dlls/ntdll/unix/virtual.c | 137 ++++++++++++++++++++++++++++++--------
|
||||
1 file changed, 109 insertions(+), 28 deletions(-)
|
||||
dlls/ntdll/unix/virtual.c | 118 ++++++++++++++++++++++++++++++++------
|
||||
1 file changed, 100 insertions(+), 18 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
|
||||
index 4899fc7b443..cee739bd942 100644
|
||||
index 4bce8f2f806..3c1bf6edc30 100644
|
||||
--- a/dlls/ntdll/unix/virtual.c
|
||||
+++ b/dlls/ntdll/unix/virtual.c
|
||||
@@ -143,6 +143,7 @@ struct file_view
|
||||
#define VPROT_WRITEWATCH 0x40
|
||||
/* per-mapping protection flags */
|
||||
@@ -125,6 +125,7 @@ struct file_view
|
||||
#define VPROT_SYSTEM 0x0200 /* system view (underlying mmap not under our control) */
|
||||
+#define VPROT_NATIVE 0x0400
|
||||
#define VPROT_PLACEHOLDER 0x0400
|
||||
#define VPROT_FROMPLACEHOLDER 0x0800
|
||||
+#define VPROT_NATIVE 0x1000
|
||||
|
||||
/* Conversion from VPROT_* to Win32 flags */
|
||||
static const BYTE VIRTUAL_Win32Flags[16] =
|
||||
@@ -1081,7 +1082,9 @@ static void dump_view( struct file_view *view )
|
||||
@@ -1119,7 +1120,9 @@ static void dump_view( struct file_view *view )
|
||||
BYTE prot = get_page_vprot( addr );
|
||||
|
||||
TRACE( "View: %p - %p", addr, addr + view->size - 1 );
|
||||
@@ -28,26 +28,18 @@ index 4899fc7b443..cee739bd942 100644
|
||||
+ TRACE(" (native)\n");
|
||||
+ else if (view->protect & VPROT_SYSTEM)
|
||||
TRACE( " (builtin image)\n" );
|
||||
else if (view->protect & SEC_IMAGE)
|
||||
TRACE( " (image)\n" );
|
||||
@@ -1216,6 +1219,16 @@ static struct file_view *find_view_range( const void *addr, size_t size )
|
||||
return NULL;
|
||||
}
|
||||
|
||||
+struct alloc_area
|
||||
+{
|
||||
+ char *map_area_start, *map_area_end, *result;
|
||||
+ size_t size;
|
||||
+ ptrdiff_t step;
|
||||
+ int unix_prot;
|
||||
+ BOOL top_down;
|
||||
else if (view->protect & VPROT_PLACEHOLDER)
|
||||
TRACE( " (placeholder)\n" );
|
||||
@@ -1274,6 +1277,8 @@ struct alloc_area
|
||||
int unix_prot;
|
||||
BOOL top_down;
|
||||
UINT_PTR align_mask;
|
||||
+ char *native_mapped;
|
||||
+ size_t native_mapped_size;
|
||||
+};
|
||||
};
|
||||
|
||||
/***********************************************************************
|
||||
* try_map_free_area
|
||||
@@ -1223,21 +1236,27 @@ static struct file_view *find_view_range( const void *addr, size_t size )
|
||||
@@ -1282,21 +1287,28 @@ struct alloc_area
|
||||
* Try mmaping some expected free memory region, eventually stepping and
|
||||
* retrying inside it, and return where it actually succeeded, or NULL.
|
||||
*/
|
||||
@@ -56,6 +48,7 @@ index 4899fc7b443..cee739bd942 100644
|
||||
+static void* try_map_free_area( struct alloc_area *area, void *base, void *end, void *start )
|
||||
{
|
||||
+ ptrdiff_t step = area->step;
|
||||
+ UINT_PTR abs_step = step > 0 ? step : -step;
|
||||
void *ptr;
|
||||
|
||||
- while (start && base <= start && (char*)start + size <= (char*)end)
|
||||
@@ -71,54 +64,40 @@ index 4899fc7b443..cee739bd942 100644
|
||||
+ strerror(errno), start, (char *)start + area->size, area->unix_prot );
|
||||
return NULL;
|
||||
}
|
||||
+ if (!area->native_mapped && step)
|
||||
+ if (!area->native_mapped && step && abs_step < (granularity_mask + 1) * 2)
|
||||
+ {
|
||||
+ area->native_mapped = start;
|
||||
+ area->native_mapped_size = step > 0 ? step : -step;
|
||||
+ area->native_mapped_size = abs_step;
|
||||
+ area->native_mapped_size = min(area->native_mapped_size, (char *)end - (char *)start);
|
||||
+ }
|
||||
if ((step > 0 && (char *)end - (char *)start < step) ||
|
||||
(step < 0 && (char *)start - (char *)base < -step) ||
|
||||
step == 0)
|
||||
@@ -1666,15 +1685,6 @@ static inline void *unmap_extra_space( void *ptr, size_t total_size, size_t want
|
||||
}
|
||||
|
||||
|
||||
-struct alloc_area
|
||||
-{
|
||||
- char *map_area_start, *map_area_end, *result;
|
||||
- size_t size;
|
||||
- ptrdiff_t step;
|
||||
- int unix_prot;
|
||||
- BOOL top_down;
|
||||
-};
|
||||
-
|
||||
static int alloc_area_in_reserved_or_between_callback( void *start, SIZE_T size, void *arg )
|
||||
{
|
||||
char *intersect_start, *intersect_end;
|
||||
@@ -1700,8 +1710,8 @@ static int alloc_area_in_reserved_or_between_callback( void *start, SIZE_T size,
|
||||
@@ -1797,9 +1809,9 @@ static int alloc_area_in_reserved_or_between_callback( void *start, SIZE_T size,
|
||||
assert(intersect_start <= intersect_end);
|
||||
if (area->map_area_end - intersect_end >= area->size)
|
||||
{
|
||||
alloc_start = ROUND_ADDR( (char *)area->map_area_end - size, granularity_mask );
|
||||
- alloc_start = ROUND_ADDR( (char *)area->map_area_end - size, align_mask );
|
||||
- if ((area->result = try_map_free_area( intersect_end, alloc_start + size, area->step,
|
||||
- alloc_start, area->size, area->unix_prot )))
|
||||
+ alloc_start = ROUND_ADDR( (char *)area->map_area_end - area->size, align_mask );
|
||||
+ if ((area->result = try_map_free_area( area, intersect_end,
|
||||
+ alloc_start + size, alloc_start )))
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -1736,8 +1746,8 @@ static int alloc_area_in_reserved_or_between_callback( void *start, SIZE_T size,
|
||||
|
||||
@@ -1838,8 +1850,8 @@ static int alloc_area_in_reserved_or_between_callback( void *start, SIZE_T size,
|
||||
if (intersect_start - area->map_area_start >= area->size)
|
||||
{
|
||||
alloc_start = ROUND_ADDR( area->map_area_start + align_mask, align_mask );
|
||||
- if ((area->result = try_map_free_area( area->map_area_start, intersect_start, area->step,
|
||||
- area->map_area_start, area->size, area->unix_prot )))
|
||||
- alloc_start, area->size, area->unix_prot )))
|
||||
+ if ((area->result = try_map_free_area( area, area->map_area_start,
|
||||
+ intersect_start, area->map_area_start )))
|
||||
+ intersect_start, alloc_start )))
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -1792,8 +1802,7 @@ static void *alloc_free_area_in_range( struct alloc_area *area, char *base, char
|
||||
@@ -1900,8 +1912,7 @@ static void *alloc_free_area_in_range( struct alloc_area *area, char *base, char
|
||||
if (start >= area->map_area_end || start < area->map_area_start)
|
||||
return NULL;
|
||||
|
||||
@@ -128,7 +107,7 @@ index 4899fc7b443..cee739bd942 100644
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1802,8 +1811,7 @@ static void *alloc_free_area_in_range( struct alloc_area *area, char *base, char
|
||||
@@ -1911,8 +1922,7 @@ static void *alloc_free_area_in_range( struct alloc_area *area, char *base, char
|
||||
|| area->map_area_end - start < area->size)
|
||||
return NULL;
|
||||
|
||||
@@ -138,7 +117,7 @@ index 4899fc7b443..cee739bd942 100644
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1813,6 +1821,7 @@ static void *alloc_free_area( void *limit, size_t size, BOOL top_down, int unix_
|
||||
@@ -1922,6 +1932,7 @@ static void *alloc_free_area( void *limit, size_t size, BOOL top_down, int unix_
|
||||
char *reserve_start, *reserve_end;
|
||||
struct alloc_area area;
|
||||
char *base, *end;
|
||||
@@ -146,20 +125,9 @@ index 4899fc7b443..cee739bd942 100644
|
||||
int ranges_inc;
|
||||
|
||||
TRACE("limit %p, size %p, top_down %#x.\n", limit, (void *)size, top_down);
|
||||
@@ -1868,16 +1877,67 @@ static void *alloc_free_area( void *limit, size_t size, BOOL top_down, int unix_
|
||||
{
|
||||
/* range is split in two by the preloader reservation, try first part. */
|
||||
if ((area.result = alloc_free_area_in_range( &area, base, reserve_start )))
|
||||
- return area.result;
|
||||
+ break;
|
||||
/* then fall through to try second part. */
|
||||
base = reserve_end;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1991,7 +2002,58 @@ static void *alloc_free_area( void *limit, size_t size, BOOL top_down, int unix_
|
||||
if ((area.result = alloc_free_area_in_range( &area, base, end )))
|
||||
- return area.result;
|
||||
+ break;
|
||||
break;
|
||||
}
|
||||
- return NULL;
|
||||
+
|
||||
@@ -217,7 +185,7 @@ index 4899fc7b443..cee739bd942 100644
|
||||
}
|
||||
|
||||
/***********************************************************************
|
||||
@@ -1931,6 +1991,17 @@ static NTSTATUS map_fixed_area( void *base, size_t size, unsigned int vprot )
|
||||
@@ -2045,6 +2107,17 @@ static NTSTATUS map_fixed_area( void *base, size_t size, unsigned int vprot )
|
||||
return STATUS_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -235,21 +203,20 @@ index 4899fc7b443..cee739bd942 100644
|
||||
/***********************************************************************
|
||||
* map_view
|
||||
*
|
||||
@@ -1954,7 +2025,12 @@ static NTSTATUS map_view( struct file_view **view_ret, void *base, size_t size,
|
||||
else if (!(ptr = alloc_free_area( (void*)(get_zero_bits_mask( zero_bits )
|
||||
& (UINT_PTR)user_space_limit), size, top_down, get_unix_prot( vprot ) )))
|
||||
@@ -2097,7 +2170,11 @@ static NTSTATUS map_view( struct file_view **view_ret, void *base, size_t size,
|
||||
}
|
||||
else if (!(ptr = alloc_free_area( (void *)limit, size, top_down, get_unix_prot( vprot ), align_mask )))
|
||||
{
|
||||
- return STATUS_NO_MEMORY;
|
||||
+ WARN("Allocation failed, clearing native views.\n");
|
||||
+
|
||||
+ clear_native_views();
|
||||
+ if (!(ptr = alloc_free_area( (void*)(get_zero_bits_mask( zero_bits )
|
||||
+ & (UINT_PTR)user_space_limit), size, top_down, get_unix_prot( vprot ) )))
|
||||
+ if (!(ptr = alloc_free_area( (void *)limit, size, top_down, get_unix_prot( vprot ), align_mask )))
|
||||
+ return STATUS_NO_MEMORY;
|
||||
}
|
||||
status = create_view( view_ret, ptr, size, vprot );
|
||||
if (status != STATUS_SUCCESS) unmap_area( ptr, size );
|
||||
@@ -3646,7 +3722,12 @@ void virtual_set_force_exec( BOOL enable )
|
||||
@@ -3835,7 +3912,12 @@ void virtual_set_force_exec( BOOL enable )
|
||||
WINE_RB_FOR_EACH_ENTRY( view, &views_tree, struct file_view, entry )
|
||||
{
|
||||
/* file mappings are always accessible */
|
||||
@@ -264,5 +231,5 @@ index 4899fc7b443..cee739bd942 100644
|
||||
mprotect_range( view->base, view->size, commit, 0 );
|
||||
}
|
||||
--
|
||||
2.30.2
|
||||
2.38.1
|
||||
|
||||
|
@@ -1,2 +1,3 @@
|
||||
Fixes: [48175] AION (64 bit) - crashes in crysystem.dll.CryFree() due to high memory pointers allocated
|
||||
Fixes: [46568] 64-bit msxml6.dll from Microsoft Core XML Services 6.0 redist package fails to load (Wine doesn't respect 44-bit user-mode VA limitation from Windows < 8.1)
|
||||
Depends: ntdll-Placeholders
|
||||
|
@@ -1,4 +1,4 @@
|
||||
From 2900e5cd5220e8a41e7c5a5971f7a32e72f508f5 Mon Sep 17 00:00:00 2001
|
||||
From 0e69c40a24de97bb97f3a0e94f39cff07326ebe7 Mon Sep 17 00:00:00 2001
|
||||
From: Sebastian Lackner <sebastian@fds-team.de>
|
||||
Date: Sat, 30 May 2015 02:23:15 +0200
|
||||
Subject: [PATCH] ntdll: Add support for hiding wine version information from
|
||||
@@ -10,10 +10,10 @@ Subject: [PATCH] ntdll: Add support for hiding wine version information from
|
||||
2 files changed, 103 insertions(+), 1 deletion(-)
|
||||
|
||||
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
|
||||
index 23d44aae64c..77dd56c88f1 100644
|
||||
index 2e118a55490..c16c3fd01a1 100644
|
||||
--- a/dlls/ntdll/loader.c
|
||||
+++ b/dlls/ntdll/loader.c
|
||||
@@ -89,6 +89,9 @@ HMODULE kernel32_handle = 0;
|
||||
@@ -87,6 +87,9 @@ const WCHAR system_dir[] = L"C:\\windows\\system32\\";
|
||||
/* system search path */
|
||||
static const WCHAR system_path[] = L"C:\\windows\\system32;C:\\windows\\system;C:\\windows";
|
||||
|
||||
@@ -23,7 +23,7 @@ index 23d44aae64c..77dd56c88f1 100644
|
||||
static BOOL is_prefix_bootstrap; /* are we bootstrapping the prefix? */
|
||||
static BOOL imports_fixup_done = FALSE; /* set once the imports have been fixed up, before attaching them */
|
||||
static BOOL process_detaching = FALSE; /* set on process detach to avoid deadlocks with thread detach */
|
||||
@@ -107,6 +110,8 @@ struct dll_dir_entry
|
||||
@@ -106,6 +109,8 @@ struct dll_dir_entry
|
||||
|
||||
static struct list dll_dir_list = LIST_INIT( dll_dir_list ); /* extra dirs from LdrAddDllDirectory */
|
||||
|
||||
@@ -32,7 +32,7 @@ index 23d44aae64c..77dd56c88f1 100644
|
||||
struct ldr_notification
|
||||
{
|
||||
struct list entry;
|
||||
@@ -1862,6 +1867,96 @@ NTSTATUS WINAPI LdrUnlockLoaderLock( ULONG flags, ULONG_PTR magic )
|
||||
@@ -1980,6 +1985,96 @@ NTSTATUS WINAPI LdrUnlockLoaderLock( ULONG flags, ULONG_PTR magic )
|
||||
}
|
||||
|
||||
|
||||
@@ -129,7 +129,7 @@ index 23d44aae64c..77dd56c88f1 100644
|
||||
/******************************************************************
|
||||
* LdrGetProcedureAddress (NTDLL.@)
|
||||
*/
|
||||
@@ -1881,7 +1976,7 @@ NTSTATUS WINAPI LdrGetProcedureAddress(HMODULE module, const ANSI_STRING *name,
|
||||
@@ -1999,7 +2094,7 @@ NTSTATUS WINAPI LdrGetProcedureAddress(HMODULE module, const ANSI_STRING *name,
|
||||
{
|
||||
void *proc = name ? find_named_export( module, exports, exp_size, name->Buffer, -1, NULL )
|
||||
: find_ordinal_export( module, exports, exp_size, ord - exports->Base, NULL );
|
||||
@@ -138,20 +138,20 @@ index 23d44aae64c..77dd56c88f1 100644
|
||||
{
|
||||
*address = proc;
|
||||
ret = STATUS_SUCCESS;
|
||||
@@ -2121,6 +2216,8 @@ static void build_ntdll_module(void)
|
||||
wm->ldr.Flags &= ~LDR_DONT_RESOLVE_REFS;
|
||||
node_ntdll = wm->ldr.DdagNode;
|
||||
@@ -2242,6 +2337,8 @@ static void build_ntdll_module(void)
|
||||
if (TRACE_ON(relay)) RELAY_SetupDLL( meminfo.AllocationBase );
|
||||
NtQueryVirtualMemory( GetCurrentProcess(), meminfo.AllocationBase, MemoryWineUnixFuncs,
|
||||
&ntdll_unix_handle, sizeof(ntdll_unix_handle), NULL );
|
||||
+
|
||||
+ hidden_exports_init( wm->ldr.FullDllName.Buffer );
|
||||
}
|
||||
|
||||
|
||||
diff --git a/dlls/ntdll/ntdll_misc.h b/dlls/ntdll/ntdll_misc.h
|
||||
index 27de37d5b88..a8c5e335870 100644
|
||||
index 99b563ca07c..5a201f5221c 100644
|
||||
--- a/dlls/ntdll/ntdll_misc.h
|
||||
+++ b/dlls/ntdll/ntdll_misc.h
|
||||
@@ -149,6 +149,11 @@ static inline TEB64 *NtCurrentTeb64(void) { return (TEB64 *)NtCurrentTeb()->GdiB
|
||||
@@ -152,6 +152,11 @@ static inline TEB64 *NtCurrentTeb64(void) { return (TEB64 *)NtCurrentTeb()->GdiB
|
||||
|
||||
NTSTATUS WINAPI RtlHashUnicodeString(PCUNICODE_STRING,BOOLEAN,ULONG,ULONG*);
|
||||
|
||||
@@ -164,5 +164,5 @@ index 27de37d5b88..a8c5e335870 100644
|
||||
static inline void ascii_to_unicode( WCHAR *dst, const char *src, size_t len )
|
||||
{
|
||||
--
|
||||
2.33.0
|
||||
2.38.1
|
||||
|
||||
|
@@ -1,4 +1,4 @@
|
||||
From 5a529bea97ee22d51f07f9d3cd77c00ea5292878 Mon Sep 17 00:00:00 2001
|
||||
From 0dfebc8cb8ed9804c6616fe7eec519b7c3e7ea13 Mon Sep 17 00:00:00 2001
|
||||
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
|
||||
Date: Thu, 16 Jan 2014 20:56:49 -0700
|
||||
Subject: [PATCH] ntdll: Add support for creating reparse points.
|
||||
@@ -13,10 +13,10 @@ Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
|
||||
5 files changed, 447 insertions(+), 19 deletions(-)
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index 628cce28815..2adf40c0ef1 100644
|
||||
index 16c4c33d816..e492a707a48 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -2018,6 +2018,8 @@ AC_CHECK_FUNCS(\
|
||||
@@ -2061,6 +2061,8 @@ AC_CHECK_FUNCS(\
|
||||
prctl \
|
||||
proc_pidinfo \
|
||||
sched_yield \
|
||||
@@ -26,7 +26,7 @@ index 628cce28815..2adf40c0ef1 100644
|
||||
setprogname \
|
||||
sigprocmask \
|
||||
diff --git a/dlls/ntdll/Makefile.in b/dlls/ntdll/Makefile.in
|
||||
index 3b1cdb54f9f..6eb4690f8e0 100644
|
||||
index 89e4d5bb579..07688a5fcf6 100644
|
||||
--- a/dlls/ntdll/Makefile.in
|
||||
+++ b/dlls/ntdll/Makefile.in
|
||||
@@ -4,7 +4,7 @@ UNIXLIB = ntdll.so
|
||||
@@ -36,8 +36,8 @@ index 3b1cdb54f9f..6eb4690f8e0 100644
|
||||
-UNIX_LIBS = $(IOKIT_LIBS) $(COREFOUNDATION_LIBS) $(CORESERVICES_LIBS) $(RT_LIBS) $(PTHREAD_LIBS) $(UNWIND_LIBS) $(I386_LIBS) $(PROCSTAT_LIBS)
|
||||
+UNIX_LIBS = $(IOKIT_LIBS) $(COREFOUNDATION_LIBS) $(CORESERVICES_LIBS) $(RT_LIBS) $(PTHREAD_LIBS) $(UNWIND_LIBS) $(I386_LIBS) $(PROCSTAT_LIBS) -lm
|
||||
|
||||
EXTRADLLFLAGS = -nodefaultlibs -Wl,--image-base,0x7bc00000
|
||||
x86_64_EXTRADLLFLAGS = -nodefaultlibs -Wl,--image-base,0x170000000
|
||||
EXTRADLLFLAGS = -nodefaultlibs
|
||||
i386_EXTRADLLFLAGS = -Wl,--image-base,0x7bc00000
|
||||
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
|
||||
index 98d9e6b3b0a..93e50bd6952 100644
|
||||
--- a/dlls/ntdll/tests/file.c
|
||||
@@ -586,10 +586,10 @@ index 6b73d9dc7e8..52b85cfc6d1 100644
|
||||
TRACE("FSCTL_SET_SPARSE: Ignoring request\n");
|
||||
io->Information = 0;
|
||||
diff --git a/include/Makefile.in b/include/Makefile.in
|
||||
index 1c04f9a298b..7a2c9f96c1b 100644
|
||||
index 28ac4b3f2dc..7c69ddbfddf 100644
|
||||
--- a/include/Makefile.in
|
||||
+++ b/include/Makefile.in
|
||||
@@ -563,6 +563,7 @@ SOURCES = \
|
||||
@@ -564,6 +564,7 @@ SOURCES = \
|
||||
ntdef.h \
|
||||
ntdsapi.h \
|
||||
ntgdi.h \
|
||||
@@ -598,5 +598,5 @@ index 1c04f9a298b..7a2c9f96c1b 100644
|
||||
ntquery.h \
|
||||
ntsecapi.h \
|
||||
--
|
||||
2.37.2
|
||||
2.38.1
|
||||
|
||||
|
@@ -0,0 +1,105 @@
|
||||
From 7c13335d926a1b47f7cf88065d641c4d5fa80a59 Mon Sep 17 00:00:00 2001
|
||||
From: Paul Gofman <pgofman@codeweavers.com>
|
||||
Date: Fri, 11 Nov 2022 17:51:26 -0600
|
||||
Subject: [PATCH] ntdll/tests: Add tests for freeing a part of view.
|
||||
|
||||
---
|
||||
dlls/ntdll/tests/virtual.c | 70 ++++++++++++++++++++++++++++++++++++--
|
||||
1 file changed, 67 insertions(+), 3 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/tests/virtual.c b/dlls/ntdll/tests/virtual.c
|
||||
index 6831fe3c522..8e94566fb7f 100644
|
||||
--- a/dlls/ntdll/tests/virtual.c
|
||||
+++ b/dlls/ntdll/tests/virtual.c
|
||||
@@ -1639,21 +1639,85 @@ static void test_syscalls(void)
|
||||
|
||||
static void test_NtFreeVirtualMemory(void)
|
||||
{
|
||||
+ void *addr1, *addr;
|
||||
NTSTATUS status;
|
||||
- void *addr1;
|
||||
SIZE_T size;
|
||||
|
||||
size = 0x10000;
|
||||
addr1 = NULL;
|
||||
- status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr1, 0, &size, MEM_RESERVE, PAGE_READWRITE);
|
||||
+ status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr1, 0, &size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
|
||||
ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status);
|
||||
|
||||
size = 0;
|
||||
status = NtFreeVirtualMemory(NULL, &addr1, &size, MEM_RELEASE);
|
||||
ok(status == STATUS_INVALID_HANDLE, "Unexpected status %08lx.\n", status);
|
||||
|
||||
+ addr = (char *)addr1 + 0x1000;
|
||||
+ size = 0;
|
||||
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr, &size, MEM_RELEASE);
|
||||
+ ok(status == STATUS_FREE_VM_NOT_AT_BASE, "Unexpected status %08lx.\n", status);
|
||||
+
|
||||
+ size = 0x11000;
|
||||
status = NtFreeVirtualMemory(NtCurrentProcess(), &addr1, &size, MEM_RELEASE);
|
||||
- ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status);
|
||||
+ todo_wine ok(status == STATUS_UNABLE_TO_FREE_VM, "Unexpected status %08lx.\n", status);
|
||||
+
|
||||
+ addr = (char *)addr1 + 0x1001;
|
||||
+ size = 0xffff;
|
||||
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr, &size, MEM_RELEASE);
|
||||
+ todo_wine ok(status == STATUS_UNABLE_TO_FREE_VM, "Unexpected status %08lx.\n", status);
|
||||
+ ok(size == 0xffff, "Unexpected size %p.\n", (void *)size);
|
||||
+ ok(addr == (char *)addr1 + 0x1001, "Got addr %p, addr1 %p.\n", addr, addr1);
|
||||
+
|
||||
+ size = 0xfff;
|
||||
+ addr = (char *)addr1 + 0x1001;
|
||||
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr, &size, MEM_RELEASE);
|
||||
+ todo_wine ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status);
|
||||
+ *(volatile char *)addr1 = 1;
|
||||
+ *((volatile char *)addr1 + 0x2000) = 1;
|
||||
+ todo_wine ok(size == 0x1000, "Unexpected size %p.\n", (void *)size);
|
||||
+ todo_wine ok(addr == (char *)addr1 + 0x1000, "Got addr %p, addr1 %p.\n", addr, addr1);
|
||||
+
|
||||
+ size = 0xfff;
|
||||
+ addr = (char *)addr1 + 1;
|
||||
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr, &size, MEM_RELEASE);
|
||||
+ todo_wine ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status);
|
||||
+ *((volatile char *)addr1 + 0x2000) = 1;
|
||||
+ todo_wine ok(size == 0x1000, "Unexpected size %p.\n", (void *)size);
|
||||
+ todo_wine ok(addr == addr1, "Got addr %p, addr1 %p.\n", addr, addr1);
|
||||
+
|
||||
+ size = 0x1000;
|
||||
+ addr = addr1;
|
||||
+ status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr, 0, &size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
|
||||
+ todo_wine ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status);
|
||||
+ ok(addr == addr1, "Unexpected addr %p, addr1 %p.\n", addr, addr1);
|
||||
+ ok(size == 0x1000, "Unexpected size %p.\n", (void *)size);
|
||||
+
|
||||
+ size = 0x10000;
|
||||
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr1, &size, MEM_DECOMMIT);
|
||||
+ todo_wine ok(status == STATUS_UNABLE_TO_FREE_VM, "Unexpected status %08lx.\n", status);
|
||||
+
|
||||
+ size = 0x10000;
|
||||
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr1, &size, MEM_RELEASE);
|
||||
+ todo_wine ok(status == STATUS_UNABLE_TO_FREE_VM, "Unexpected status %08lx.\n", status);
|
||||
+
|
||||
+ size = 0;
|
||||
+ addr = (char *)addr1 + 0x1000;
|
||||
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr, &size, MEM_RELEASE);
|
||||
+ todo_wine ok(status == STATUS_MEMORY_NOT_ALLOCATED, "Unexpected status %08lx.\n", status);
|
||||
+
|
||||
+ size = 0x1000;
|
||||
+ addr = (char *)addr1 + 0x1000;
|
||||
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr, &size, MEM_DECOMMIT);
|
||||
+ todo_wine ok(status == STATUS_MEMORY_NOT_ALLOCATED, "Unexpected status %08lx.\n", status);
|
||||
+
|
||||
+ size = 0;
|
||||
+ addr = (char *)addr1 + 0x2000;
|
||||
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr, &size, MEM_RELEASE);
|
||||
+ todo_wine ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status);
|
||||
+
|
||||
+ size = 0x1000;
|
||||
+ status = NtFreeVirtualMemory(NtCurrentProcess(), &addr1, &size, MEM_RELEASE);
|
||||
+ todo_wine ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status);
|
||||
}
|
||||
|
||||
static void test_prefetch(void)
|
||||
--
|
||||
2.38.1
|
||||
|
@@ -0,0 +1,30 @@
|
||||
From bc937422e5f600be650e21de5f6c9b8656d5c23c Mon Sep 17 00:00:00 2001
|
||||
From: Paul Gofman <pgofman@codeweavers.com>
|
||||
Date: Fri, 11 Nov 2022 17:56:42 -0600
|
||||
Subject: [PATCH] kernelbase: Validate nonzero size for MEM_RELEASE in
|
||||
VirtualFreeEx().
|
||||
|
||||
---
|
||||
dlls/kernelbase/memory.c | 6 ++++++
|
||||
1 file changed, 6 insertions(+)
|
||||
|
||||
diff --git a/dlls/kernelbase/memory.c b/dlls/kernelbase/memory.c
|
||||
index 2a503587e93..c01fe817972 100644
|
||||
--- a/dlls/kernelbase/memory.c
|
||||
+++ b/dlls/kernelbase/memory.c
|
||||
@@ -447,6 +447,12 @@ BOOL WINAPI DECLSPEC_HOTPATCH VirtualFree( void *addr, SIZE_T size, DWORD type )
|
||||
*/
|
||||
BOOL WINAPI DECLSPEC_HOTPATCH VirtualFreeEx( HANDLE process, void *addr, SIZE_T size, DWORD type )
|
||||
{
|
||||
+ if (type == MEM_RELEASE && size)
|
||||
+ {
|
||||
+ WARN( "Trying to release memory with specified size.\n" );
|
||||
+ SetLastError( ERROR_INVALID_PARAMETER );
|
||||
+ return FALSE;
|
||||
+ }
|
||||
return set_ntstatus( NtFreeVirtualMemory( process, &addr, &size, type ));
|
||||
}
|
||||
|
||||
--
|
||||
2.38.1
|
||||
|
@@ -0,0 +1,117 @@
|
||||
From 22dc17764c3b231ebd226e479686a00c7aaaf01a Mon Sep 17 00:00:00 2001
|
||||
From: Paul Gofman <pgofman@codeweavers.com>
|
||||
Date: Fri, 11 Nov 2022 18:12:47 -0600
|
||||
Subject: [PATCH] ntdll: Fix size validation in NtFreeVirtualMemory().
|
||||
|
||||
---
|
||||
dlls/ntdll/tests/virtual.c | 16 ++++++++--------
|
||||
dlls/ntdll/unix/virtual.c | 26 ++++++++++++++++++--------
|
||||
2 files changed, 26 insertions(+), 16 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/tests/virtual.c b/dlls/ntdll/tests/virtual.c
|
||||
index 8e94566fb7f..81e9bd0bda3 100644
|
||||
--- a/dlls/ntdll/tests/virtual.c
|
||||
+++ b/dlls/ntdll/tests/virtual.c
|
||||
@@ -1659,12 +1659,12 @@ static void test_NtFreeVirtualMemory(void)
|
||||
|
||||
size = 0x11000;
|
||||
status = NtFreeVirtualMemory(NtCurrentProcess(), &addr1, &size, MEM_RELEASE);
|
||||
- todo_wine ok(status == STATUS_UNABLE_TO_FREE_VM, "Unexpected status %08lx.\n", status);
|
||||
+ ok(status == STATUS_UNABLE_TO_FREE_VM, "Unexpected status %08lx.\n", status);
|
||||
|
||||
addr = (char *)addr1 + 0x1001;
|
||||
size = 0xffff;
|
||||
status = NtFreeVirtualMemory(NtCurrentProcess(), &addr, &size, MEM_RELEASE);
|
||||
- todo_wine ok(status == STATUS_UNABLE_TO_FREE_VM, "Unexpected status %08lx.\n", status);
|
||||
+ ok(status == STATUS_UNABLE_TO_FREE_VM, "Unexpected status %08lx.\n", status);
|
||||
ok(size == 0xffff, "Unexpected size %p.\n", (void *)size);
|
||||
ok(addr == (char *)addr1 + 0x1001, "Got addr %p, addr1 %p.\n", addr, addr1);
|
||||
|
||||
@@ -1674,16 +1674,16 @@ static void test_NtFreeVirtualMemory(void)
|
||||
todo_wine ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status);
|
||||
*(volatile char *)addr1 = 1;
|
||||
*((volatile char *)addr1 + 0x2000) = 1;
|
||||
- todo_wine ok(size == 0x1000, "Unexpected size %p.\n", (void *)size);
|
||||
- todo_wine ok(addr == (char *)addr1 + 0x1000, "Got addr %p, addr1 %p.\n", addr, addr1);
|
||||
+ ok(size == 0x1000, "Unexpected size %p.\n", (void *)size);
|
||||
+ ok(addr == (char *)addr1 + 0x1000, "Got addr %p, addr1 %p.\n", addr, addr1);
|
||||
|
||||
size = 0xfff;
|
||||
addr = (char *)addr1 + 1;
|
||||
status = NtFreeVirtualMemory(NtCurrentProcess(), &addr, &size, MEM_RELEASE);
|
||||
todo_wine ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status);
|
||||
*((volatile char *)addr1 + 0x2000) = 1;
|
||||
- todo_wine ok(size == 0x1000, "Unexpected size %p.\n", (void *)size);
|
||||
- todo_wine ok(addr == addr1, "Got addr %p, addr1 %p.\n", addr, addr1);
|
||||
+ ok(size == 0x1000, "Unexpected size %p.\n", (void *)size);
|
||||
+ ok(addr == addr1, "Got addr %p, addr1 %p.\n", addr, addr1);
|
||||
|
||||
size = 0x1000;
|
||||
addr = addr1;
|
||||
@@ -1703,12 +1703,12 @@ static void test_NtFreeVirtualMemory(void)
|
||||
size = 0;
|
||||
addr = (char *)addr1 + 0x1000;
|
||||
status = NtFreeVirtualMemory(NtCurrentProcess(), &addr, &size, MEM_RELEASE);
|
||||
- todo_wine ok(status == STATUS_MEMORY_NOT_ALLOCATED, "Unexpected status %08lx.\n", status);
|
||||
+ ok(status == STATUS_MEMORY_NOT_ALLOCATED, "Unexpected status %08lx.\n", status);
|
||||
|
||||
size = 0x1000;
|
||||
addr = (char *)addr1 + 0x1000;
|
||||
status = NtFreeVirtualMemory(NtCurrentProcess(), &addr, &size, MEM_DECOMMIT);
|
||||
- todo_wine ok(status == STATUS_MEMORY_NOT_ALLOCATED, "Unexpected status %08lx.\n", status);
|
||||
+ ok(status == STATUS_MEMORY_NOT_ALLOCATED, "Unexpected status %08lx.\n", status);
|
||||
|
||||
size = 0;
|
||||
addr = (char *)addr1 + 0x2000;
|
||||
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
|
||||
index 24d5a4e2da8..4cb0f349ffc 100644
|
||||
--- a/dlls/ntdll/unix/virtual.c
|
||||
+++ b/dlls/ntdll/unix/virtual.c
|
||||
@@ -4127,26 +4127,36 @@ NTSTATUS WINAPI NtFreeVirtualMemory( HANDLE process, PVOID *addr_ptr, SIZE_T *si
|
||||
if (addr == (void *)1 && !size && type == MEM_RELEASE) virtual_release_address_space();
|
||||
else status = STATUS_INVALID_PARAMETER;
|
||||
}
|
||||
- else if (!(view = find_view( base, size )) || !is_view_valloc( view ))
|
||||
- {
|
||||
- status = STATUS_INVALID_PARAMETER;
|
||||
- }
|
||||
+ else if (!(view = find_view( base, 0 ))) status = STATUS_MEMORY_NOT_ALLOCATED;
|
||||
+ else if (!is_view_valloc( view )) status = STATUS_INVALID_PARAMETER;
|
||||
else if (type == MEM_RELEASE)
|
||||
{
|
||||
/* Free the pages */
|
||||
|
||||
- if (size) status = STATUS_INVALID_PARAMETER;
|
||||
- else if (base != view->base) status = STATUS_FREE_VM_NOT_AT_BASE;
|
||||
+ if (size && (char *)view->base + view->size - base < size) status = STATUS_UNABLE_TO_FREE_VM;
|
||||
+ else if (!size && base != view->base) status = STATUS_FREE_VM_NOT_AT_BASE;
|
||||
else
|
||||
{
|
||||
+ if (!size) size = view->size;
|
||||
+
|
||||
+ if (size == view->size)
|
||||
+ {
|
||||
+ assert( base == view->base );
|
||||
+ delete_view( view );
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ FIXME( "Parial view release is not supported.\n" );
|
||||
+ status = STATUS_INVALID_PARAMETER;
|
||||
+ }
|
||||
*addr_ptr = base;
|
||||
- *size_ptr = view->size;
|
||||
- delete_view( view );
|
||||
+ *size_ptr = size;
|
||||
}
|
||||
}
|
||||
else if (type == MEM_DECOMMIT)
|
||||
{
|
||||
if (!size && base != view->base) status = STATUS_FREE_VM_NOT_AT_BASE;
|
||||
+ else if (base - (char *)view->base + size > view->size) status = STATUS_UNABLE_TO_FREE_VM;
|
||||
else status = decommit_pages( view, base - (char *)view->base, size );
|
||||
if (status == STATUS_SUCCESS)
|
||||
{
|
||||
--
|
||||
2.38.1
|
||||
|
@@ -0,0 +1,81 @@
|
||||
From c97697f6bbc3c9671210e480f2fcfe761b54893d Mon Sep 17 00:00:00 2001
|
||||
From: Paul Gofman <pgofman@codeweavers.com>
|
||||
Date: Fri, 11 Nov 2022 18:30:20 -0600
|
||||
Subject: [PATCH] ntdll: Fully support unaligned views in free ranges
|
||||
management.
|
||||
|
||||
---
|
||||
dlls/ntdll/unix/virtual.c | 41 ++++++++++++++++++++-------------------
|
||||
1 file changed, 21 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
|
||||
index 4cb0f349ffc..2dca5dfa45f 100644
|
||||
--- a/dlls/ntdll/unix/virtual.c
|
||||
+++ b/dlls/ntdll/unix/virtual.c
|
||||
@@ -749,18 +749,19 @@ static void free_ranges_insert_view( struct file_view *view )
|
||||
assert( range != free_ranges_end );
|
||||
assert( range->end > view_base || next != free_ranges_end );
|
||||
|
||||
- /* this happens because virtual_alloc_thread_stack shrinks a view, then creates another one on top,
|
||||
- * or because AT_ROUND_TO_PAGE was used with NtMapViewOfSection to force 4kB aligned mapping. */
|
||||
- if ((range->end > view_base && range->base >= view_end) ||
|
||||
- (range->end == view_base && next->base >= view_end))
|
||||
- {
|
||||
- /* on Win64, assert that it's correctly aligned so we're not going to be in trouble later */
|
||||
-#ifdef _WIN64
|
||||
- assert( view->base == view_base );
|
||||
-#endif
|
||||
- WARN( "range %p - %p is already mapped\n", view_base, view_end );
|
||||
+ /* Free ranges addresses are aligned at granularity_mask while the views may be not. */
|
||||
+
|
||||
+ if (range->base > view_base)
|
||||
+ view_base = range->base;
|
||||
+ if (range->end < view_end)
|
||||
+ view_end = range->end;
|
||||
+ if (range->end == view_base && next->base >= view_end)
|
||||
+ view_end = view_base;
|
||||
+
|
||||
+ TRACE( "%p - %p, aligned %p - %p.\n", view->base, (char *)view->base + view->size, view_base, view_end );
|
||||
+
|
||||
+ if (view_end <= view_base)
|
||||
return;
|
||||
- }
|
||||
|
||||
/* this should never happen */
|
||||
if (range->base > view_base || range->end < view_end)
|
||||
@@ -810,9 +811,7 @@ static void free_ranges_remove_view( struct file_view *view )
|
||||
struct range_entry *range = free_ranges_lower_bound( view_base );
|
||||
struct range_entry *next = range + 1;
|
||||
|
||||
- /* It's possible to use AT_ROUND_TO_PAGE on 32bit with NtMapViewOfSection to force 4kB alignment,
|
||||
- * and this breaks our assumptions. Look at the views around to check if the range is still in use. */
|
||||
-#ifndef _WIN64
|
||||
+ /* Free ranges addresses are aligned at granularity_mask while the views may be not. */
|
||||
struct file_view *prev_view = RB_ENTRY_VALUE( rb_prev( &view->entry ), struct file_view, entry );
|
||||
struct file_view *next_view = RB_ENTRY_VALUE( rb_next( &view->entry ), struct file_view, entry );
|
||||
void *prev_view_base = prev_view ? ROUND_ADDR( prev_view->base, granularity_mask ) : NULL;
|
||||
@@ -820,13 +819,15 @@ static void free_ranges_remove_view( struct file_view *view )
|
||||
void *next_view_base = next_view ? ROUND_ADDR( next_view->base, granularity_mask ) : NULL;
|
||||
void *next_view_end = next_view ? ROUND_ADDR( (char *)next_view->base + next_view->size + granularity_mask, granularity_mask ) : NULL;
|
||||
|
||||
- if ((prev_view_base < view_end && prev_view_end > view_base) ||
|
||||
- (next_view_base < view_end && next_view_end > view_base))
|
||||
- {
|
||||
- WARN( "range %p - %p is still mapped\n", view_base, view_end );
|
||||
+ if (prev_view_end && prev_view_end > view_base && prev_view_base < view_end)
|
||||
+ view_base = prev_view_end;
|
||||
+ if (next_view_base && next_view_base < view_end && next_view_end > view_base)
|
||||
+ view_end = next_view_base;
|
||||
+
|
||||
+ TRACE( "%p - %p, aligned %p - %p.\n", view->base, (char *)view->base + view->size, view_base, view_end );
|
||||
+
|
||||
+ if (view_end <= view_base)
|
||||
return;
|
||||
- }
|
||||
-#endif
|
||||
|
||||
/* free_ranges initial value is such that the view is either inside range or before another one. */
|
||||
assert( range != free_ranges_end );
|
||||
--
|
||||
2.38.1
|
||||
|
@@ -0,0 +1,85 @@
|
||||
From 4baf5566da8495ef3b260783ed88f175e43b4f70 Mon Sep 17 00:00:00 2001
|
||||
From: Paul Gofman <pgofman@codeweavers.com>
|
||||
Date: Fri, 11 Nov 2022 18:37:43 -0600
|
||||
Subject: [PATCH] ntdll: Factor out some view manipulation functions.
|
||||
|
||||
---
|
||||
dlls/ntdll/unix/virtual.c | 47 +++++++++++++++++++++++++++++++++------
|
||||
1 file changed, 40 insertions(+), 7 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
|
||||
index 2dca5dfa45f..bdc410472ec 100644
|
||||
--- a/dlls/ntdll/unix/virtual.c
|
||||
+++ b/dlls/ntdll/unix/virtual.c
|
||||
@@ -1563,6 +1563,31 @@ static struct file_view *alloc_view(void)
|
||||
}
|
||||
|
||||
|
||||
+/***********************************************************************
|
||||
+ * free_view
|
||||
+ *
|
||||
+ * Free memory for view structure. virtual_mutex must be held by caller.
|
||||
+ */
|
||||
+static void free_view( struct file_view *view )
|
||||
+{
|
||||
+ *(struct file_view **)view = next_free_view;
|
||||
+ next_free_view = view;
|
||||
+}
|
||||
+
|
||||
+
|
||||
+/***********************************************************************
|
||||
+ * unregister_view
|
||||
+ *
|
||||
+ * Remove view from the tree and update free ranges. virtual_mutex must be held by caller.
|
||||
+ */
|
||||
+static void unregister_view( struct file_view *view )
|
||||
+{
|
||||
+ if (mmap_is_in_reserved_area( view->base, view->size ))
|
||||
+ free_ranges_remove_view( view );
|
||||
+ wine_rb_remove( &views_tree, &view->entry );
|
||||
+}
|
||||
+
|
||||
+
|
||||
/***********************************************************************
|
||||
* delete_view
|
||||
*
|
||||
@@ -1572,11 +1597,21 @@ static void delete_view( struct file_view *view ) /* [in] View */
|
||||
{
|
||||
if (!(view->protect & VPROT_SYSTEM)) unmap_area( view->base, view->size );
|
||||
set_page_vprot( view->base, view->size, 0 );
|
||||
+ unregister_view( view );
|
||||
+ free_view( view );
|
||||
+}
|
||||
+
|
||||
+
|
||||
+/***********************************************************************
|
||||
+ * register_view
|
||||
+ *
|
||||
+ * Add view to the tree and update free ranges. virtual_mutex must be held by caller.
|
||||
+ */
|
||||
+static void register_view( struct file_view *view )
|
||||
+{
|
||||
+ wine_rb_put( &views_tree, view->base, &view->entry );
|
||||
if (mmap_is_in_reserved_area( view->base, view->size ))
|
||||
- free_ranges_remove_view( view );
|
||||
- wine_rb_remove( &views_tree, &view->entry );
|
||||
- *(struct file_view **)view = next_free_view;
|
||||
- next_free_view = view;
|
||||
+ free_ranges_insert_view( view );
|
||||
}
|
||||
|
||||
|
||||
@@ -1620,9 +1655,7 @@ static NTSTATUS create_view( struct file_view **view_ret, void *base, size_t siz
|
||||
view->protect = vprot;
|
||||
set_page_vprot( base, size, vprot );
|
||||
|
||||
- wine_rb_put( &views_tree, view->base, &view->entry );
|
||||
- if (mmap_is_in_reserved_area( view->base, view->size ))
|
||||
- free_ranges_insert_view( view );
|
||||
+ register_view( view );
|
||||
|
||||
*view_ret = view;
|
||||
|
||||
--
|
||||
2.38.1
|
||||
|
@@ -0,0 +1,123 @@
|
||||
From 261ba5e0003f13c83f9f08e5b3931862586f46d3 Mon Sep 17 00:00:00 2001
|
||||
From: Paul Gofman <pgofman@codeweavers.com>
|
||||
Date: Fri, 11 Nov 2022 18:41:50 -0600
|
||||
Subject: [PATCH] ntdll: Support partial view release in NtFreeVirtualMemory().
|
||||
|
||||
---
|
||||
dlls/ntdll/tests/virtual.c | 14 ++++++-------
|
||||
dlls/ntdll/unix/virtual.c | 42 ++++++++++++++++++++++++++++++++++++--
|
||||
2 files changed, 47 insertions(+), 9 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/tests/virtual.c b/dlls/ntdll/tests/virtual.c
|
||||
index 81e9bd0bda3..0dccb35bd27 100644
|
||||
--- a/dlls/ntdll/tests/virtual.c
|
||||
+++ b/dlls/ntdll/tests/virtual.c
|
||||
@@ -1671,7 +1671,7 @@ static void test_NtFreeVirtualMemory(void)
|
||||
size = 0xfff;
|
||||
addr = (char *)addr1 + 0x1001;
|
||||
status = NtFreeVirtualMemory(NtCurrentProcess(), &addr, &size, MEM_RELEASE);
|
||||
- todo_wine ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status);
|
||||
+ ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status);
|
||||
*(volatile char *)addr1 = 1;
|
||||
*((volatile char *)addr1 + 0x2000) = 1;
|
||||
ok(size == 0x1000, "Unexpected size %p.\n", (void *)size);
|
||||
@@ -1680,7 +1680,7 @@ static void test_NtFreeVirtualMemory(void)
|
||||
size = 0xfff;
|
||||
addr = (char *)addr1 + 1;
|
||||
status = NtFreeVirtualMemory(NtCurrentProcess(), &addr, &size, MEM_RELEASE);
|
||||
- todo_wine ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status);
|
||||
+ ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status);
|
||||
*((volatile char *)addr1 + 0x2000) = 1;
|
||||
ok(size == 0x1000, "Unexpected size %p.\n", (void *)size);
|
||||
ok(addr == addr1, "Got addr %p, addr1 %p.\n", addr, addr1);
|
||||
@@ -1688,17 +1688,17 @@ static void test_NtFreeVirtualMemory(void)
|
||||
size = 0x1000;
|
||||
addr = addr1;
|
||||
status = NtAllocateVirtualMemory(NtCurrentProcess(), &addr, 0, &size, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
|
||||
- todo_wine ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status);
|
||||
+ ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status);
|
||||
ok(addr == addr1, "Unexpected addr %p, addr1 %p.\n", addr, addr1);
|
||||
ok(size == 0x1000, "Unexpected size %p.\n", (void *)size);
|
||||
|
||||
size = 0x10000;
|
||||
status = NtFreeVirtualMemory(NtCurrentProcess(), &addr1, &size, MEM_DECOMMIT);
|
||||
- todo_wine ok(status == STATUS_UNABLE_TO_FREE_VM, "Unexpected status %08lx.\n", status);
|
||||
+ ok(status == STATUS_UNABLE_TO_FREE_VM, "Unexpected status %08lx.\n", status);
|
||||
|
||||
size = 0x10000;
|
||||
status = NtFreeVirtualMemory(NtCurrentProcess(), &addr1, &size, MEM_RELEASE);
|
||||
- todo_wine ok(status == STATUS_UNABLE_TO_FREE_VM, "Unexpected status %08lx.\n", status);
|
||||
+ ok(status == STATUS_UNABLE_TO_FREE_VM, "Unexpected status %08lx.\n", status);
|
||||
|
||||
size = 0;
|
||||
addr = (char *)addr1 + 0x1000;
|
||||
@@ -1713,11 +1713,11 @@ static void test_NtFreeVirtualMemory(void)
|
||||
size = 0;
|
||||
addr = (char *)addr1 + 0x2000;
|
||||
status = NtFreeVirtualMemory(NtCurrentProcess(), &addr, &size, MEM_RELEASE);
|
||||
- todo_wine ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status);
|
||||
+ ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status);
|
||||
|
||||
size = 0x1000;
|
||||
status = NtFreeVirtualMemory(NtCurrentProcess(), &addr1, &size, MEM_RELEASE);
|
||||
- todo_wine ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status);
|
||||
+ ok(status == STATUS_SUCCESS, "Unexpected status %08lx.\n", status);
|
||||
}
|
||||
|
||||
static void test_prefetch(void)
|
||||
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
|
||||
index bdc410472ec..5775287cd19 100644
|
||||
--- a/dlls/ntdll/unix/virtual.c
|
||||
+++ b/dlls/ntdll/unix/virtual.c
|
||||
@@ -4180,8 +4180,46 @@ NTSTATUS WINAPI NtFreeVirtualMemory( HANDLE process, PVOID *addr_ptr, SIZE_T *si
|
||||
}
|
||||
else
|
||||
{
|
||||
- FIXME( "Parial view release is not supported.\n" );
|
||||
- status = STATUS_INVALID_PARAMETER;
|
||||
+ struct file_view *new_view = NULL;
|
||||
+
|
||||
+ if (view->base != base && base + size != (char *)view->base + view->size
|
||||
+ && !(new_view = alloc_view()))
|
||||
+ {
|
||||
+ ERR( "out of memory for %p-%p\n", base, (char *)base + size );
|
||||
+ return STATUS_NO_MEMORY;
|
||||
+ }
|
||||
+ unregister_view( view );
|
||||
+
|
||||
+ if (new_view)
|
||||
+ {
|
||||
+ new_view->base = base + size;
|
||||
+ new_view->size = (char *)view->base + view->size - (char *)new_view->base;
|
||||
+ new_view->protect = view->protect;
|
||||
+
|
||||
+ view->size = base - (char *)view->base;
|
||||
+ register_view( view );
|
||||
+ register_view( new_view );
|
||||
+
|
||||
+ VIRTUAL_DEBUG_DUMP_VIEW( view );
|
||||
+ VIRTUAL_DEBUG_DUMP_VIEW( new_view );
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ if (view->base == base)
|
||||
+ {
|
||||
+ view->base = base + size;
|
||||
+ view->size -= size;
|
||||
+ }
|
||||
+ else
|
||||
+ {
|
||||
+ view->size = base - (char *)view->base;
|
||||
+ }
|
||||
+ register_view( view );
|
||||
+ VIRTUAL_DEBUG_DUMP_VIEW( view );
|
||||
+ }
|
||||
+
|
||||
+ set_page_vprot( base, size, 0 );
|
||||
+ unmap_area( base, size );
|
||||
}
|
||||
*addr_ptr = base;
|
||||
*size_ptr = size;
|
||||
--
|
||||
2.38.1
|
||||
|
@@ -0,0 +1,99 @@
|
||||
From aa5b49a7893ddb97b11251c65506d242e2e160f9 Mon Sep 17 00:00:00 2001
|
||||
From: Paul Gofman <pgofman@codeweavers.com>
|
||||
Date: Tue, 4 Oct 2022 20:26:39 -0500
|
||||
Subject: [PATCH] ntdll: Add logging for free ranges.
|
||||
|
||||
---
|
||||
dlls/ntdll/unix/virtual.c | 25 +++++++++++++++++++++----
|
||||
1 file changed, 21 insertions(+), 4 deletions(-)
|
||||
|
||||
diff --git a/dlls/ntdll/unix/virtual.c b/dlls/ntdll/unix/virtual.c
|
||||
index 5775287cd19..7142d2adf79 100644
|
||||
--- a/dlls/ntdll/unix/virtual.c
|
||||
+++ b/dlls/ntdll/unix/virtual.c
|
||||
@@ -76,6 +76,7 @@
|
||||
|
||||
WINE_DEFAULT_DEBUG_CHANNEL(virtual);
|
||||
WINE_DECLARE_DEBUG_CHANNEL(module);
|
||||
+WINE_DECLARE_DEBUG_CHANNEL(virtual_ranges);
|
||||
|
||||
struct preload_info
|
||||
{
|
||||
@@ -186,6 +187,7 @@ static struct list teb_list = LIST_INIT( teb_list );
|
||||
#define ROUND_SIZE(addr,size) (((SIZE_T)(size) + ((UINT_PTR)(addr) & page_mask) + page_mask) & ~page_mask)
|
||||
|
||||
#define VIRTUAL_DEBUG_DUMP_VIEW(view) do { if (TRACE_ON(virtual)) dump_view(view); } while (0)
|
||||
+#define VIRTUAL_DEBUG_DUMP_RANGES() do { if (TRACE_ON(virtual_ranges)) dump_free_ranges(); } while (0)
|
||||
|
||||
#ifndef MAP_NORESERVE
|
||||
#define MAP_NORESERVE 0
|
||||
@@ -732,6 +734,12 @@ static struct range_entry *free_ranges_lower_bound( void *addr )
|
||||
return begin;
|
||||
}
|
||||
|
||||
+static void dump_free_ranges(void)
|
||||
+{
|
||||
+ struct range_entry *r;
|
||||
+ for (r = free_ranges; r != free_ranges_end; ++r)
|
||||
+ TRACE_(virtual_ranges)("%p - %p.\n", r->base, r->end);
|
||||
+}
|
||||
|
||||
/***********************************************************************
|
||||
* free_ranges_insert_view
|
||||
@@ -761,7 +769,10 @@ static void free_ranges_insert_view( struct file_view *view )
|
||||
TRACE( "%p - %p, aligned %p - %p.\n", view->base, (char *)view->base + view->size, view_base, view_end );
|
||||
|
||||
if (view_end <= view_base)
|
||||
+ {
|
||||
+ VIRTUAL_DEBUG_DUMP_RANGES();
|
||||
return;
|
||||
+ }
|
||||
|
||||
/* this should never happen */
|
||||
if (range->base > view_base || range->end < view_end)
|
||||
@@ -789,16 +800,19 @@ static void free_ranges_insert_view( struct file_view *view )
|
||||
else
|
||||
range->base = view_end;
|
||||
|
||||
- if (range->base < range->end) return;
|
||||
-
|
||||
+ if (range->base < range->end)
|
||||
+ {
|
||||
+ VIRTUAL_DEBUG_DUMP_RANGES();
|
||||
+ return;
|
||||
+ }
|
||||
/* and possibly remove it if it's now empty */
|
||||
memmove( range, next, (free_ranges_end - next) * sizeof(struct range_entry) );
|
||||
free_ranges_end -= 1;
|
||||
assert( free_ranges_end - free_ranges > 0 );
|
||||
}
|
||||
+ VIRTUAL_DEBUG_DUMP_RANGES();
|
||||
}
|
||||
|
||||
-
|
||||
/***********************************************************************
|
||||
* free_ranges_remove_view
|
||||
*
|
||||
@@ -827,8 +841,10 @@ static void free_ranges_remove_view( struct file_view *view )
|
||||
TRACE( "%p - %p, aligned %p - %p.\n", view->base, (char *)view->base + view->size, view_base, view_end );
|
||||
|
||||
if (view_end <= view_base)
|
||||
+ {
|
||||
+ VIRTUAL_DEBUG_DUMP_RANGES();
|
||||
return;
|
||||
-
|
||||
+ }
|
||||
/* free_ranges initial value is such that the view is either inside range or before another one. */
|
||||
assert( range != free_ranges_end );
|
||||
assert( range->end > view_base || next != free_ranges_end );
|
||||
@@ -870,6 +886,7 @@ static void free_ranges_remove_view( struct file_view *view )
|
||||
range->base = view_base;
|
||||
range->end = view_end;
|
||||
}
|
||||
+ VIRTUAL_DEBUG_DUMP_RANGES();
|
||||
}
|
||||
|
||||
|
||||
--
|
||||
2.38.1
|
||||
|
@@ -0,0 +1,58 @@
|
||||
From 72dcf52735e6306fa67f25f49fd78da24d7d89cb Mon Sep 17 00:00:00 2001
|
||||
From: Paul Gofman <pgofman@codeweavers.com>
|
||||
Date: Thu, 10 Nov 2022 18:40:18 -0600
|
||||
Subject: [PATCH] ntdll: Handle NULL process handle in MapViewOfFile3().
|
||||
|
||||
Based on a patch by Nikolay Sivov.
|
||||
---
|
||||
dlls/kernelbase/memory.c | 2 ++
|
||||
dlls/ntdll/tests/virtual.c | 13 +++++++++++++
|
||||
2 files changed, 15 insertions(+)
|
||||
|
||||
diff --git a/dlls/kernelbase/memory.c b/dlls/kernelbase/memory.c
|
||||
index c01fe817972..ee12f6abb91 100644
|
||||
--- a/dlls/kernelbase/memory.c
|
||||
+++ b/dlls/kernelbase/memory.c
|
||||
@@ -255,6 +255,8 @@ LPVOID WINAPI DECLSPEC_HOTPATCH MapViewOfFile3( HANDLE handle, HANDLE process, P
|
||||
LARGE_INTEGER off;
|
||||
void *addr;
|
||||
|
||||
+ if (!process) process = GetCurrentProcess();
|
||||
+
|
||||
addr = baseaddr;
|
||||
off.QuadPart = offset;
|
||||
if (!set_ntstatus( NtMapViewOfSectionEx( handle, process, &addr, &off, &size, alloc_type, protection,
|
||||
diff --git a/dlls/ntdll/tests/virtual.c b/dlls/ntdll/tests/virtual.c
|
||||
index 0dccb35bd27..486efabaf70 100644
|
||||
--- a/dlls/ntdll/tests/virtual.c
|
||||
+++ b/dlls/ntdll/tests/virtual.c
|
||||
@@ -1060,6 +1060,13 @@ static void test_NtMapViewOfSection(void)
|
||||
process = create_target_process("sleep");
|
||||
ok(process != NULL, "Can't start process\n");
|
||||
|
||||
+ ptr = NULL;
|
||||
+ size = 0;
|
||||
+ offset.QuadPart = 0;
|
||||
+ status = NtMapViewOfSection(mapping, NULL, &ptr, 0, 0, &offset, &size, 1, 0, PAGE_READWRITE);
|
||||
+ ok(status == STATUS_INVALID_HANDLE, "NtMapViewOfSection returned %08lx\n", status);
|
||||
+ ok(!((ULONG_PTR)ptr & 0xffff), "returned memory %p is not aligned to 64k\n", ptr);
|
||||
+
|
||||
ptr = NULL;
|
||||
size = 0;
|
||||
offset.QuadPart = 0;
|
||||
@@ -1303,6 +1310,12 @@ static void test_NtMapViewOfSectionEx(void)
|
||||
process = create_target_process("sleep");
|
||||
ok(process != NULL, "Can't start process\n");
|
||||
|
||||
+ ptr = NULL;
|
||||
+ size = 0;
|
||||
+ offset.QuadPart = 0;
|
||||
+ status = pNtMapViewOfSectionEx(mapping, NULL, &ptr, &offset, &size, 0, PAGE_READWRITE, NULL, 0);
|
||||
+ ok(status == STATUS_INVALID_HANDLE, "Unexpected status %08lx\n", status);
|
||||
+
|
||||
ptr = NULL;
|
||||
size = 0;
|
||||
offset.QuadPart = 0;
|
||||
--
|
||||
2.38.1
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user