Changeset 4524 in vbox
- Timestamp:
- Sep 5, 2007 8:34:25 AM (17 years ago)
- Location:
- trunk
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/VBoxGuest.h
r4519 r4524 146 146 VMMDevReq_ReportGuestStats = 110, 147 147 VMMDevReq_GetMemBalloonChangeRequest = 111, 148 VMMDevReq_GetStatisticsChangeRequest = 112, 148 149 VMMDevReq_LogString = 200, 149 150 VMMDevReq_SizeHack = 0x7fffffff … … 403 404 uint32_t eventAck; 404 405 } VMMDevGetMemBalloonChangeRequest; 406 407 /** guest statistics interval change request structure */ 408 typedef struct 409 { 410 /** header */ 411 VMMDevRequestHeader header; 412 uint32_t u32StatInterval; /* interval in seconds */ 413 uint32_t eventAck; 414 } VMMDevGetStatisticsChangeRequest; 405 415 406 416 /** display change request structure */ … … 969 979 970 980 /** Host mouse capabilities has been changed. */ 971 #define VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED BIT(0)981 #define VMMDEV_EVENT_MOUSE_CAPABILITIES_CHANGED BIT(0) 972 982 /** HGCM event. */ 973 #define VMMDEV_EVENT_HGCM BIT(1)983 #define VMMDEV_EVENT_HGCM BIT(1) 974 984 /** A display change request has been issued. */ 975 #define VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST BIT(2)985 #define VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST BIT(2) 976 986 /** Credentials are available for judgement. */ 977 #define VMMDEV_EVENT_JUDGE_CREDENTIALS BIT(3)987 #define VMMDEV_EVENT_JUDGE_CREDENTIALS BIT(3) 978 988 /** The guest has been restored. */ 979 #define VMMDEV_EVENT_RESTORED BIT(4)989 #define VMMDEV_EVENT_RESTORED BIT(4) 980 990 /** Seamless mode state changed */ 981 #define VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST BIT(5)991 #define VMMDEV_EVENT_SEAMLESS_MODE_CHANGE_REQUEST BIT(5) 982 992 /** Memory balloon size changed */ 983 #define VMMDEV_EVENT_BALLOON_CHANGE_REQUEST BIT(6) 993 #define VMMDEV_EVENT_BALLOON_CHANGE_REQUEST BIT(6) 994 /** Statistics interval changed */ 995 #define VMMDEV_EVENT_STATISTICS_INTERVAL_CHANGE_REQUEST BIT(7) 984 996 /** VRDP status changed. */ 985 997 #define VMMDEV_EVENT_VRDP BIT(7) … … 1305 1317 case VMMDevReq_GetMemBalloonChangeRequest: 1306 1318 return sizeof(VMMDevGetMemBalloonChangeRequest); 1319 case VMMDevReq_GetStatisticsChangeRequest: 1320 return sizeof(VMMDevGetStatisticsChangeRequest); 1307 1321 case VMMDevReq_LogString: 1308 1322 return sizeof(VMMDevReqLogString); -
trunk/include/VBox/pdmifs.h
r4492 r4524 1413 1413 DECLR3CALLBACKMEMBER(int, pfnSetMemoryBalloon,(PPDMIVMMDEVPORT pInterface, uint32_t ulBalloonSize)); 1414 1414 1415 /** 1416 * Issue a statistcs interval change request. 1417 * 1418 * Note that there can only one request in the queue and that in case the guest does 1419 * not process it, issuing another request will overwrite the previous. 1420 * 1421 * @returns VBox status code 1422 * @param ulStatInterval Statistics query interval in seconds (0=disable) 1423 */ 1424 DECLR3CALLBACKMEMBER(int, pfnSetStatisticsInterval,(PPDMIVMMDEVPORT pInterface, uint32_t ulStatInterval)); 1425 1415 1426 } PDMIVMMDEVPORT; 1416 1427 -
trunk/src/VBox/Additions/WINNT/VBoxGuest/VBoxGuest.cpp
r4301 r4524 428 428 } 429 429 430 static 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 430 465 /** 431 466 * Device I/O Control entry point. … … 770 805 pDevExt->ulOldActiveConsoleId = 0; 771 806 } 807 break; 808 } 809 #endif 810 811 #ifdef VBOX_WITH_MANAGEMENT 812 case IOCTL_VBOXGUEST_CTL_CHECK_BALLOON: 813 { 814 Status = VBoxGuestQueryMemoryBalloon(pDevExt); 772 815 break; 773 816 } -
trunk/src/VBox/Additions/WINNT/VBoxService/VBoxGuest.cpp
r4516 r4524 25 25 #include <iprt/assert.h> 26 26 #include "helpers.h" 27 #include <winternl.h> 27 28 28 29 typedef struct _VBOXGUESTCONTEXT 29 30 { 30 31 const VBOXSERVICEENV *pEnv; 32 uint32_t uStatInterval; 33 34 NTSTATUS (WINAPI *pfnNtQuerySystemInformation)(SYSTEM_INFORMATION_CLASS SystemInformationClass, PVOID SystemInformation, ULONG SystemInformationLength, PULONG ReturnLength); 31 35 } VBOXGUESTCONTEXT; 32 36 … … 37 41 int VBoxGuestInit(const VBOXSERVICEENV *pEnv, void **ppInstance, bool *pfStartThread) 38 42 { 43 HANDLE gVBoxDriver = pEnv->hDriver; 44 DWORD cbReturned; 45 39 46 dprintf(("VBoxGuestInit\n")); 40 47 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 } 42 72 43 73 *pfStartThread = true; … … 81 111 /* wait for a seamless change event */ 82 112 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; 85 115 if (DeviceIoControl(gVBoxDriver, IOCTL_VBOXGUEST_WAITEVENT, &waitEvent, sizeof(waitEvent), &waitEvent, sizeof(waitEvent), &cbReturned, NULL)) 86 116 { … … 98 128 DeviceIoControl(gVBoxDriver, IOCTL_VBOXGUEST_CTL_CHECK_BALLOON, NULL, 0, NULL, 0, NULL, NULL); 99 129 } 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 } 100 145 } 101 146 else … … 110 155 } 111 156 } 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 } 112 167 } 113 168 while (!fTerminate); 114 169 115 170 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; 117 172 if (DeviceIoControl (gVBoxDriver, IOCTL_VBOXGUEST_CTL_FILTER_MASK, &maskInfo, sizeof (maskInfo), NULL, 0, &cbReturned, NULL)) 118 173 { -
trunk/src/VBox/Devices/VMMDev/VBoxDev.cpp
r4492 r4524 1184 1184 if (requestHeader->size != sizeof(VMMDevGetMemBalloonChangeRequest)) 1185 1185 { 1186 AssertFailed(); 1186 1187 requestHeader->rc = VERR_INVALID_PARAMETER; 1187 1188 } … … 1197 1198 /* Remember which mode the client has queried. */ 1198 1199 pData->u32LastMemoryBalloonSize = pData->u32MemoryBalloonSize; 1200 } 1201 1202 requestHeader->rc = VINF_SUCCESS; 1203 } 1204 break; 1205 } 1206 1207 case VMMDevReq_GetStatisticsChangeRequest: 1208 { 1209 Log(("VMMDevReq_GetStatisticsChangeRequest\n")); 1210 if (requestHeader->size != sizeof(VMMDevGetStatisticsChangeRequest)) 1211 { 1212 AssertFailed(); 1213 requestHeader->rc = VERR_INVALID_PARAMETER; 1214 } 1215 else 1216 { 1217 VMMDevGetStatisticsChangeRequest *statIntervalChangeRequest = (VMMDevGetStatisticsChangeRequest*)requestHeader; 1218 /* just pass on the information */ 1219 Log(("VMMDev: returning statistics interval %d seconds\n", pData->u32StatIntervalSize)); 1220 statIntervalChangeRequest->u32StatInterval = pData->u32StatIntervalSize; 1221 1222 if (statIntervalChangeRequest->eventAck == VMMDEV_EVENT_STATISTICS_INTERVAL_CHANGE_REQUEST) 1223 { 1224 /* Remember which mode the client has queried. */ 1225 pData->u32LastStatIntervalSize= pData->u32StatIntervalSize; 1199 1226 } 1200 1227 … … 1696 1723 return VINF_SUCCESS; 1697 1724 } 1725 1726 static DECLCALLBACK(int) vmmdevSetStatisticsInterval(PPDMIVMMDEVPORT pInterface, uint32_t ulStatInterval) 1727 { 1728 VMMDevState *pData = IVMMDEVPORT_2_VMMDEVSTATE(pInterface); 1729 1730 /* Verify that the new resolution is different and that guest does not yet know about it. */ 1731 bool fSame = (pData->u32LastStatIntervalSize == ulStatInterval); 1732 1733 Log(("vmmdevSetStatisticsInterval: old=%d. new=%d\n", pData->u32LastStatIntervalSize, ulStatInterval)); 1734 1735 if (!fSame) 1736 { 1737 /* we could validate the information here but hey, the guest can do that as well! */ 1738 pData->u32StatIntervalSize = ulStatInterval; 1739 1740 /* IRQ so the guest knows what's going on */ 1741 VMMDevNotifyGuest (pData, VMMDEV_EVENT_STATISTICS_INTERVAL_CHANGE_REQUEST); 1742 } 1743 1744 return VINF_SUCCESS; 1745 } 1746 1698 1747 1699 1748 static DECLCALLBACK(int) vmmdevSetCredentials(PPDMIVMMDEVPORT pInterface, const char *pszUsername, … … 1985 2034 pData->Port.pfnRequestSeamlessChange = vmmdevRequestSeamlessChange; 1986 2035 pData->Port.pfnSetMemoryBalloon = vmmdevSetMemoryBalloon; 2036 pData->Port.pfnSetStatisticsInterval = vmmdevSetStatisticsInterval; 1987 2037 1988 2038 /* Shared folder LED */ … … 2116 2166 /* disabled memory ballooning */ 2117 2167 pData->u32LastMemoryBalloonSize = 0; 2168 2169 /* disabled statistics updating */ 2170 pData->u32LastStatIntervalSize = 0; 2118 2171 2119 2172 /* Clear the event variables. -
trunk/src/VBox/Devices/VMMDev/VMMDevState.h
r4492 r4524 135 135 uint32_t u32MemoryBalloonSize, u32LastMemoryBalloonSize; 136 136 137 /* statistics interval change request */ 138 uint32_t u32StatIntervalSize, u32LastStatIntervalSize; 139 137 140 /* seamless mode change request */ 138 141 bool fLastSeamlessEnabled, fSeamlessEnabled;
Note:
See TracChangeset
for help on using the changeset viewer.