Beispiel #1
0
        public List <string> ListManufacturerIDs()
        {
            List <string> manufacturerIDs = new List <string>();

            List <string> manufacturers = GetSection("Manufacturer");

            foreach (string manufacturer in manufacturers)
            {
                KeyValuePair <string, List <string> > manufacturerKeyAndValues = INIFile.GetKeyAndValues(manufacturer);
                if (manufacturerKeyAndValues.Value.Count >= 1)
                {
                    string manufacturerID = manufacturerKeyAndValues.Value[0];
                    manufacturerIDs.Add(manufacturerID);
                }
            }
            return(manufacturerIDs);
        }
Beispiel #2
0
        public void SetServiceToBootStart(string installSectionName, string architectureIdentifier, int minorOSVersion, bool updateConsole)
        {
            List <string> installServicesSection = GetInstallServicesSection(installSectionName, architectureIdentifier, minorOSVersion);

            foreach (string line in installServicesSection)
            {
                KeyValuePair <string, List <string> > keyAndValues = INIFile.GetKeyAndValues(line);
                if (keyAndValues.Key == "AddService")
                {
                    string serviceName           = keyAndValues.Value[0];
                    string serviceInstallSection = keyAndValues.Value[2];
                    this.SetServiceToBootStart(serviceInstallSection);
                    if (updateConsole)
                    {
                        Console.WriteLine("Service '" + serviceName + "' has been set to boot start");
                    }
                }
            }
        }
Beispiel #3
0
        public static object ParseValueDataString(string valueData, RegistryValueKind valueKind)
        {
            switch (valueKind)
            {
            case RegistryValueKind.String:
            case RegistryValueKind.ExpandString:
                return(INIFile.Unquote(valueData));

            case RegistryValueKind.MultiString:
                List <string> stringList = INIFile.GetCommaSeparatedValues(valueData);
                for (int index = 0; index < stringList.Count; index++)
                {
                    stringList[index] = INIFile.Unquote(stringList[index]);
                    stringList[index] = stringList[index].Replace("\"\"", "\"");     // see notes at GetFormattedMultiString()
                }
                return(stringList.ToArray());

            case RegistryValueKind.DWord:
                // Sometimes a DWord value is quoted (Intel E1000 driver, version 8.10.3.0)
                // It's a violation of the specs, but Windows accepts this, so we should too.
                valueData = Unquote(valueData);
                return(Convert.ToInt32(valueData, 16));    // DWord values are in Hex

            case RegistryValueKind.QWord:
                return(Convert.ToInt64(valueData, 16));     // QWord values are in Hex

            case RegistryValueKind.Binary:
                List <string> byteStringList = INIFile.GetCommaSeparatedValues(valueData);
                List <byte>   byteList       = new List <byte>();
                for (int index = 0; index < byteStringList.Count; index++)
                {
                    // Sometimes each byte value is quoted (VIA Rhine III Fast Ethernet Adapter driver, version 3.41.0.0426)
                    // It's a violation of the specs, but Windows accepts this, so we should too.
                    string byteString = Unquote(byteStringList[index]);
                    byte   data       = Convert.ToByte(byteString, 16); // byte values are in Hex
                    byteList.Add(data);
                }
                return(byteList.ToArray());

            default:
                throw new NotImplementedException("Not implemented");
            }
        }
Beispiel #4
0
        /// <returns>
        /// Null if the diskID entry was not found,
        /// otherwise, the path is supposed to be in the following form: '\WinNT'
        /// </returns>
        public static string GeSourceDiskPath(PNPDriverINFFile pnpDriverInf, string diskID, string architectureIdentifier)
        {
            List <string> values = pnpDriverInf.GetValuesOfKeyInSection("SourceDisksNames." + architectureIdentifier, diskID);

            if (values.Count == 0)
            {
                values = pnpDriverInf.GetValuesOfKeyInSection("SourceDisksNames", diskID);
            }

            if (values.Count > 0)
            {
                // diskid = disk-description[,[tag-or-cab-file],[unused],[path],[flags][,tag-file]]
                string path = INIFile.TryGetValue(values, 3);
                // Quoted path is allowed (example: SiS 900-Based PCI Fast Ethernet Adapter driver, version 2.0.1039.1190)
                return(QuotedStringUtils.Unquote(path));
            }
            else
            {
                return(null);
            }
        }
Beispiel #5
0
        public string GetDeviceInstallSectionName(string hardwareIDToFind, string architectureIdentifier, int minorOSVersion, int productType)
        {
            List <string> manufacturerIDs = ListManufacturerIDs();

            foreach (string manufacturerID in manufacturerIDs)
            {
                List <string> models = GetModelsSection(manufacturerID, architectureIdentifier, minorOSVersion, productType);
                foreach (string model in models)
                {
                    KeyValuePair <string, List <string> > modelKeyAndValues = INIFile.GetKeyAndValues(model);
                    if (modelKeyAndValues.Value.Count >= 2)
                    {
                        string hardwareID = modelKeyAndValues.Value[1];
                        if (String.Equals(hardwareID, hardwareIDToFind, StringComparison.InvariantCultureIgnoreCase))
                        {
                            string installSectionName = modelKeyAndValues.Value[0];
                            return(installSectionName);
                        }
                    }
                }
            }
            return(String.Empty);
        }
Beispiel #6
0
        private void ProcessEventLogInstallSection(PNPDriverINFFile pnpDriverInf, string sectionName, string eventLogType, string eventName)
        {
            List <string> installSection = pnpDriverInf.GetSection(sectionName);

            string relativeRoot = @"Services\EventLog\" + eventLogType + @"\" + eventName;

            foreach (string line in installSection)
            {
                KeyValuePair <string, List <string> > keyAndValues = INIFile.GetKeyAndValues(line);
                switch (keyAndValues.Key)
                {
                case "AddReg":
                    foreach (string registrySectionName in keyAndValues.Value)
                    {
                        ProcessAddRegSection(pnpDriverInf, registrySectionName, relativeRoot);
                    }
                    break;

                default:
                    break;
                }
            }
        }
Beispiel #7
0
        public bool DisableMatchingHardwareID(string hardwareIDToDisable, string architectureIdentifier, int minorOSVersion, int productType)
        {
            bool   found             = false;
            string genericHardwareID = GetGenericHardwareID(hardwareIDToDisable);

            List <string> manufacturerIDs = ListManufacturerIDs();

            foreach (string manufacturerID in manufacturerIDs)
            {
                string modelsSectionName = GetMatchingModelsSectionName(manufacturerID, architectureIdentifier, minorOSVersion, productType);
                if (modelsSectionName == String.Empty)
                {
                    continue;
                }
                List <string> models = GetSection(modelsSectionName);

                foreach (string model in models)
                {
                    KeyValuePair <string, List <string> > modelKeyAndValues = INIFile.GetKeyAndValues(model);
                    if (modelKeyAndValues.Value.Count >= 2)
                    {
                        string hardwareID = modelKeyAndValues.Value[1];

                        if (hardwareID.StartsWith(genericHardwareID, StringComparison.InvariantCultureIgnoreCase))
                        {
                            int lineIndex = GetLineIndex(modelsSectionName, model);
                            UpdateLine(lineIndex, ";" + model);

                            found = true;
                        }
                    }
                }
            }

            return(found);
        }
Beispiel #8
0
        protected void ProcessInstallServicesSection(PNPDriverINFFile pnpDriverInf, string installSectionName)
        {
            List <string> installServicesSection = pnpDriverInf.GetInstallServicesSection(installSectionName, m_architectureIdentifier, m_minorOSVersion);

            foreach (string line in installServicesSection)
            {
                KeyValuePair <string, List <string> > keyAndValues = INIFile.GetKeyAndValues(line);
                switch (keyAndValues.Key)
                {
                case "AddService":
                    string serviceName            = keyAndValues.Value[0];
                    string serviceInstallSection  = keyAndValues.Value[2];
                    string eventLogInstallSection = INIFile.TryGetValue(keyAndValues.Value, 3);
                    string eventLogType           = INIFile.TryGetValue(keyAndValues.Value, 4);
                    string eventName = INIFile.TryGetValue(keyAndValues.Value, 5);
                    ProcessServiceInstallSection(pnpDriverInf, serviceInstallSection, serviceName);
                    if (eventLogInstallSection != String.Empty)
                    {
                        // http://msdn.microsoft.com/en-us/library/ff546326%28v=vs.85%29.aspx
                        if (eventLogType == String.Empty)
                        {
                            eventLogType = "System";
                        }
                        if (eventName == String.Empty)
                        {
                            eventName = serviceName;
                        }
                        ProcessEventLogInstallSection(pnpDriverInf, eventLogInstallSection, eventLogType, eventName);
                    }
                    break;

                default:
                    break;
                }
            }
        }
        // update txtsetup.sif and dotnet.inf
        private void UpdateTextSetupInformationFileAndCopyFiles(string deviceID)
        {
            // Files.HwComponent.ID Section
            TextModeDriverSetupINIFile driverINI = m_driverDirectory.TextModeDriverSetupINI;
            List <string> section = driverINI.GetDriverFilesSection(deviceID);

            string        serviceName = String.Empty;
            List <string> driverKeys  = new List <string>();

            string sourceDirectoryInMediaRootForm = m_installation.GetSourceDriverDirectoryInMediaRootForm(deviceID);
            int    sourceDiskID = m_installation.TextSetupInf.AllocateSourceDiskID(m_installation.ArchitectureIdentifier, sourceDirectoryInMediaRootForm);

            string destinationWinntDirectory   = m_installation.GetDriverDestinationWinntDirectory(m_deviceID);
            int    destinationWinntDirectoryID = m_installation.TextSetupInf.AllocateWinntDirectoryID(destinationWinntDirectory);

            foreach (string line in section)
            {
                KeyValuePair <string, List <string> > keyAndValues = INIFile.GetKeyAndValues(line);
                string fileType       = keyAndValues.Key;
                string directory      = driverINI.GetDirectoryOfDisk(keyAndValues.Value[0]);
                string fileName       = keyAndValues.Value[1];
                string sourceFilePath = m_driverDirectory.Path + "." + directory + @"\" + fileName;
                bool   isDriver       = keyAndValues.Key.Equals("driver", StringComparison.InvariantCultureIgnoreCase);
                m_installation.CopyFileToSetupDriverDirectory(sourceFilePath, deviceID + @"\", fileName);

                if (isDriver)
                {
                    m_installation.CopyDriverToSetupRootDirectory(sourceFilePath, fileName);
                    if (m_installation.IsTargetContainsTemporaryInstallation)
                    {
                        m_installation.CopyFileFromSetupDirectoryToBootDirectory(fileName);
                    }
                }

                m_installation.TextSetupInf.SetSourceDisksFileEntry(m_installation.ArchitectureIdentifier, sourceDiskID, destinationWinntDirectoryID, fileName, FileCopyDisposition.AlwaysCopy);

                if (isDriver)
                {
                    // http://msdn.microsoft.com/en-us/library/ff544919%28v=VS.85%29.aspx
                    // unlike what one may understand from the reading specs, this value is *only* used to form [Config.DriverKey] section name,
                    // and definitely NOT to determine the service subkey name under CurrentControlSet\Services. (which is determined by the service file name without a .sys extension)
                    string driverKey = keyAndValues.Value[2];

                    // http://support.microsoft.com/kb/885756
                    // according to this, only the first driver entry should be processed.

                    // http://app.nidc.kr/dirver/IBM_ServerGuide_v7.4.17/sguide/w3x64drv/$oem$/$1/drv/dds/txtsetup.oem
                    // however, this sample and my experience suggest that files / registry entries from a second driver entry will be copied / registered,
                    // (both under the same Services\serviceName key), so we'll immitate that.
                    driverKeys.Add(driverKey);

                    if (serviceName == String.Empty)
                    {
                        // Some txtsetup.oem drivers are without HardwareID entries,
                        // but we already know that the service is specified by the file name of its executable image without a .sys extension,
                        // so we should use that.
                        serviceName = TextSetupINFFile.GetServiceName(fileName);
                    }
                    // We should use FileCopyDisposition.DoNotCopy, because InstructToLoadSCSIDriver will already copy the device driver.
                    m_installation.TextSetupInf.SetSourceDisksFileDriverEntry(m_installation.ArchitectureIdentifier, fileName, FileCopyDisposition.DoNotCopy);
                    m_installation.TextSetupInf.SetFileFlagsEntryForDriver(fileName);
                    string deviceName = driverINI.GetDeviceName(deviceID);
                    m_installation.TextSetupInf.InstructToLoadSCSIDriver(fileName, deviceName);
                }

                // add file to the list of files to be copied to local source directory
                if (!m_installation.IsTargetContainsTemporaryInstallation)
                {
                    m_installation.DosNetInf.InstructSetupToCopyFileFromSetupDirectoryToLocalSourceDriverDirectory(sourceDirectoryInMediaRootForm, fileName);
                    if (isDriver)
                    {
                        m_installation.DosNetInf.InstructSetupToCopyFileFromSetupDirectoryToBootDirectory(fileName);
                    }
                }
            }

            section = driverINI.GetHardwareIdsSection(deviceID);
            foreach (string line in section)
            {
                KeyValuePair <string, List <string> > keyAndValues = INIFile.GetKeyAndValues(line);
                string hardwareID = keyAndValues.Value[0];
                // http://msdn.microsoft.com/en-us/library/ff546129%28v=VS.85%29.aspx
                // The service is specified by the file name of its executable image without a .sys extension
                // it is incomprehensible that this line will change the value of serviceName, because we already set serviceName to the service file name without a .sys extension
                serviceName = INIFile.Unquote(keyAndValues.Value[1]);
                hardwareID  = INIFile.Unquote(hardwareID);
                m_installation.TextSetupInf.AddDeviceToCriticalDeviceDatabase(hardwareID, serviceName);
            }

            foreach (string driverKey in driverKeys)
            {
                section = driverINI.GetConfigSection(driverKey);
                foreach (string line in section)
                {
                    KeyValuePair <string, List <string> > keyAndValues = INIFile.GetKeyAndValues(line);
                    string            subKeyNameQuoted  = keyAndValues.Value[0];
                    string            valueName         = keyAndValues.Value[1];
                    string            valueType         = keyAndValues.Value[2];
                    string            valueDataUnparsed = keyAndValues.Value[3];
                    RegistryValueKind valueKind         = TextModeDriverSetupINIFile.GetRegistryValueKind(valueType);
                    object            valueData         = HiveINIFile.ParseValueDataString(valueDataUnparsed, valueKind);
                    string            subKeyName        = INIFile.Unquote(subKeyNameQuoted);

                    m_installation.HiveSystemInf.SetServiceRegistryKey(serviceName, subKeyName, valueName, valueKind, valueData);
                    m_installation.SetupRegistryHive.SetServiceRegistryKey(serviceName, subKeyName, valueName, valueKind, valueData);
                }
            }
        }
Beispiel #10
0
        private void ProcessServiceInstallSection(PNPDriverINFFile pnpDriverInf, string sectionName, string serviceName)
        {
            Console.WriteLine("Registering service '" + serviceName + "'");
            List <string> serviceInstallSection = pnpDriverInf.GetSection(sectionName);

            string displayName        = String.Empty;
            string serviceBinary      = String.Empty;
            string serviceTypeString  = String.Empty;
            string errorControlString = String.Empty;
            string loadOrderGroup     = String.Empty;

            //string guiModeRelativeRoot = @"Services\" + serviceName;
            foreach (string line in serviceInstallSection)
            {
                KeyValuePair <string, List <string> > keyAndValues = INIFile.GetKeyAndValues(line);
                switch (keyAndValues.Key)
                {
                case "AddReg":
                    // http://msdn.microsoft.com/en-us/library/ff546326%28v=vs.85%29.aspx
                    // AddReg will always come after ServiceBinaryServiceBinary

                    string relativeRoot = @"Services\" + serviceName;

                    foreach (string registrySectionName in keyAndValues.Value)
                    {
                        ProcessAddRegSection(pnpDriverInf, registrySectionName, relativeRoot);
                    }
                    break;

                case "DisplayName":
                    displayName = INIFile.TryGetValue(keyAndValues.Value, 0);
                    break;

                case "ServiceBinary":
                    serviceBinary = INIFile.TryGetValue(keyAndValues.Value, 0);
                    break;

                case "ServiceType":
                    serviceTypeString = INIFile.TryGetValue(keyAndValues.Value, 0);
                    break;

                case "ErrorControl":
                    errorControlString = INIFile.TryGetValue(keyAndValues.Value, 0);
                    break;

                case "LoadOrderGroup":
                    loadOrderGroup = INIFile.TryGetValue(keyAndValues.Value, 0);
                    break;

                default:
                    break;
                }
            }

            displayName = pnpDriverInf.ExpandToken(displayName);
            displayName = INIFile.Unquote(displayName);

            string fileName  = serviceBinary.Replace(@"%12%\", String.Empty);
            string imagePath = pnpDriverInf.ExpandDirID(serviceBinary);

            int serviceType  = PNPDriverINFFile.ConvertFromIntStringOrHexString(serviceTypeString);
            int errorControl = PNPDriverINFFile.ConvertFromIntStringOrHexString(errorControlString);

            string deviceDescription = pnpDriverInf.GetDeviceDescription(m_hardwareID, m_architectureIdentifier, m_minorOSVersion, m_productType);

            DeviceService deviceService;

            if (pnpDriverInf.IsNetworkAdapter)
            {
                // this is a nic, we are binding TCP/IP to it
                // we need a unique NetCfgInstanceID that will be used with Tcpip service and the nic's class
                string netCfgInstanceID = "{" + Guid.NewGuid().ToString().ToUpper() + "}";
                deviceService = new NetworkDeviceService(deviceDescription, serviceName, displayName, loadOrderGroup, serviceType, errorControl, fileName, imagePath, netCfgInstanceID);
                m_deviceServices.Add(deviceService);
            }
            else
            {
                deviceService = new DeviceService(deviceDescription, serviceName, displayName, loadOrderGroup, serviceType, errorControl, fileName, imagePath);
                m_deviceServices.Add(deviceService);
            }
        }