From: Hermès Bélusca-Maïto Date: Sun, 18 Oct 2015 22:00:29 +0000 (+0000) Subject: [KERNEL32] X-Git-Tag: ReactOS-0.4.0~447 X-Git-Url: https://git.reactos.org/?p=reactos.git;a=commitdiff_plain;h=1071b1337756cc86af13d7c9a3be8878e95ac219 [KERNEL32] - 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 --- diff --git a/reactos/dll/win32/kernel32/client/heapmem.c b/reactos/dll/win32/kernel32/client/heapmem.c index 6ea3774d3c5..a9717153cb4 100644 --- a/reactos/dll/win32/kernel32/client/heapmem.c +++ b/reactos/dll/win32/kernel32/client/heapmem.c @@ -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); } }