// 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); } } }
public void CopyDriverToSetupDriverDirectoryAndRegisterIt(PNPDriverINFFile pnpDriverInf) { Console.WriteLine(); Console.WriteLine("Making the driver available to GUI mode setup."); // build list of source files: List <string> driverFiles = new List <string>(); foreach (FileToCopy fileToCopy in this.DriverFilesToCopy) { DisableInBoxDeviceDriverFile(m_installation.SetupDirectory, fileToCopy.DestinationFileName); driverFiles.Add(fileToCopy.RelativeSourceFilePath); } // make sure the .inf file will be copied too driverFiles.Add(pnpDriverInf.FileName); if (pnpDriverInf.CatalogFile != String.Empty) { if (File.Exists(this.DriverDirectory.Path + pnpDriverInf.CatalogFile)) { // add the catalog file too (to suppress unsigned driver warning message if the .inf has not been modified) // the catalog file is in the same location as the INF file ( http://msdn.microsoft.com/en-us/library/windows/hardware/ff547502%28v=vs.85%29.aspx ) driverFiles.Add(pnpDriverInf.CatalogFile); } } // Note that we may perform some operations on the same directory more than once, // the allocate / register methods are supposed to return the previously allocated IDs on subsequent calls, // and skip registration of previously registered directories foreach (string relativeFilePath in driverFiles) { string fileName = FileSystemUtils.GetNameFromPath(relativeFilePath); string relativeDirectoryPath = relativeFilePath.Substring(0, relativeFilePath.Length - fileName.Length); // we need to copy the files to the proper sub-directories m_installation.CopyFileToSetupDriverDirectory(this.DriverDirectory.Path + relativeDirectoryPath + fileName, this.HardwareID + @"\" + relativeDirectoryPath, fileName); string sourceDirectoryInMediaRootForm = m_installation.GetSourceDriverDirectoryInMediaRootForm(this.HardwareID + @"\" + relativeDirectoryPath); // note that we may violate ISO9660 - & is not allowed int sourceDiskID = m_installation.TextSetupInf.AllocateSourceDiskID(m_installation.ArchitectureIdentifier, sourceDirectoryInMediaRootForm); string destinationWinntDirectory = m_installation.GetDriverDestinationWinntDirectory(this.HardwareID + @"\" + relativeDirectoryPath); int destinationWinntDirectoryID = m_installation.TextSetupInf.AllocateWinntDirectoryID(destinationWinntDirectory); m_installation.TextSetupInf.SetSourceDisksFileEntry(m_installation.ArchitectureIdentifier, sourceDiskID, destinationWinntDirectoryID, fileName, FileCopyDisposition.AlwaysCopy); // dosnet.inf: we add the file to the list of files to be copied to local source directory if (!m_installation.IsTargetContainsTemporaryInstallation) { m_installation.DosNetInf.InstructSetupToCopyFileFromSetupDirectoryToLocalSourceDriverDirectory(sourceDirectoryInMediaRootForm, fileName); } m_installation.HiveSoftwareInf.RegisterDriverDirectory(destinationWinntDirectory); if (m_installation.Is64Bit) { // hivsft32.inf m_installation.HiveSoftware32Inf.RegisterDriverDirectory(destinationWinntDirectory); } } // set inf to boot start: string setupDriverDirectoryPath = m_installation.GetSetupDriverDirectoryPath(this.HardwareID + @"\"); // note that we may violate ISO9660 - & character is not allowed string installSectionName = pnpDriverInf.GetDeviceInstallSectionName(this.HardwareID, m_installation.ArchitectureIdentifier, m_installation.MinorOSVersion, m_installation.ProductType); pnpDriverInf.SetServiceToBootStart(installSectionName, m_installation.ArchitectureIdentifier, m_installation.MinorOSVersion); pnpDriverInf.SaveToDirectory(setupDriverDirectoryPath); // finished setting inf to boot start }