[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
This commit is contained in:
Hermès Bélusca-Maïto 2015-10-18 22:00:29 +00:00
parent 1cfc6d4fb5
commit 1071b13377

View 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);
}
}