Changeset 3110 in vbox for trunk/src/VBox/Additions/WINNT/VBoxService
- Timestamp:
- Jun 14, 2007 4:18:18 PM (18 years ago)
- svn:sync-xref-src-repo-rev:
- 21993
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Additions/WINNT/VBoxService/VBoxService.cpp
r3109 r3110 420 420 } 421 421 422 static bool isVBoxDisplayDriverActive ( void)422 static bool isVBoxDisplayDriverActive (TCHAR *paszDeviceName) 423 423 { 424 424 bool result = false; … … 452 452 { 453 453 DDCLOG(("VBox display driver is active.\n")); 454 strcpy (paszDeviceName, dispDevice.DeviceName); 454 455 result = true; 455 456 } … … 463 464 464 465 devNum++; 466 } 467 468 return result; 469 } 470 471 static LPCTSTR vboxQueryMonitorName (TCHAR *DeviceName, TCHAR *MonitorName, INT idx) 472 { 473 LPCTSTR result = NULL; 474 475 DISPLAY_DEVICE dispDevice; 476 #ifdef DEBUG_DISPLAY_CHANGE 477 FillMemory(&dispDevice, sizeof(DISPLAY_DEVICE), 0); 478 479 dispDevice.cb = sizeof(DISPLAY_DEVICE); 480 481 INT devNum = 0; 482 483 while (EnumDisplayDevices(DeviceName, 484 devNum, 485 &dispDevice, 486 0)) 487 { 488 DDCLOG(("DevNum:%d\nName:%s\nString:%s\nID:%s\nKey:%s\nFlags=%08X\n\n", 489 devNum, 490 &dispDevice.DeviceName[0], 491 &dispDevice.DeviceString[0], 492 &dispDevice.DeviceID[0], 493 &dispDevice.DeviceKey[0], 494 dispDevice.StateFlags)); 495 496 FillMemory(&dispDevice, sizeof(DISPLAY_DEVICE), 0); 497 498 dispDevice.cb = sizeof(DISPLAY_DEVICE); 499 500 devNum++; 501 } 502 #endif /* DEBUG_DISPLAY_CHANGE */ 503 504 FillMemory(&dispDevice, sizeof(DISPLAY_DEVICE), 0); 505 506 dispDevice.cb = sizeof(DISPLAY_DEVICE); 507 508 DDCLOG(("VBoxService: vboxQueryMonitorName: DeviceName: %s, idx %d (sizeof (TCHAR) %d)\n", DeviceName, idx, sizeof (TCHAR))); 509 510 if (EnumDisplayDevices(DeviceName, 511 idx, 512 &dispDevice, 513 0)) 514 { 515 DDCLOG(("DevNum:%d\nName:%s\nString:%s\nID:%s\nKey:%s\nFlags=%08X\n\n", 516 devNum, 517 &dispDevice.DeviceName[0], 518 &dispDevice.DeviceString[0], 519 &dispDevice.DeviceID[0], 520 &dispDevice.DeviceKey[0], 521 dispDevice.StateFlags)); 522 523 strcpy (MonitorName, dispDevice.DeviceName); 524 result = &MonitorName[0]; 465 525 } 466 526 … … 477 537 VBoxGuestFilterMaskInfo maskInfo; 478 538 DWORD cbReturned; 539 540 typedef LONG WINAPI defChangeDisplaySettingsEx(LPCTSTR lpszDeviceName, LPDEVMODE lpDevMode, HWND hwnd, DWORD dwflags, LPVOID lParam); 541 typedef BOOL WINAPI defEnumDisplaySettingsEx(LPCTSTR lpszDeviceName, DWORD iModeNum, LPDEVMODE lpDevMode, DWORD dwFlags); 542 543 defChangeDisplaySettingsEx *pChangeDisplaySettingsEx = NULL; 544 defEnumDisplaySettingsEx *pEnumDisplaySettingsEx = NULL; 545 546 HMODULE hUser = GetModuleHandle("USER32"); 547 548 if (hUser) 549 { 550 pChangeDisplaySettingsEx = (defChangeDisplaySettingsEx *)GetProcAddress(hUser, "ChangeDisplaySettingsExA"); 551 pEnumDisplaySettingsEx = (defEnumDisplaySettingsEx *)GetProcAddress(hUser, "EnumDisplaySettingsExA"); 552 DDCLOG(("VBoxService: pChangeDisplaySettingsEx = %p, pEnumDisplaySettingsEx = %p\n", pChangeDisplaySettingsEx, pEnumDisplaySettingsEx)); 553 } 479 554 480 555 maskInfo.u32OrMask = VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST; … … 518 593 { 519 594 /* get the display change request */ 520 VMMDevDisplayChangeRequest displayChangeRequest = {0};521 displayChangeRequest.header.size = sizeof(VMMDevDisplayChangeRequest );595 VMMDevDisplayChangeRequest2 displayChangeRequest = {0}; 596 displayChangeRequest.header.size = sizeof(VMMDevDisplayChangeRequest2); 522 597 displayChangeRequest.header.version = VMMDEV_REQUEST_HEADER_VERSION; 523 displayChangeRequest.header.requestType = VMMDevReq_GetDisplayChangeRequest ;598 displayChangeRequest.header.requestType = VMMDevReq_GetDisplayChangeRequest2; 524 599 displayChangeRequest.eventAck = VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST; 525 if (DeviceIoControl(gVBoxDriver, IOCTL_VBOXGUEST_VMMREQUEST, &displayChangeRequest, sizeof(displayChangeRequest), 526 &displayChangeRequest, sizeof(displayChangeRequest), &cbReturned, NULL)) 600 BOOL fDisplayChangeQueried = DeviceIoControl(gVBoxDriver, IOCTL_VBOXGUEST_VMMREQUEST, &displayChangeRequest, sizeof(VMMDevDisplayChangeRequest2), 601 &displayChangeRequest, sizeof(VMMDevDisplayChangeRequest2), &cbReturned, NULL); 602 if (!fDisplayChangeQueried) 527 603 { 528 DDCLOG(("VBoxService: VMMDevReq_GetDisplayChangeRequest: %dx%dx%d\n", displayChangeRequest.xres, displayChangeRequest.yres, displayChangeRequest.bpp)); 604 /* Try the old version of the request for old VBox hosts. */ 605 displayChangeRequest.header.size = sizeof(VMMDevDisplayChangeRequest); 606 displayChangeRequest.header.version = VMMDEV_REQUEST_HEADER_VERSION; 607 displayChangeRequest.header.requestType = VMMDevReq_GetDisplayChangeRequest; 608 displayChangeRequest.eventAck = VMMDEV_EVENT_DISPLAY_CHANGE_REQUEST; 609 fDisplayChangeQueried = DeviceIoControl(gVBoxDriver, IOCTL_VBOXGUEST_VMMREQUEST, &displayChangeRequest, sizeof(VMMDevDisplayChangeRequest), 610 &displayChangeRequest, sizeof(VMMDevDisplayChangeRequest), &cbReturned, NULL); 611 displayChangeRequest.display = 0; 612 } 613 if (fDisplayChangeQueried) 614 { 615 DDCLOG(("VBoxService: VMMDevReq_GetDisplayChangeRequest2: %dx%dx%d at %d\n", displayChangeRequest.xres, displayChangeRequest.yres, displayChangeRequest.bpp, displayChangeRequest.display)); 529 616 530 617 /* 531 618 * Only try to change video mode if the active display driver is VBox additions. 532 619 */ 533 if (isVBoxDisplayDriverActive ()) 620 TCHAR DeviceName[32]; 621 if (isVBoxDisplayDriverActive (DeviceName)) 534 622 { 623 TCHAR MonitorName[32]; 624 LPCTSTR lpszDeviceName = NULL; 625 if (displayChangeRequest.display > 0 && pChangeDisplaySettingsEx != NULL) 626 { 627 lpszDeviceName = vboxQueryMonitorName (DeviceName, MonitorName, displayChangeRequest.display); 628 } 629 630 DDCLOG(("VBoxService: lpszDeviceName: %s\n", lpszDeviceName? lpszDeviceName: "(empty)")); 631 535 632 DEVMODE devMode; 536 537 /* get the current screen setup */ 538 if (EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devMode)) 633 memset (&devMode, 0, sizeof (devMode)); 634 devMode.dmSize = sizeof(DEVMODE); 635 636 /* get the current screen setup, using Ex to get dmPosition if available. */ 637 if (pEnumDisplaySettingsEx? 638 pEnumDisplaySettingsEx(lpszDeviceName, ENUM_CURRENT_SETTINGS, &devMode, 0): 639 EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devMode)) 539 640 { 540 SvcDebugOut2("VBoxService: Current mode: %dx%dx%d \n", devMode.dmPelsWidth, devMode.dmPelsHeight, devMode.dmBitsPerPel);641 SvcDebugOut2("VBoxService: Current mode: %dx%dx%d at %d,%d\n", devMode.dmPelsWidth, devMode.dmPelsHeight, devMode.dmBitsPerPel, devMode.dmPosition.x, devMode.dmPosition.y); 541 642 542 643 /* Horizontal resolution must be a multiple of 8, round down. */ … … 584 685 devMode.dmBitsPerPel = displayChangeRequest.bpp; 585 686 687 if (lpszDeviceName) devMode.dmFields |= DM_POSITION; 688 586 689 DDCLOG(("VBoxService: setting the new mode %dx%dx%d\n", devMode.dmPelsWidth, devMode.dmPelsHeight, devMode.dmBitsPerPel)); 587 690 588 691 /* set the new mode */ 589 692 LONG status; 590 status = ChangeDisplaySettings(&devMode, CDS_UPDATEREGISTRY); 693 status = pChangeDisplaySettingsEx? 694 pChangeDisplaySettingsEx(lpszDeviceName, &devMode, NULL, CDS_UPDATEREGISTRY, NULL): 695 ChangeDisplaySettings(&devMode, CDS_UPDATEREGISTRY); 591 696 if (status != DISP_CHANGE_SUCCESSFUL) 592 697 {
Note:
See TracChangeset
for help on using the changeset viewer.