/// <param name="relativeRoot"> /// The location where HKR entried will be stored, relative to 'SYSTEM\CurrentControlSet\' (or ControlSet001 for that matter) /// </param> private void ProcessAddRegSection(PNPDriverINFFile pnpDriverInf, string sectionName, string relativeRoot) { List <string> section = pnpDriverInf.GetSection(sectionName); foreach (string line in section) { List <string> values = INIFile.GetCommaSeparatedValues(line); string hiveName = values[0]; string subKeyName = INIFile.Unquote(values[1]); string valueName = INIFile.TryGetValue(values, 2); string valueType = INIFile.TryGetValue(values, 3);; string valueDataUnparsed = String.Empty; if (values.Count > 3) { valueDataUnparsed = StringUtils.Join(values.GetRange(4, values.Count - 4), ","); // byte-list is separated using commmas } valueName = INIFile.Unquote(valueName); valueType = pnpDriverInf.ExpandToken(valueType); int valueTypeFlags = PNPDriverINFFile.ConvertFromIntStringOrHexString(valueType); string valueTypeHexString; if (!valueType.StartsWith("0x")) { valueTypeHexString = "0x" + valueTypeFlags.ToString("X8"); // we want value type in 8 digit hex string. } else { valueTypeHexString = valueType; } RegistryValueKind valueKind = PNPDriverINFFile.GetRegistryValueKind(valueTypeFlags); if (valueKind == RegistryValueKind.String) { valueDataUnparsed = pnpDriverInf.ExpandToken(valueDataUnparsed); } object valueData = HiveINIFile.ParseValueDataString(valueDataUnparsed, valueKind); if (hiveName == "HKR") { string cssKeyName = relativeRoot; if (subKeyName != String.Empty) { cssKeyName = cssKeyName + @"\" + subKeyName; } // Note that software key will stick from text-mode: SetCurrentControlSetRegistryKey(cssKeyName, valueName, valueKind, valueData); } else if (hiveName == "HKLM" && subKeyName.StartsWith(@"SYSTEM\CurrentControlSet\", StringComparison.InvariantCultureIgnoreCase)) { string cssKeyName = subKeyName.Substring(@"SYSTEM\CurrentControlSet\".Length); SetCurrentControlSetRegistryKey(cssKeyName, valueName, valueKind, valueData); } else { //Console.WriteLine("Warning: unsupported registry path: " + hiveName + @"\" + subKeyName); } } }
/// <param name="subdir">Presumably in the following form: '\x86'</param> public static string GeSourceFileDiskID(PNPDriverINFFile pnpDriverInf, string sourceFileName, string architectureIdentifier, out string subdir) { // During installation, SetupAPI functions look for architecture-specific SourceDisksFiles sections before using the generic section string platformSpecificSectionName = "SourceDisksFiles." + architectureIdentifier; List <string> values = pnpDriverInf.GetValuesOfKeyInSection(platformSpecificSectionName, sourceFileName); if (values.Count == 0) { values = pnpDriverInf.GetValuesOfKeyInSection("SourceDisksFiles", sourceFileName); } // filename=diskid[,[ subdir][,size]] string diskID = INIFile.TryGetValue(values, 0); subdir = INIFile.TryGetValue(values, 1); return(diskID); }
private void ProcessCopyFilesSection(PNPDriverINFFile pnpDriverInf, string sectionName) { List <string> section = pnpDriverInf.GetSection(sectionName); foreach (string line in section) { List <string> values = INIFile.GetCommaSeparatedValues(line); string destinationFileName = values[0]; string sourceFileName = INIFile.TryGetValue(values, 1); if (sourceFileName == String.Empty) { sourceFileName = destinationFileName; } ProcessCopyFileDirective(pnpDriverInf, sourceFileName, destinationFileName); } }
/// <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); } }
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; } } }
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); } }