78a072e1b56619e3230735ae073668311232ec94vboxsync * instdrvmain - Install guest drivers on NT4
c58f1213e628a545081c70e26c6b67a841cff880vboxsync * Copyright (C) 2006-2010 Oracle Corporation
2f139cbf73f9adba01382892f33558ad7bcb40cbvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
2f139cbf73f9adba01382892f33558ad7bcb40cbvboxsync * available from http://www.virtualbox.org. This file is free software;
2f139cbf73f9adba01382892f33558ad7bcb40cbvboxsync * you can redistribute it and/or modify it under the terms of the GNU
2f139cbf73f9adba01382892f33558ad7bcb40cbvboxsync * General Public License (GPL) as published by the Free Software
2f139cbf73f9adba01382892f33558ad7bcb40cbvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
2f139cbf73f9adba01382892f33558ad7bcb40cbvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
2f139cbf73f9adba01382892f33558ad7bcb40cbvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
78a072e1b56619e3230735ae073668311232ec94vboxsync * The spacing in this file is horrible! Here are some simple rules:
78a072e1b56619e3230735ae073668311232ec94vboxsync * - tabs are forbidden
78a072e1b56619e3230735ae073668311232ec94vboxsync * - indentation is 4 spaces
78a072e1b56619e3230735ae073668311232ec94vboxsync/*******************************************************************************
78a072e1b56619e3230735ae073668311232ec94vboxsync* Defined Constants And Macros *
78a072e1b56619e3230735ae073668311232ec94vboxsync*******************************************************************************/
78a072e1b56619e3230735ae073668311232ec94vboxsync/** The video service name. */
78a072e1b56619e3230735ae073668311232ec94vboxsync/** The video inf file name */
78a072e1b56619e3230735ae073668311232ec94vboxsync/////////////////////////////////////////////////////////////////////////////
78a072e1b56619e3230735ae073668311232ec94vboxsync * Do some cleanup of data we used. Called by installVideoDriver()
78a072e1b56619e3230735ae073668311232ec94vboxsync SetupDiDestroyDriverInfoList(hDevInfo, NULL, SPDIT_CLASSDRIVER);
78a072e1b56619e3230735ae073668311232ec94vboxsync * Install the VBox video driver.
78a072e1b56619e3230735ae073668311232ec94vboxsync * @returns TRUE on success.
78a072e1b56619e3230735ae073668311232ec94vboxsync * @returns FALSE on failure.
78a072e1b56619e3230735ae073668311232ec94vboxsync * @param szDriverDir The base directory where we find the INF.
78a072e1b56619e3230735ae073668311232ec94vboxsync /* Vars used for reading the INF */
78a072e1b56619e3230735ae073668311232ec94vboxsync TCHAR deviceRegStr[1000];//I'm lazy here. 1000 ought to be enough for everybody...
78a072e1b56619e3230735ae073668311232ec94vboxsync /* Create an empty list */
78a072e1b56619e3230735ae073668311232ec94vboxsync hDevInfo = SetupDiCreateDeviceInfoList((LPGUID) &GUID_DEVCLASS_DISPLAY,
78a072e1b56619e3230735ae073668311232ec94vboxsync memset(&DeviceInstallParams, 0, sizeof(SP_DEVINSTALL_PARAMS));
78a072e1b56619e3230735ae073668311232ec94vboxsync DeviceInstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS);
78a072e1b56619e3230735ae073668311232ec94vboxsync DeviceInstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS);
78a072e1b56619e3230735ae073668311232ec94vboxsync DeviceInstallParams.Flags |= DI_NOFILECOPY | /* We did our own file copying */
78a072e1b56619e3230735ae073668311232ec94vboxsync DI_ENUMSINGLEINF; /* .DriverPath specifies an inf file */
78a072e1b56619e3230735ae073668311232ec94vboxsync /* Path to inf file */
78a072e1b56619e3230735ae073668311232ec94vboxsync /* Read the drivers from the inf file */
78a072e1b56619e3230735ae073668311232ec94vboxsync if (!SetupDiBuildDriverInfoList(hDevInfo, NULL, SPDIT_CLASSDRIVER))
78a072e1b56619e3230735ae073668311232ec94vboxsync /* Get the first found driver.
78a072e1b56619e3230735ae073668311232ec94vboxsync Our Inf file only contains one so this is fine */
78a072e1b56619e3230735ae073668311232ec94vboxsync if(FALSE==SetupDiEnumDriverInfo(hDevInfo, NULL, SPDIT_CLASSDRIVER,
78a072e1b56619e3230735ae073668311232ec94vboxsync /* Get necessary driver details */
78a072e1b56619e3230735ae073668311232ec94vboxsync DriverInfoDetailData.cbSize = sizeof(SP_DRVINFO_DETAIL_DATA);
78a072e1b56619e3230735ae073668311232ec94vboxsync SetupDiDestroyDriverInfoList(hDevInfo, NULL, SPDIT_CLASSDRIVER);
78a072e1b56619e3230735ae073668311232ec94vboxsync hInf = SetupOpenInfFile(DriverInfoDetailData.InfFileName,
78a072e1b56619e3230735ae073668311232ec94vboxsync SetupDiDestroyDriverInfoList(hDevInfo, NULL, SPDIT_CLASSDRIVER);
78a072e1b56619e3230735ae073668311232ec94vboxsync /* First install the service */
78a072e1b56619e3230735ae073668311232ec94vboxsync if(!SetupFindFirstLine(hInf, szServiceSection, NULL, &serviceContext))
78a072e1b56619e3230735ae073668311232ec94vboxsync /* No service line?? Can't be... */
78a072e1b56619e3230735ae073668311232ec94vboxsync /* Get the name */
78a072e1b56619e3230735ae073668311232ec94vboxsync wsprintf(deviceRegStr, TEXT("Root\\LEGACY_%ws\\0000"), szServiceData);
78a072e1b56619e3230735ae073668311232ec94vboxsync memset(&deviceInfoData, 0, sizeof(SP_DEVINFO_DATA));
78a072e1b56619e3230735ae073668311232ec94vboxsync if (SetupDiOpenDeviceInfo(hDevInfo, deviceRegStr, NULL, 0, &deviceInfoData) //Check for existing
78a072e1b56619e3230735ae073668311232ec94vboxsync ||(SetupDiCreateDeviceInfo(hDevInfo, deviceRegStr, //Create new
78a072e1b56619e3230735ae073668311232ec94vboxsync /* We created a new key in the registry */
78a072e1b56619e3230735ae073668311232ec94vboxsync memset(&DeviceInstallParams, 0,sizeof(SP_DEVINSTALL_PARAMS));
78a072e1b56619e3230735ae073668311232ec94vboxsync DeviceInstallParams.cbSize = sizeof(SP_DEVINSTALL_PARAMS);
78a072e1b56619e3230735ae073668311232ec94vboxsync DeviceInstallParams.Flags |= DI_NOFILECOPY | //We already copied the files
78a072e1b56619e3230735ae073668311232ec94vboxsync /* Path to inf file */
78a072e1b56619e3230735ae073668311232ec94vboxsync /* Make sure the device is enabled */
78a072e1b56619e3230735ae073668311232ec94vboxsync TEXT("System\\CurrentControlSet\\Services\\%ws\\Device%d"),
78a072e1b56619e3230735ae073668311232ec94vboxsync /* Insert description */
78a072e1b56619e3230735ae073668311232ec94vboxsync (lstrlen(DriverInfoDetailData.DrvDescription) + 1) *
78a072e1b56619e3230735ae073668311232ec94vboxsync /* Install OpenGL stuff */
78a072e1b56619e3230735ae073668311232ec94vboxsync TEXT("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\OpenGLDrivers"),
78a072e1b56619e3230735ae073668311232ec94vboxsync /* Do installation here if ever necessary. Currently there is no OpenGL stuff */
78a072e1b56619e3230735ae073668311232ec94vboxsync /* Cleanup */
78a072e1b56619e3230735ae073668311232ec94vboxsync /* If this key is inserted into the registry, windows will show the desktop
78a072e1b56619e3230735ae073668311232ec94vboxsync applet on next boot. We decide in the installer if we want that so the code
78a072e1b56619e3230735ae073668311232ec94vboxsync is disabled here. */
78a072e1b56619e3230735ae073668311232ec94vboxsync /* Set registry keys so windows picks up the changes */
78a072e1b56619e3230735ae073668311232ec94vboxsync TEXT("SYSTEM\\CurrentControlSet\\Control\\GraphicsDrivers\\NewDisplay"),
78a072e1b56619e3230735ae073668311232ec94vboxsync /* We must reboot at some point */
78a072e1b56619e3230735ae073668311232ec94vboxsync TEXT("SYSTEM\\CurrentControlSet\\Control\\GraphicsDrivers\\RebootNecessary"),
78a072e1b56619e3230735ae073668311232ec94vboxsync printf("Installs VirtualBox Guest Additions for Windows NT 4.0\n\n");
78a072e1b56619e3230735ae073668311232ec94vboxsync printf("\n\t/i - perform Guest Additions installation\n");
78a072e1b56619e3230735ae073668311232ec94vboxsync printf("\t/u: - perform Guest Additions uninstallation\n");
78a072e1b56619e3230735ae073668311232ec94vboxsync * Check if we are running on NT4.
78a072e1b56619e3230735ae073668311232ec94vboxsync * @returns TRUE if NT 4.
78a072e1b56619e3230735ae073668311232ec94vboxsync * @returns FALSE otherwise.
78a072e1b56619e3230735ae073668311232ec94vboxsync osVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
78a072e1b56619e3230735ae073668311232ec94vboxsync * Video driver uninstallation will be added later if necessary.
78a072e1b56619e3230735ae073668311232ec94vboxsync /** @todo r=bird:
78a072e1b56619e3230735ae073668311232ec94vboxsync * And by the way, we're only missing the coding style dmik uses now
78a072e1b56619e3230735ae073668311232ec94vboxsync * and this file would contain the complete set. */
78a072e1b56619e3230735ae073668311232ec94vboxsync if(2!=argc || (stricmp(argv[1], "/i") && stricmp(argv[1], "/u")))
78a072e1b56619e3230735ae073668311232ec94vboxsync /* This program is only for installing drivers on NT4 */
78a072e1b56619e3230735ae073668311232ec94vboxsync if (!GetModuleFileName(hExe, &szInstallDir[0], sizeof(szInstallDir)))
78a072e1b56619e3230735ae073668311232ec94vboxsync printf("GetModuleFileName failed! rc = %d\n", GetLastError());
78a072e1b56619e3230735ae073668311232ec94vboxsync TCHAR *lastBackslash = wcsrchr(szInstallDir, L'\\');
78a072e1b56619e3230735ae073668311232ec94vboxsync /* Install video driver. Mouse driver installation is done by overwriting
78a072e1b56619e3230735ae073668311232ec94vboxsync the image path in the setup script. */
78a072e1b56619e3230735ae073668311232ec94vboxsync /* No video driver uninstallation yet. Do we need it? */
78a072e1b56619e3230735ae073668311232ec94vboxsync printf("Some failure occurred during driver installation.\n");