Forwarded by request from https://bugs.winehq.org/show_bug.cgi?id=35563 (please note that I am not subscribed to the list). This patch modifies NtQueryInformationProcess() to return valid data for ProcessVmCounters on Linux by reading /proc/self/status, so that GetProcessMemoryInfo() reports actual process information rather than all zeros.
--Andrew Church http://achurch.org/
diff -urN wine-git-4a1629c-orig/dlls/ntdll/process.c wine-git-4a1629c/dlls/ntdll/process.c --- wine-git-4a1629c-orig/dlls/ntdll/process.c 2015-11-11 20:54:45 +0900 +++ wine-git-4a1629c/dlls/ntdll/process.c 2015-11-11 20:55:30 +0900 @@ -243,6 +243,46 @@ /* FIXME : real data */ memset(&pvmi, 0 , sizeof(VM_COUNTERS));
+#ifdef __linux__ + FILE *f = fopen("/proc/self/status", "r"); + if (f) { + char buf[100]; + int at_bol = 1; + while (fgets(buf, sizeof(buf), f)) { + const int has_eol = (buf[strlen(buf)-1] == '\n'); + if (at_bol) { + const char *tag = buf; + char *s = strchr(buf, ':'); + if (s) { + *s++ = '\0'; + unsigned long value = strtoul(s, NULL, 10); + if (strcmp(tag, "VmPeak") == 0) { + pvmi.PeakVirtualSize = value*1024; + pvmi.PeakPagefileUsage = value*1024; + pvmi.QuotaPeakPagedPoolUsage = value*1024; + } else if (strcmp(tag, "VmSize") == 0) { + pvmi.VirtualSize = value*1024; + pvmi.PagefileUsage = value*1024; + pvmi.QuotaPagedPoolUsage = value*1024; + } else if (strcmp(tag, "VmHWM") == 0) { + pvmi.PeakWorkingSetSize = value*1024; + } else if (strcmp(tag, "VmRSS") == 0) { + pvmi.WorkingSetSize = value*1024; + } + /* We could get QuotaNonPagedPoolUsage from + * the VmLck line, but Linux doesn't give a + * peak value for that, so we just ignore + * it instead of returning a "peak" value + * that might decrease over time. + * FIXME: track the peak value ourselves. */ + } + } + at_bol = has_eol; + } + fclose(f); + } +#endif /* __linux__ */ + len = ProcessInformationLength; if (len != FIELD_OFFSET(VM_COUNTERS,PrivatePageCount)) len = sizeof(VM_COUNTERS);