2013/4/24 James Eder <jimportal@gmail.com>
This version should either pass or skip on W2KPROSP4.
---
 dlls/kernel32/cpu.c           | 23 ++++++++++++++++++-----
 dlls/psapi/tests/psapi_main.c | 36 ++++++++++++++++++++++++++++++++++++
 2 files changed, 54 insertions(+), 5 deletions(-)

diff --git a/dlls/kernel32/cpu.c b/dlls/kernel32/cpu.c
index 0ebf8f3..124e5c0 100644
--- a/dlls/kernel32/cpu.c
+++ b/dlls/kernel32/cpu.c
@@ -216,16 +216,29 @@ BOOL WINAPI IsProcessorFeaturePresent (
  */
 BOOL WINAPI K32GetPerformanceInfo(PPERFORMANCE_INFORMATION info, DWORD size)
 {
-    NTSTATUS status;
+    MEMORYSTATUSEX mem_status;

     TRACE( "(%p, %d)\n", info, size );

-    status = NtQuerySystemInformation( SystemPerformanceInformation, info, size, NULL );
-
-    if (status)
+    if(size < sizeof(PERFORMANCE_INFORMATION))
     {
-        SetLastError( RtlNtStatusToDosError( status ) );
+        SetLastError(ERROR_BAD_LENGTH);
         return FALSE;
     }
+
+    mem_status.dwLength = sizeof(mem_status);
+    if (!GlobalMemoryStatusEx( &mem_status ))
+        return FALSE;
+
+    memset(info, 0, sizeof(PERFORMANCE_INFORMATION));
+
+    info->cb                = sizeof(PERFORMANCE_INFORMATION);
+    info->CommitLimit       = min((mem_status.ullTotalPageFile / system_info.PageSize), MAXDWORD);
+    info->PhysicalTotal     = min((mem_status.ullTotalPhys / system_info.PageSize), MAXDWORD);
+    info->PhysicalAvailable = min((mem_status.ullAvailPhys / system_info.PageSize), MAXDWORD);
+    info->PageSize          = system_info.PageSize;
+
+    FIXME("stub\n");
+

Hi James,

That would be better to change the trace at the beginning by FIXME( "(%p, %d): semi-stub\n", info, size ); or FIXME( "(%p, %d): partial stub\n", info, size );
instead of adding another fixme (which is not really correct since it's not a stub).

Christian