VirtualBox

Ignore:
Timestamp:
Sep 5, 2007 8:34:25 AM (17 years ago)
Author:
vboxsync
Message:

Updates for guest statistics

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Additions/WINNT/VBoxService/VBoxGuest.cpp

    r4516 r4524  
    2525#include <iprt/assert.h>
    2626#include "helpers.h"
     27#include <winternl.h>
    2728
    2829typedef struct _VBOXGUESTCONTEXT
    2930{
    3031    const VBOXSERVICEENV *pEnv;
     32    uint32_t              uStatInterval;
     33
     34    NTSTATUS (WINAPI *pfnNtQuerySystemInformation)(SYSTEM_INFORMATION_CLASS SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength);
    3135} VBOXGUESTCONTEXT;
    3236
     
    3741int VBoxGuestInit(const VBOXSERVICEENV *pEnv, void **ppInstance, bool *pfStartThread)
    3842{
     43    HANDLE gVBoxDriver = pEnv->hDriver;
     44    DWORD  cbReturned;
     45
    3946    dprintf(("VBoxGuestInit\n"));
    4047
    41     gCtx.pEnv      = pEnv;
     48    gCtx.pEnv          = pEnv;
     49    gCtx.uStatInterval = 0;     /* default */
     50
     51    VMMDevGetStatisticsChangeRequest req;
     52    vmmdevInitRequest(&req.header, VMMDevReq_GetStatisticsChangeRequest);
     53    req.eventAck = 0;
     54
     55    if (DeviceIoControl(gVBoxDriver, IOCTL_VBOXGUEST_VMMREQUEST, &req, req.header.size, &req, req.header.size, &cbReturned, NULL))
     56    {
     57        dprintf(("VBoxGuestThread: new statistics interval %d seconds\n", req.u32StatInterval));
     58        gCtx.uStatInterval = req.u32StatInterval * 1000;
     59    }
     60    else
     61        dprintf(("VBoxGuestThread: DeviceIoControl failed with %d\n", GetLastError()));
     62
     63    HMODULE hMod = LoadLibrary("NTDLL.DLL");
     64    if (hMod)
     65    {
     66        *(uintptr_t *)&gCtx.pfnNtQuerySystemInformation = (uintptr_t)GetProcAddress(hMod, "NtQuerySystemInformation");
     67        if (gCtx.pfnNtQuerySystemInformation)
     68            dprintf(("gCtx.pfnNtQuerySystemInformation = %x\n", gCtx.pfnNtQuerySystemInformation));
     69        else
     70            dprintf(("NTDLL.NtQuerySystemInformation not found!!\n"));
     71    }
    4272
    4373    *pfStartThread = true;
     
    81111        /* wait for a seamless change event */
    82112        VBoxGuestWaitEventInfo waitEvent;
    83         waitEvent.u32TimeoutIn = 1000;
    84         waitEvent.u32EventMaskIn = VMMDEV_EVENT_BALLOON_CHANGE_REQUEST;
     113        waitEvent.u32TimeoutIn = (pCtx->uStatInterval) ? pCtx->uStatInterval : 1000;
     114        waitEvent.u32EventMaskIn = VMMDEV_EVENT_BALLOON_CHANGE_REQUEST | VMMDEV_EVENT_STATISTICS_INTERVAL_CHANGE_REQUEST;
    85115        if (DeviceIoControl(gVBoxDriver, IOCTL_VBOXGUEST_WAITEVENT, &waitEvent, sizeof(waitEvent), &waitEvent, sizeof(waitEvent), &cbReturned, NULL))
    86116        {
     
    98128                DeviceIoControl(gVBoxDriver, IOCTL_VBOXGUEST_CTL_CHECK_BALLOON, NULL, 0, NULL, 0, NULL, NULL);
    99129            }
     130            if (waitEvent.u32EventFlagsOut & VMMDEV_EVENT_STATISTICS_INTERVAL_CHANGE_REQUEST)
     131            {
     132                VMMDevGetStatisticsChangeRequest req;
     133                vmmdevInitRequest(&req.header, VMMDevReq_GetStatisticsChangeRequest);
     134                req.eventAck = VMMDEV_EVENT_STATISTICS_INTERVAL_CHANGE_REQUEST;
     135
     136                if (DeviceIoControl(gVBoxDriver, IOCTL_VBOXGUEST_VMMREQUEST, &req, req.header.size, &req, req.header.size, &cbReturned, NULL))
     137                {
     138                    dprintf(("VBoxGuestThread: new statistics interval %d seconds\n", req.u32StatInterval));
     139                    pCtx->uStatInterval = req.u32StatInterval * 1000;
     140                }
     141                else
     142                    dprintf(("VBoxGuestThread: DeviceIoControl failed with %d\n", GetLastError()));
     143
     144            }
    100145        }
    101146        else
     
    110155            }
    111156        }
     157        if (    gCtx.uStatInterval
     158            &&  gCtx.pfnNtQuerySystemInformation)
     159        {
     160            SYSTEM_INFO systemInfo;
     161
     162            /* Query and report guest statistics */
     163            GetSystemInfo(&systemInfo);
     164
     165            //gCtx.pfnNtQuerySystemInformation(
     166        }
    112167    }
    113168    while (!fTerminate);
    114169
    115170    maskInfo.u32OrMask = 0;
    116     maskInfo.u32NotMask = VMMDEV_EVENT_BALLOON_CHANGE_REQUEST;
     171    maskInfo.u32NotMask = VMMDEV_EVENT_BALLOON_CHANGE_REQUEST | VMMDEV_EVENT_STATISTICS_INTERVAL_CHANGE_REQUEST;
    117172    if (DeviceIoControl (gVBoxDriver, IOCTL_VBOXGUEST_CTL_FILTER_MASK, &maskInfo, sizeof (maskInfo), NULL, 0, &cbReturned, NULL))
    118173    {
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette