[PATCH 3/4] ntdll: Use our virtual memory counters when using a process handle.

Akihiro Sagawa sagawa.aki at gmail.com
Sun Jun 4 08:37:37 CDT 2017


Signed-off-by: Akihiro Sagawa <sagawa.aki at gmail.com>
---
 dlls/ntdll/process.c           | 21 +++++++++++++++++++--
 dlls/ntdll/server.c            | 10 ++++++++++
 include/wine/server_protocol.h | 16 +++++++++++++---
 server/process.c               |  6 +-----
 server/protocol.def            | 14 ++++++++++++--
 server/request.h               | 12 +++++-------
 server/thread.c                |  3 +++
 server/trace.c                 | 13 ++++++++++---
 8 files changed, 73 insertions(+), 22 deletions(-)

diff --git a/dlls/ntdll/process.c b/dlls/ntdll/process.c
index 1d0a703..23b752d 100644
--- a/dlls/ntdll/process.c
+++ b/dlls/ntdll/process.c
@@ -302,13 +302,30 @@ NTSTATUS WINAPI NtQueryInformationProcess(
                     }
                     else
                     {
+                        apc_call_t call;
+                        apc_result_t result;
+
+                        memset( &call, 0, sizeof(call) );
+                        call.vm_counters.type = APC_VM_COUNTERS;
+                        ret = server_queue_process_apc( ProcessHandle, &call, &result );
+                        if (ret != STATUS_SUCCESS) break;
+
+                        if (result.vm_counters.status == STATUS_SUCCESS)
+                        {
+                            pvmi.PeakVirtualSize = result.vm_counters.peak_virtual_size;
+                            pvmi.VirtualSize     = result.vm_counters.virtual_size;
+                        }
+                        else
+                        {
+                            ret = result.vm_counters.status;
+                            break;
+                        }
+
                         SERVER_START_REQ(get_process_vm_counters)
                         {
                             req->handle = wine_server_obj_handle( ProcessHandle );
                             if (!(ret = wine_server_call( req )))
                             {
-                                pvmi.PeakVirtualSize = reply->peak_virtual_size;
-                                pvmi.VirtualSize = reply->virtual_size;
                                 pvmi.PeakWorkingSetSize = reply->peak_working_set_size;
                                 pvmi.WorkingSetSize = reply->working_set_size;
                                 pvmi.PagefileUsage = reply->pagefile_usage;
diff --git a/dlls/ntdll/server.c b/dlls/ntdll/server.c
index c02a12a..0833600 100644
--- a/dlls/ntdll/server.c
+++ b/dlls/ntdll/server.c
@@ -515,6 +515,16 @@ static BOOL invoke_apc( const apc_call_t *call, apc_result_t *result )
         }
         else result->virtual_unlock.status = STATUS_INVALID_PARAMETER;
         break;
+    case APC_VM_COUNTERS:
+    {
+        SIZE_T current, peak;
+        virtual_get_memory_counters( &current, &peak );
+        result->vm_counters.type              = call->type;
+        result->vm_counters.status            = STATUS_SUCCESS;
+        result->vm_counters.virtual_size      = current;
+        result->vm_counters.peak_virtual_size = peak;
+        break;
+    }
     case APC_MAP_VIEW:
         result->type = call->type;
         addr = wine_server_get_ptr( call->map_view.addr );
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index 0d7a7cd..29b2313 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -436,6 +436,7 @@ enum apc_type
     APC_VIRTUAL_FLUSH,
     APC_VIRTUAL_LOCK,
     APC_VIRTUAL_UNLOCK,
+    APC_VM_COUNTERS,
     APC_MAP_VIEW,
     APC_UNMAP_VIEW,
     APC_CREATE_THREAD
@@ -519,6 +520,10 @@ typedef union
     struct
     {
         enum apc_type    type;
+    } vm_counters;
+    struct
+    {
+        enum apc_type    type;
         obj_handle_t     handle;
         client_ptr_t     addr;
         mem_size_t       size;
@@ -612,6 +617,13 @@ typedef union
     {
         enum apc_type    type;
         unsigned int     status;
+        mem_size_t       peak_virtual_size;
+        mem_size_t       virtual_size;
+    } vm_counters;
+    struct
+    {
+        enum apc_type    type;
+        unsigned int     status;
         client_ptr_t     addr;
         mem_size_t       size;
     } map_view;
@@ -893,8 +905,6 @@ struct get_process_vm_counters_request
 struct get_process_vm_counters_reply
 {
     struct reply_header __header;
-    mem_size_t peak_virtual_size;
-    mem_size_t virtual_size;
     mem_size_t peak_working_set_size;
     mem_size_t working_set_size;
     mem_size_t pagefile_usage;
@@ -6418,6 +6428,6 @@ union generic_reply
     struct terminate_job_reply terminate_job_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 532
+#define SERVER_PROTOCOL_VERSION 533
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/process.c b/server/process.c
index 5eabbbe..ac5abe5 100644
--- a/server/process.c
+++ b/server/process.c
@@ -1389,11 +1389,7 @@ DECL_HANDLER(get_process_vm_counters)
         {
             while (fgets( line, sizeof(line), f ))
             {
-                if (sscanf( line, "VmPeak: %lu", &value ))
-                    reply->peak_virtual_size = (mem_size_t)value * 1024;
-                else if (sscanf( line, "VmSize: %lu", &value ))
-                    reply->virtual_size = (mem_size_t)value * 1024;
-                else if (sscanf( line, "VmHWM: %lu", &value ))
+                if (sscanf( line, "VmHWM: %lu", &value ))
                     reply->peak_working_set_size = (mem_size_t)value * 1024;
                 else if (sscanf( line, "VmRSS: %lu", &value ))
                     reply->working_set_size = (mem_size_t)value * 1024;
diff --git a/server/protocol.def b/server/protocol.def
index 7eaaec2..ea5f237 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -452,6 +452,7 @@ enum apc_type
     APC_VIRTUAL_FLUSH,
     APC_VIRTUAL_LOCK,
     APC_VIRTUAL_UNLOCK,
+    APC_VM_COUNTERS,
     APC_MAP_VIEW,
     APC_UNMAP_VIEW,
     APC_CREATE_THREAD
@@ -534,6 +535,10 @@ typedef union
     } virtual_unlock;
     struct
     {
+        enum apc_type    type;      /* APC_VM_COUNTERS */
+    } vm_counters;
+    struct
+    {
         enum apc_type    type;      /* APC_MAP_VIEW */
         obj_handle_t     handle;    /* mapping handle */
         client_ptr_t     addr;      /* requested address */
@@ -626,6 +631,13 @@ typedef union
     } virtual_unlock;
     struct
     {
+        enum apc_type    type;              /* APC_VM_COUNTERS */
+        unsigned int     status;            /* status returned by call */
+        mem_size_t       peak_virtual_size; /* peak virtual memory in bytes */
+        mem_size_t       virtual_size;      /* virtual memory in bytes */
+    } vm_counters;
+    struct
+    {
         enum apc_type    type;      /* APC_MAP_VIEW */
         unsigned int     status;    /* status returned by call */
         client_ptr_t     addr;      /* resulting address */
@@ -849,8 +861,6 @@ struct rawinput_device
 @REQ(get_process_vm_counters)
     obj_handle_t handle;                        /* process handle */
 @REPLY
-    mem_size_t peak_virtual_size;               /* peak virtual memory in bytes */
-    mem_size_t virtual_size;                    /* virtual memory in bytes */
     mem_size_t peak_working_set_size;           /* peak real memory in bytes */
     mem_size_t working_set_size;                /* real memory in bytes */
     mem_size_t pagefile_usage;                  /* commit charge in bytes */
diff --git a/server/request.h b/server/request.h
index ad89f30..c21834c 100644
--- a/server/request.h
+++ b/server/request.h
@@ -800,13 +800,11 @@ C_ASSERT( FIELD_OFFSET(struct get_process_info_reply, debug_children) == 62 );
 C_ASSERT( sizeof(struct get_process_info_reply) == 64 );
 C_ASSERT( FIELD_OFFSET(struct get_process_vm_counters_request, handle) == 12 );
 C_ASSERT( sizeof(struct get_process_vm_counters_request) == 16 );
-C_ASSERT( FIELD_OFFSET(struct get_process_vm_counters_reply, peak_virtual_size) == 8 );
-C_ASSERT( FIELD_OFFSET(struct get_process_vm_counters_reply, virtual_size) == 16 );
-C_ASSERT( FIELD_OFFSET(struct get_process_vm_counters_reply, peak_working_set_size) == 24 );
-C_ASSERT( FIELD_OFFSET(struct get_process_vm_counters_reply, working_set_size) == 32 );
-C_ASSERT( FIELD_OFFSET(struct get_process_vm_counters_reply, pagefile_usage) == 40 );
-C_ASSERT( FIELD_OFFSET(struct get_process_vm_counters_reply, peak_pagefile_usage) == 48 );
-C_ASSERT( sizeof(struct get_process_vm_counters_reply) == 56 );
+C_ASSERT( FIELD_OFFSET(struct get_process_vm_counters_reply, peak_working_set_size) == 8 );
+C_ASSERT( FIELD_OFFSET(struct get_process_vm_counters_reply, working_set_size) == 16 );
+C_ASSERT( FIELD_OFFSET(struct get_process_vm_counters_reply, pagefile_usage) == 24 );
+C_ASSERT( FIELD_OFFSET(struct get_process_vm_counters_reply, peak_pagefile_usage) == 32 );
+C_ASSERT( sizeof(struct get_process_vm_counters_reply) == 40 );
 C_ASSERT( FIELD_OFFSET(struct set_process_info_request, handle) == 12 );
 C_ASSERT( FIELD_OFFSET(struct set_process_info_request, mask) == 16 );
 C_ASSERT( FIELD_OFFSET(struct set_process_info_request, priority) == 20 );
diff --git a/server/thread.c b/server/thread.c
index 10a5bf1..0508ec6 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -1561,6 +1561,9 @@ DECL_HANDLER(queue_apc)
     case APC_CREATE_THREAD:
         process = get_process_from_handle( req->handle, PROCESS_CREATE_THREAD );
         break;
+    case APC_VM_COUNTERS:
+        process = get_process_from_handle( req->handle, PROCESS_QUERY_LIMITED_INFORMATION );
+        break;
     default:
         set_error( STATUS_INVALID_PARAMETER );
         break;
diff --git a/server/trace.c b/server/trace.c
index 6e23184..013b06e 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -200,6 +200,9 @@ static void dump_apc_call( const char *prefix, const apc_call_t *call )
         dump_uint64( "APC_VIRTUAL_UNLOCK,addr=", &call->virtual_unlock.addr );
         dump_uint64( ",size=", &call->virtual_unlock.size );
         break;
+    case APC_VM_COUNTERS:
+        fprintf( stderr, "APC_VM_COUNTERS" );
+        break;
     case APC_MAP_VIEW:
         fprintf( stderr, "APC_MAP_VIEW,handle=%04x", call->map_view.handle );
         dump_uint64( ",addr=", &call->map_view.addr );
@@ -283,6 +286,12 @@ static void dump_apc_result( const char *prefix, const apc_result_t *result )
         dump_uint64( ",addr=", &result->virtual_unlock.addr );
         dump_uint64( ",size=", &result->virtual_unlock.size );
         break;
+    case APC_VM_COUNTERS:
+        fprintf( stderr, "APC_VM_COUNTERS,status=%s",
+                 get_status_name( result->vm_counters.status ));
+        dump_uint64( ",peak_virtual_size=", &result->vm_counters.peak_virtual_size);
+        dump_uint64( ",virtual_size=",      &result->vm_counters.virtual_size);
+        break;
     case APC_MAP_VIEW:
         fprintf( stderr, "APC_MAP_VIEW,status=%s",
                  get_status_name( result->map_view.status ));
@@ -1353,9 +1362,7 @@ static void dump_get_process_vm_counters_request( const struct get_process_vm_co
 
 static void dump_get_process_vm_counters_reply( const struct get_process_vm_counters_reply *req )
 {
-    dump_uint64( " peak_virtual_size=", &req->peak_virtual_size );
-    dump_uint64( ", virtual_size=", &req->virtual_size );
-    dump_uint64( ", peak_working_set_size=", &req->peak_working_set_size );
+    dump_uint64( " peak_working_set_size=", &req->peak_working_set_size );
     dump_uint64( ", working_set_size=", &req->working_set_size );
     dump_uint64( ", pagefile_usage=", &req->pagefile_usage );
     dump_uint64( ", peak_pagefile_usage=", &req->peak_pagefile_usage );
-- 
2.7.4





More information about the wine-patches mailing list