[PATCH 4/4] kernel32: Update available virtual memory size in GlobalMemoryStatusEx().

Akihiro Sagawa sagawa.aki at gmail.com
Sun Jun 4 08:37:39 CDT 2017


Signed-off-by: Akihiro Sagawa <sagawa.aki at gmail.com>
---
 dlls/kernel32/heap.c | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/dlls/kernel32/heap.c b/dlls/kernel32/heap.c
index fd6414a..5739f3b 100644
--- a/dlls/kernel32/heap.c
+++ b/dlls/kernel32/heap.c
@@ -1154,6 +1154,8 @@ BOOL WINAPI GlobalMemoryStatusEx( LPMEMORYSTATUSEX lpmemex )
     static MEMORYSTATUSEX	cached_memstatus;
     static int cache_lastchecked = 0;
     SYSTEM_INFO si;
+    VM_COUNTERS vmi;
+    NTSTATUS ret;
 #ifdef linux
     FILE *f;
 #elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) || defined(__APPLE__)
@@ -1185,7 +1187,7 @@ BOOL WINAPI GlobalMemoryStatusEx( LPMEMORYSTATUSEX lpmemex )
 
     if (time(NULL)==cache_lastchecked) {
 	*lpmemex = cached_memstatus;
-	return TRUE;
+	goto fill_virtual_avail;
     }
     cache_lastchecked = time(NULL);
 
@@ -1340,8 +1342,6 @@ BOOL WINAPI GlobalMemoryStatusEx( LPMEMORYSTATUSEX lpmemex )
     /* FIXME: should do something for other systems */
     GetSystemInfo(&si);
     lpmemex->ullTotalVirtual  = (ULONG_PTR)si.lpMaximumApplicationAddress-(ULONG_PTR)si.lpMinimumApplicationAddress;
-    /* FIXME: we should track down all the already allocated VM pages and subtract them, for now arbitrarily remove 64KB so that it matches NT */
-    lpmemex->ullAvailVirtual  = lpmemex->ullTotalVirtual-64*1024;
 
     /* MSDN says about AvailExtendedVirtual: Size of unreserved and uncommitted
        memory in the extended portion of the virtual address space of the calling
@@ -1352,6 +1352,13 @@ BOOL WINAPI GlobalMemoryStatusEx( LPMEMORYSTATUSEX lpmemex )
 
     cached_memstatus = *lpmemex;
 
+fill_virtual_avail:
+    ret = NtQueryInformationProcess(GetCurrentProcess(), ProcessVmCounters, &vmi, sizeof(vmi), NULL);
+    if (!ret && lpmemex->ullTotalVirtual > vmi.VirtualSize)
+        lpmemex->ullAvailVirtual = lpmemex->ullTotalVirtual - vmi.VirtualSize;
+    else
+        lpmemex->ullAvailVirtual = lpmemex->ullTotalVirtual - 64*1024;
+
     TRACE_(globalmem)("<-- LPMEMORYSTATUSEX: dwLength %d, dwMemoryLoad %d, ullTotalPhys %s, ullAvailPhys %s,"
           " ullTotalPageFile %s, ullAvailPageFile %s, ullTotalVirtual %s, ullAvailVirtual %s\n",
           lpmemex->dwLength, lpmemex->dwMemoryLoad, wine_dbgstr_longlong(lpmemex->ullTotalPhys),
-- 
2.7.4





More information about the wine-patches mailing list