Make GlobalMemoryStatus lie about what we really have......
authorSteven Edwards <winehacker@gmail.com>
Tue, 30 Dec 2003 23:16:43 +0000 (23:16 +0000)
committerSteven Edwards <winehacker@gmail.com>
Tue, 30 Dec 2003 23:16:43 +0000 (23:16 +0000)
svn path=/trunk/; revision=7354

reactos/lib/kernel32/mem/global.c

index 17e150f..6d6592f 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: global.c,v 1.17 2003/12/29 23:04:08 sedwards Exp $
+/* $Id: global.c,v 1.18 2003/12/30 23:16:43 sedwards Exp $
  *
  * Win32 Global/Local heap functions (GlobalXXX, LocalXXX).
  * These functions included in Win32 for compatibility with 16 bit Windows
@@ -10,6 +10,7 @@
  */
 
 #include <k32.h>
+#include <time.h>
 
 #define NDEBUG
 #include <kernel32/kernel32.h>
@@ -353,39 +354,50 @@ GlobalLock(HGLOBAL hMem)
 VOID STDCALL
 GlobalMemoryStatus(LPMEMORYSTATUS lpBuffer)
 {
-       NTSTATUS                Status;
-       SYSTEM_PERFORMANCE_INFORMATION  Spi;
-       QUOTA_LIMITS            Ql;
-       VM_COUNTERS             Vmc;
-       PIMAGE_NT_HEADERS       ImageNtHeader;
-
-       RtlZeroMemory (lpBuffer, sizeof (MEMORYSTATUS));
-       lpBuffer->dwLength = sizeof (MEMORYSTATUS);
-       Status = NtQuerySystemInformation (
-                       SystemPerformanceInformation,
-                       & Spi,
-                       sizeof Spi,
-                       NULL
-                       );
-       /* FIXME: perform computations and fill lpBuffer fields */
-       Status = NtQueryInformationProcess (
-                       GetCurrentProcess(),
-                       ProcessQuotaLimits,
-                       & Ql,
-                       sizeof Ql,
-                       NULL
-                       );
-       /* FIXME: perform computations and fill lpBuffer fields */
-       Status = NtQueryInformationProcess (
-                       GetCurrentProcess(),
-                       ProcessVmCounters,
-                       & Vmc,
-                       sizeof Vmc,
-                       NULL
-                       );
-       /* FIXME: perform computations and fill lpBuffer fields */
-       ImageNtHeader = RtlImageNtHeader ((PVOID)NtCurrentPeb()->ImageBaseAddress);
-       /* FIXME: perform computations and fill lpBuffer fields */
+    static MEMORYSTATUS        cached_memstatus;
+//    static int cache_lastchecked = 0;
+    SYSTEM_INFO si;
+
+//    if (GetSystemTimeAsFileTime(NULL)==cache_lastchecked) {
+//     memcpy(lpBuffer,&cached_memstatus,sizeof(MEMORYSTATUS));
+//     return;
+//    }
+//    cache_lastchecked = GetSystemTimeAsFileTime(NULL);
+
+    lpBuffer->dwMemoryLoad    = 0;
+    lpBuffer->dwTotalPhys     = 16*1024*1024;
+    lpBuffer->dwAvailPhys     = 16*1024*1024;
+    lpBuffer->dwTotalPageFile = 16*1024*1024;
+    lpBuffer->dwAvailPageFile = 16*1024*1024;
+
+    /* Some applications (e.g. QuickTime 6) crash if we tell them there
+     * is more than 2GB of physical memory.
+     */
+    if (lpBuffer->dwTotalPhys>2U*1024*1024*1024)
+    {
+        lpBuffer->dwTotalPhys=2U*1024*1024*1024;
+        lpBuffer->dwAvailPhys=2U*1024*1024*1024;
+    }
+
+    /* FIXME: should do something for other systems */
+    GetSystemInfo(&si);
+    lpBuffer->dwTotalVirtual  = (char*)si.lpMaximumApplicationAddress-(char*)si.lpMinimumApplicationAddress;
+    /* FIXME: we should track down all the already allocated VM pages and substract them, for now arbitrarily remove 64KB so that it matches NT */
+    lpBuffer->dwAvailVirtual  = lpBuffer->dwTotalVirtual-64*1024;
+    memcpy(&cached_memstatus,lpBuffer,sizeof(MEMORYSTATUS));
+
+    /* it appears some memory display programs want to divide by these values */
+    if(lpBuffer->dwTotalPageFile==0)
+        lpBuffer->dwTotalPageFile++;
+
+    if(lpBuffer->dwAvailPageFile==0)
+        lpBuffer->dwAvailPageFile++;
+
+    DPRINT1("<-- LPMEMORYSTATUS: dwLength %ld, dwMemoryLoad %ld, dwTotalPhys %ld, dwAvailPhys %ld,"
+          " dwTotalPageFile %ld, dwAvailPageFile %ld, dwTotalVirtual %ld, dwAvailVirtual %ld\n",
+          lpBuffer->dwLength, lpBuffer->dwMemoryLoad, lpBuffer->dwTotalPhys, lpBuffer->dwAvailPhys,
+          lpBuffer->dwTotalPageFile, lpBuffer->dwAvailPageFile, lpBuffer->dwTotalVirtual,
+          lpBuffer->dwAvailVirtual);
 }