[KERNEL32]
authorHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 18 Oct 2015 22:00:29 +0000 (22:00 +0000)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sun, 18 Oct 2015 22:00:29 +0000 (22:00 +0000)
- GlobalMemoryStatusEx: Correctly compute ullTotalPageFile which should be in bytes, instead of in number of pages. Patch by contributor "kkat". CORE-10361
- GlobalMemoryStatusEx: Fail if the stored length in the data buffer is not what is expected by the API (required by the spec, see MSDN; on the contrary, GlobalMemoryStatus does not require that.)
- GlobalMemoryStatus: Correctly round up the reported total/available memory values, in case they are bigger than ~= 2GB.

svn path=/trunk/; revision=69608

reactos/dll/win32/kernel32/client/heapmem.c

index 6ea3774..a971715 100644 (file)
@@ -1276,6 +1276,12 @@ GlobalMemoryStatusEx(LPMEMORYSTATUSEX lpBuffer)
     QUOTA_LIMITS QuotaLimits;
     ULONGLONG PageFile, PhysicalMemory;
 
+    if (lpBuffer->dwLength != sizeof(*lpBuffer))
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+
     /* Query performance information */
     NtQuerySystemInformation(SystemPerformanceInformation,
                              &PerformanceInfo,
@@ -1312,6 +1318,7 @@ GlobalMemoryStatusEx(LPMEMORYSTATUSEX lpBuffer)
     /* Save the commit limit */
     lpBuffer->ullTotalPageFile = min(QuotaLimits.PagefileLimit,
                                      PerformanceInfo.CommitLimit);
+    lpBuffer->ullTotalPageFile *= BaseStaticServerData->SysInfo.PageSize;
 
     /* Calculate how many pages are left */
     PageFile = PerformanceInfo.CommitLimit - PerformanceInfo.CommittedPages;
@@ -1327,9 +1334,9 @@ GlobalMemoryStatusEx(LPMEMORYSTATUSEX lpBuffer)
                                  BaseStaticServerData->SysInfo.MinimumUserModeAddress) + 1;
 
     /* And finally the avilable virtual space */
-    lpBuffer->ullAvailVirtual = lpBuffer->ullTotalVirtual -
-                                VmCounters.VirtualSize;
+    lpBuffer->ullAvailVirtual = lpBuffer->ullTotalVirtual - VmCounters.VirtualSize;
     lpBuffer->ullAvailExtendedVirtual = 0;
+
     return TRUE;
 }
 
@@ -1349,12 +1356,12 @@ GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer)
         /* Reset the right size and fill out the information */
         lpBuffer->dwLength = sizeof(MEMORYSTATUS);
         lpBuffer->dwMemoryLoad = lpBufferEx.dwMemoryLoad;
-        lpBuffer->dwTotalPhys = (SIZE_T)lpBufferEx.ullTotalPhys;
-        lpBuffer->dwAvailPhys = (SIZE_T)lpBufferEx.ullAvailPhys;
-        lpBuffer->dwTotalPageFile = (SIZE_T)lpBufferEx.ullTotalPageFile;
-        lpBuffer->dwAvailPageFile = (SIZE_T)lpBufferEx.ullAvailPageFile;
-        lpBuffer->dwTotalVirtual = (SIZE_T)lpBufferEx.ullTotalVirtual;
-        lpBuffer->dwAvailVirtual = (SIZE_T)lpBufferEx.ullAvailVirtual;
+        lpBuffer->dwTotalPhys = (SIZE_T)min(lpBufferEx.ullTotalPhys, MAXULONG_PTR);
+        lpBuffer->dwAvailPhys = (SIZE_T)min(lpBufferEx.ullAvailPhys, MAXULONG_PTR);
+        lpBuffer->dwTotalPageFile = (SIZE_T)min(lpBufferEx.ullTotalPageFile, MAXULONG_PTR);
+        lpBuffer->dwAvailPageFile = (SIZE_T)min(lpBufferEx.ullAvailPageFile, MAXULONG_PTR);
+        lpBuffer->dwTotalVirtual = (SIZE_T)min(lpBufferEx.ullTotalVirtual, MAXULONG_PTR);
+        lpBuffer->dwAvailVirtual = (SIZE_T)min(lpBufferEx.ullAvailVirtual, MAXULONG_PTR);
     }
 }