VBoxSFR0Init(void) { Log(("VBoxSFR0Init: g_fpfnDevHlp=%lx u32Version=%RX32 u32Session=%RX32 pfnServiceEP=%p g_u32Info=%u (%#x)\n", g_fpfnDevHlp, g_VBoxGuestIDC.u32Version, g_VBoxGuestIDC.u32Session, g_VBoxGuestIDC.pfnServiceEP, g_u32Info, g_u32Info)); /* * Start by initializing IPRT. */ if ( g_VBoxGuestIDC.u32Version == VMMDEV_VERSION && VALID_PTR(g_VBoxGuestIDC.u32Session) && VALID_PTR(g_VBoxGuestIDC.pfnServiceEP)) { int rc = RTR0Init(0); if (RT_SUCCESS(rc)) { rc = VbglInit(); if (RT_SUCCESS(rc)) { #ifndef DONT_LOCK_SEGMENTS /* * Lock the 32-bit segments in memory. */ static KernVMLock_t s_Text32, s_Data32; rc = KernVMLock(VMDHL_LONG, &_text, (uintptr_t)&_etext - (uintptr_t)&_text, &s_Text32, (KernPageList_t *)-1, NULL); AssertMsg(rc == NO_ERROR, ("locking text32 failed, rc=%d\n")); rc = KernVMLock(VMDHL_LONG | VMDHL_WRITE, &_data, (uintptr_t)&_end - (uintptr_t)&_data, &s_Data32, (KernPageList_t *)-1, NULL); AssertMsg(rc == NO_ERROR, ("locking text32 failed, rc=%d\n")); #endif Log(("VBoxSFR0Init: completed successfully\n")); return; } } LogRel(("VBoxSF: RTR0Init failed, rc=%Rrc\n", rc)); } else LogRel(("VBoxSF: Failed to connect to VBoxGuest.sys.\n")); }
/* Checks if we have a device supported by our driver and initialize * our driver/card specific information. * In particular we obtain VM monitors configuration and configure related structures. */ static VP_STATUS VBoxDrvFindAdapter(IN PVOID HwDeviceExtension, IN PVOID HwContext, IN PWSTR ArgumentString, IN OUT PVIDEO_PORT_CONFIG_INFO ConfigInfo, OUT PUCHAR Again) { PVBOXMP_DEVEXT pExt = (PVBOXMP_DEVEXT) HwDeviceExtension; VP_STATUS rc; USHORT DispiId; ULONG AdapterMemorySize = VBE_DISPI_TOTAL_VIDEO_MEMORY_BYTES; PAGED_CODE(); LOGF_ENTER(); /* Init video port api */ VBoxSetupVideoPortAPI(pExt, ConfigInfo); VideoPortWritePortUshort((PUSHORT)VBE_DISPI_IOPORT_INDEX, VBE_DISPI_INDEX_ID); VideoPortWritePortUshort((PUSHORT)VBE_DISPI_IOPORT_DATA, VBE_DISPI_ID2); DispiId = VideoPortReadPortUshort((PUSHORT)VBE_DISPI_IOPORT_DATA); if (DispiId != VBE_DISPI_ID2) { WARN(("VBE card not found, returning ERROR_DEV_NOT_EXIST")); return ERROR_DEV_NOT_EXIST; } LOG(("found the VBE card")); /* * Query the adapter's memory size. It's a bit of a hack, we just read * an ULONG from the data port without setting an index before. */ AdapterMemorySize = VideoPortReadPortUlong((PULONG)VBE_DISPI_IOPORT_DATA); /* Write hw information to registry, so that it's visible in windows property dialog */ rc = VideoPortSetRegistryParameters(pExt, L"HardwareInformation.ChipType", VBoxChipType, sizeof(VBoxChipType)); VBOXMP_WARN_VPS(rc); rc = VideoPortSetRegistryParameters(pExt, L"HardwareInformation.DacType", VBoxDACType, sizeof(VBoxDACType)); VBOXMP_WARN_VPS(rc); rc = VideoPortSetRegistryParameters(pExt, L"HardwareInformation.MemorySize", &AdapterMemorySize, sizeof(ULONG)); VBOXMP_WARN_VPS(rc); rc = VideoPortSetRegistryParameters(pExt, L"HardwareInformation.AdapterString", VBoxAdapterString, sizeof(VBoxAdapterString)); VBOXMP_WARN_VPS(rc); rc = VideoPortSetRegistryParameters(pExt, L"HardwareInformation.BiosString", VBoxBiosString, sizeof(VBoxBiosString)); VBOXMP_WARN_VPS(rc); /* Call VideoPortGetAccessRanges to ensure interrupt info in ConfigInfo gets set up */ { VIDEO_ACCESS_RANGE tmpRanges[4]; ULONG slot = 0; VideoPortZeroMemory(tmpRanges, sizeof(tmpRanges)); if (VBoxQueryWinVersion() == WINNT4) { /* NT crashes if either of 'vendorId, 'deviceId' or 'slot' parameters is NULL, * and needs PCI ids for a successful VideoPortGetAccessRanges call. */ ULONG vendorId = 0x80EE; ULONG deviceId = 0xBEEF; rc = VideoPortGetAccessRanges(pExt, 0, NULL, RT_ELEMENTS(tmpRanges), tmpRanges, &vendorId, &deviceId, &slot); } else { rc = VideoPortGetAccessRanges(pExt, 0, NULL, RT_ELEMENTS(tmpRanges), tmpRanges, NULL, NULL, &slot); } VBOXMP_WARN_VPS(rc); } /* Initialize VBoxGuest library, which is used for requests which go through VMMDev. */ rc = VbglInit(); VBOXMP_WARN_VPS(rc); /* Preinitialize the primary extension. */ pExt->pNext = NULL; pExt->pPrimary = pExt; pExt->iDevice = 0; pExt->ulFrameBufferOffset = 0; pExt->ulFrameBufferSize = 0; pExt->u.primary.ulVbvaEnabled = 0; VideoPortZeroMemory(&pExt->areaDisplay, sizeof(HGSMIAREA)); /* Guest supports only HGSMI, the old VBVA via VMMDev is not supported. Old * code will be ifdef'ed and later removed. * The host will however support both old and new interface to keep compatibility * with old guest additions. */ VBoxSetupDisplaysHGSMI(&pExt->u.primary.commonInfo, AdapterMemorySize, 0); if (pExt->u.primary.commonInfo.bHGSMI) { LOGREL(("using HGSMI")); VBoxCreateDisplays(pExt, ConfigInfo); } /** @todo pretend success to make the driver work. */ rc = NO_ERROR; LOGF_LEAVE(); VBOXMP_WARN_VPS(rc); return rc; }
VOID VBoxDeviceAdded(PVBOXMOUSE_DEVEXT pDevExt) { LOGF_ENTER(); LONG callCnt = InterlockedIncrement(&g_ctx.cDevicesStarted); /* One time Vbgl initialization */ if (callCnt == 1) { if (!vboxIsVBGLInited() && !vboxIsVBGLInitFailed()) { int rc = VbglInit(); if (RT_SUCCESS(rc)) { InterlockedExchange(&g_ctx.fVBGLInited, TRUE); LOG(("VBGL init OK")); } else { InterlockedExchange (&g_ctx.fVBGLInitFailed, TRUE); WARN(("VBGL init failed with rc=%#x", rc)); } } } vboxNewProtDeviceAdded(pDevExt); if (!vboxIsHostMouseFound()) { NTSTATUS rc; UCHAR buffer[512]; CM_RESOURCE_LIST *pResourceList = (CM_RESOURCE_LIST *)&buffer[0]; ULONG cbWritten=0; BOOLEAN bDetected = FALSE; rc = IoGetDeviceProperty(pDevExt->pdoMain, DevicePropertyBootConfiguration, sizeof(buffer), &buffer[0], &cbWritten); if (!NT_SUCCESS(rc)) { WARN(("IoGetDeviceProperty failed with rc=%#x", rc)); return; } LOG(("Number of descriptors: %d", pResourceList->Count)); /* Check if device claims IO port 0x60 or int12 */ for (ULONG i=0; i<pResourceList->Count; ++i) { CM_FULL_RESOURCE_DESCRIPTOR *pFullDescriptor = &pResourceList->List[i]; LOG(("FullDescriptor[%i]: IfType %d, Bus %d, Ver %d, Rev %d, Count %d", i, pFullDescriptor->InterfaceType, pFullDescriptor->BusNumber, pFullDescriptor->PartialResourceList.Version, pFullDescriptor->PartialResourceList.Revision, pFullDescriptor->PartialResourceList.Count)); for (ULONG j=0; j<pFullDescriptor->PartialResourceList.Count; ++j) { CM_PARTIAL_RESOURCE_DESCRIPTOR *pPartialDescriptor = &pFullDescriptor->PartialResourceList.PartialDescriptors[j]; LOG(("PartialDescriptor[%d]: type %d, ShareDisposition %d, Flags 0x%04X, Start 0x%llx, length 0x%x", j, pPartialDescriptor->Type, pPartialDescriptor->ShareDisposition, pPartialDescriptor->Flags, pPartialDescriptor->u.Generic.Start.QuadPart, pPartialDescriptor->u.Generic.Length)); switch(pPartialDescriptor->Type) { case CmResourceTypePort: { LOG(("CmResourceTypePort %#x", pPartialDescriptor->u.Port.Start.QuadPart)); if (pPartialDescriptor->u.Port.Start.QuadPart == 0x60) { bDetected = TRUE; } break; } case CmResourceTypeInterrupt: { LOG(("CmResourceTypeInterrupt %ld", pPartialDescriptor->u.Interrupt.Vector)); if (pPartialDescriptor->u.Interrupt.Vector == 0xC) { bDetected = TRUE; } break; } default: { break; } } } } if (bDetected) { /* It's the emulated 8042 PS/2 mouse/kbd device, so mark it as the Host one. * For this device the filter will query absolute mouse coords from the host. */ InterlockedExchange(&g_ctx.fHostMouseFound, TRUE); pDevExt->bHostMouse = TRUE; LOG(("Host mouse found")); } } LOGF_LEAVE(); }