VirtualBox

Changeset 4524 in vbox for trunk/src/VBox/Additions


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

Updates for guest statistics

Location:
trunk/src/VBox/Additions/WINNT
Files:
2 edited

Legend:

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

    r4301 r4524  
    428428}
    429429
     430static NTSTATUS VBoxGuestQueryMemoryBalloon(PVBOXGUESTDEVEXT pDevExt)
     431{
     432    /* just perform the request */
     433    VMMDevGetMemBalloonChangeRequest *req = NULL;
     434
     435    Log(("VBoxGuestQueryMemoryBalloon\n"));
     436
     437    int rc = VbglGRAlloc((VMMDevRequestHeader **)&req, sizeof(VMMDevGetMemBalloonChangeRequest), VMMDevReq_GetMemBalloonChangeRequest);
     438    vmmdevInitRequest(&req->header, VMMDevReq_GetMemBalloonChangeRequest);
     439    req->eventAck = VMMDEV_EVENT_BALLOON_CHANGE_REQUEST;
     440
     441    if (VBOX_SUCCESS(rc))
     442    {
     443        rc = VbglGRPerform(&req->header);
     444
     445        if (VBOX_FAILURE(rc) || VBOX_FAILURE(req->header.rc))
     446        {
     447            dprintf(("VBoxGuest::VBoxGuestDeviceControl IOCTL_VBOXGUEST_CTL_CHECK_BALLOON: error issuing request to VMMDev!"
     448                     "rc = %d, VMMDev rc = %Vrc\n", rc, req->header.rc));
     449            Status = STATUS_UNSUCCESSFUL;
     450        }
     451        else
     452        {
     453
     454        }
     455
     456        VbglGRFree(&req->header);
     457    }
     458    else
     459    {
     460        Status = STATUS_UNSUCCESSFUL;
     461    }
     462}
     463
     464
    430465/**
    431466 * Device I/O Control entry point.
     
    770805                pDevExt->ulOldActiveConsoleId    = 0;
    771806            }
     807            break;
     808        }
     809#endif
     810
     811#ifdef VBOX_WITH_MANAGEMENT
     812        case IOCTL_VBOXGUEST_CTL_CHECK_BALLOON:
     813        {
     814            Status = VBoxGuestQueryMemoryBalloon(pDevExt);
    772815            break;
    773816        }
  • 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