Author: hbelusca Date: Sun Oct 18 22:00:29 2015 New Revision: 69608
URL: http://svn.reactos.org/svn/reactos?rev=69608&view=rev Log: [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.
Modified: trunk/reactos/dll/win32/kernel32/client/heapmem.c
Modified: trunk/reactos/dll/win32/kernel32/client/heapmem.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/kernel32/client/h... ============================================================================== --- trunk/reactos/dll/win32/kernel32/client/heapmem.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/kernel32/client/heapmem.c [iso-8859-1] Sun Oct 18 22:00:29 2015 @@ -1276,6 +1276,12 @@ 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 @@ /* 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 @@ 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 @@ /* 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); } }