Make GetProcessMemoryInfo fail if the passed buffer is too small.

This commit is contained in:
Felix Nawothnig 2005-07-08 11:31:14 +00:00 committed by Alexandre Julliard
parent 281eb29e12
commit 08200ca3bc
2 changed files with 23 additions and 19 deletions

View File

@ -516,33 +516,37 @@ DWORD WINAPI GetProcessImageFileNameW( HANDLE process, LPWSTR file, DWORD size )
* Retrieve memory usage information for a given process * Retrieve memory usage information for a given process
* *
*/ */
BOOL WINAPI GetProcessMemoryInfo( HANDLE process, PPROCESS_MEMORY_COUNTERS counters, DWORD size ) BOOL WINAPI GetProcessMemoryInfo(HANDLE hProcess,
PPROCESS_MEMORY_COUNTERS pmc, DWORD cb)
{ {
NTSTATUS status; NTSTATUS status;
VM_COUNTERS vmc; VM_COUNTERS vmc;
TRACE( "(%p, %p, %ld)\n", process, counters, size ); if (cb < sizeof(PROCESS_MEMORY_COUNTERS))
status = NtQueryInformationProcess( process, ProcessVmCounters, &vmc, sizeof(vmc), NULL );
if (status)
{ {
SetLastError( RtlNtStatusToDosError( status ) ); SetLastError(ERROR_INSUFFICIENT_BUFFER);
return FALSE; return FALSE;
} }
/* FIXME: check size */ status = NtQueryInformationProcess(hProcess, ProcessVmCounters,
&vmc, sizeof(vmc), NULL);
counters->cb = sizeof(PROCESS_MEMORY_COUNTERS); if (status)
counters->PageFaultCount = vmc.PageFaultCount; {
counters->PeakWorkingSetSize = vmc.PeakWorkingSetSize; SetLastError(RtlNtStatusToDosError(status));
counters->WorkingSetSize = vmc.WorkingSetSize; return FALSE;
counters->QuotaPeakPagedPoolUsage = vmc.QuotaPeakPagedPoolUsage; }
counters->QuotaPagedPoolUsage = vmc.QuotaPagedPoolUsage;
counters->QuotaPeakNonPagedPoolUsage = vmc.QuotaPeakNonPagedPoolUsage; pmc->cb = sizeof(PROCESS_MEMORY_COUNTERS);
counters->QuotaNonPagedPoolUsage = vmc.QuotaNonPagedPoolUsage; pmc->PageFaultCount = vmc.PageFaultCount;
counters->PagefileUsage = vmc.PagefileUsage; pmc->PeakWorkingSetSize = vmc.PeakWorkingSetSize;
counters->PeakPagefileUsage = vmc.PeakPagefileUsage; pmc->WorkingSetSize = vmc.WorkingSetSize;
pmc->QuotaPeakPagedPoolUsage = vmc.QuotaPeakPagedPoolUsage;
pmc->QuotaPagedPoolUsage = vmc.QuotaPagedPoolUsage;
pmc->QuotaPeakNonPagedPoolUsage = vmc.QuotaPeakNonPagedPoolUsage;
pmc->QuotaNonPagedPoolUsage = vmc.QuotaNonPagedPoolUsage;
pmc->PagefileUsage = vmc.PagefileUsage;
pmc->PeakPagefileUsage = vmc.PeakPagefileUsage;
return TRUE; return TRUE;
} }

View File

@ -135,7 +135,7 @@ static void test_GetProcessMemoryInfo(void)
w32_err(pGetProcessMemoryInfo(NULL, &pmc, sizeof(pmc)), ERROR_INVALID_HANDLE); w32_err(pGetProcessMemoryInfo(NULL, &pmc, sizeof(pmc)), ERROR_INVALID_HANDLE);
todo_wine w32_err(pGetProcessMemoryInfo(hpSR, &pmc, sizeof(pmc)), ERROR_ACCESS_DENIED); todo_wine w32_err(pGetProcessMemoryInfo(hpSR, &pmc, sizeof(pmc)), ERROR_ACCESS_DENIED);
todo_wine w32_err(pGetProcessMemoryInfo(hpQI, &pmc, sizeof(pmc)-1), ERROR_INSUFFICIENT_BUFFER); w32_err(pGetProcessMemoryInfo(hpQI, &pmc, sizeof(pmc)-1), ERROR_INSUFFICIENT_BUFFER);
w32_suc(pGetProcessMemoryInfo(hpQI, &pmc, sizeof(pmc))); w32_suc(pGetProcessMemoryInfo(hpQI, &pmc, sizeof(pmc)));
} }