private static void WriteAsn() { int[] asnIndices = Create.Array(Asns.Max(asn => asn.Number) + 1, -1); for (int i = 0; i < Asns.Count; i++) { asnIndices[Asns[i].Number] = i; } using MemoryStream memoryStream = new MemoryStream(); using (BinaryWriter writer = new BinaryWriter(memoryStream, Encoding.UTF8)) { writer.Write(DateTime.Now.Ticks); writer.Write(Asns.Count); writer.Write(AsnRanges.Length); writer.Write(AsnRanges6.Length); foreach (Asn asn in Asns) { writer.Write(asn.Number); writer.Write(asn.Organization); } foreach (AsnRange range in AsnRanges) { writer.Write(GetAsnIndex(range.Asn)); writer.Write(range.From); writer.Write(range.To); } foreach (AsnRange6 range in AsnRanges6) { writer.Write(GetAsnIndex(range.Asn)); writer.Write(range.From); writer.Write(range.To); } } File.WriteAllBytes(@"..\..\..\BytecodeApi.GeoIP.ASN\Resources\GeoIP.ASN.db", Compression.Compress(memoryStream.ToArray())); int GetAsnIndex(int number) { int index = asnIndices[number]; return(index != -1 ? index : throw new FormatException("ASN ID '" + number + "' not found.")); } }
/// <summary> /// Parses commandline arguments from a <see cref="string" /> and returns the equivalent <see cref="string" />[] with split commandline arguments. /// </summary> /// <param name="commandLine">A <see cref="string" /> specifying a commandline.</param> /// <returns> /// The equivalent <see cref="string" />[] with split commandline arguments from the given commandline. /// </returns> public static string[] ParseCommandLine(string commandLine) { Check.ArgumentNull(commandLine, nameof(commandLine)); IntPtr argumentsPtr = Native.CommandLineToArgvW(commandLine, out int count); if (argumentsPtr == IntPtr.Zero) { throw Throw.Win32(); } try { return(Create.Array(count, i => Marshal.PtrToStringUni(Marshal.ReadIntPtr(argumentsPtr, i * IntPtr.Size)))); } finally { Native.LocalFree(argumentsPtr); } }
private PEImage(byte[] originalImage) : this() { OriginalImage = originalImage; using BinaryReader reader = new BinaryReader(new MemoryStream(OriginalImage)); // MZ if (reader.BaseStream.Length < 2) { throw new PEImageParseException(0, "DOS signature not found."); } if (reader.ReadUInt16() != 0x5a4d) { throw new PEImageParseException(0, "DOS header not found."); } // DOS Header if (reader.BaseStream.Length - reader.BaseStream.Position < 64) { throw new PEImageParseException((int)reader.BaseStream.Position, "DOS header incomplete."); } DosHeader = new ImageDosHeader { LastPageSize = reader.ReadUInt16(), PageCount = reader.ReadUInt16(), RelocationCount = reader.ReadUInt16(), HeaderSize = reader.ReadUInt16(), MinAlloc = reader.ReadUInt16(), MaxAlloc = reader.ReadUInt16(), InitialSS = reader.ReadUInt16(), InitialSP = reader.ReadUInt16(), Checksum = reader.ReadUInt16(), InitialIP = reader.ReadUInt16(), InitialCS = reader.ReadUInt16(), RelocationOffset = reader.ReadUInt16(), OverlayNumber = reader.ReadUInt16(), Reserved1 = reader.ReadUInt16(), Reserved2 = reader.ReadUInt16(), Reserved3 = reader.ReadUInt16(), Reserved4 = reader.ReadUInt16(), OemIdentifier = reader.ReadUInt16(), OemInformation = reader.ReadUInt16(), Reserved5 = reader.ReadUInt16(), Reserved6 = reader.ReadUInt16(), Reserved7 = reader.ReadUInt16(), Reserved8 = reader.ReadUInt16(), Reserved9 = reader.ReadUInt16(), Reserved10 = reader.ReadUInt16(), Reserved11 = reader.ReadUInt16(), Reserved12 = reader.ReadUInt16(), Reserved13 = reader.ReadUInt16(), Reserved14 = reader.ReadUInt16(), PEHeaderOffset = reader.ReadUInt32() }; // DOS Stub if (reader.BaseStream.Length < DosHeader.PEHeaderOffset) { throw new PEImageParseException((int)reader.BaseStream.Position, "DOS stub incomplete."); } DosStub = reader.ReadBytes((int)(DosHeader.PEHeaderOffset - reader.BaseStream.Position)); // COFF Header if (reader.ReadUInt32() != 0x4550) { throw new PEImageParseException((int)reader.BaseStream.Position - 4, "COFF header not found."); } if (reader.BaseStream.Length - reader.BaseStream.Position < 20) { throw new PEImageParseException((int)reader.BaseStream.Position, "COFF header incomplete."); } CoffHeader = new ImageCoffHeader { Machine = (ImageMachineType)reader.ReadUInt16(), NumberOfSections = reader.ReadUInt16(), TimeDateStamp = reader.ReadUInt32(), PointerToSymbolTable = reader.ReadUInt32(), NumberOfSymbols = reader.ReadUInt32(), SizeOfOptionalHeader = reader.ReadUInt16(), Characteristics = (ImageCharacteristics)reader.ReadUInt16() }; // Optional Header if (reader.BaseStream.Length - reader.BaseStream.Position < 2) { throw new PEImageParseException((int)reader.BaseStream.Position, "Optional header not found."); } ushort magic = reader.ReadUInt16(); if (magic == 0x10b) { if (reader.BaseStream.Length - reader.BaseStream.Position < 94) { throw new PEImageParseException((int)reader.BaseStream.Position, "Optional header incomplete."); } OptionalHeader = new ImageOptionalHeader32 { MajorLinkerVersion = reader.ReadByte(), MinorLinkerVersion = reader.ReadByte(), SizeOfCode = reader.ReadUInt32(), SizeOfInitializedData = reader.ReadUInt32(), SizeOfUninitializedData = reader.ReadUInt32(), AddressOfEntryPoint = reader.ReadUInt32(), BaseOfCode = reader.ReadUInt32(), BaseOfData = reader.ReadUInt32(), ImageBase = reader.ReadUInt32(), SectionAlignment = reader.ReadUInt32(), FileAlignment = reader.ReadUInt32(), MajorOperatingSystemVersion = reader.ReadUInt16(), MinorOperatingSystemVersion = reader.ReadUInt16(), MajorImageVersion = reader.ReadUInt16(), MinorImageVersion = reader.ReadUInt16(), MajorSubsystemVersion = reader.ReadUInt16(), MinorSubsystemVersion = reader.ReadUInt16(), Win32VersionValue = reader.ReadUInt32(), SizeOfImage = reader.ReadUInt32(), SizeOfHeaders = reader.ReadUInt32(), Checksum = reader.ReadUInt32(), Subsystem = (ImageSubsystem)reader.ReadUInt16(), DllCharacteristics = (ImageDllCharacteristics)reader.ReadUInt16(), SizeOfStackReserve = reader.ReadUInt32(), SizeOfStackCommit = reader.ReadUInt32(), SizeOfHeapReserve = reader.ReadUInt32(), SizeOfHeapCommit = reader.ReadUInt32(), LoaderFlags = reader.ReadUInt32(), NumberOfRvaAndSizes = reader.ReadUInt32() }; } else if (magic == 0x20b) { if (reader.BaseStream.Length - reader.BaseStream.Position < 110) { throw new PEImageParseException((int)reader.BaseStream.Position, "Optional header incomplete."); } OptionalHeader = new ImageOptionalHeader64 { MajorLinkerVersion = reader.ReadByte(), MinorLinkerVersion = reader.ReadByte(), SizeOfCode = reader.ReadUInt32(), SizeOfInitializedData = reader.ReadUInt32(), SizeOfUninitializedData = reader.ReadUInt32(), AddressOfEntryPoint = reader.ReadUInt32(), BaseOfCode = reader.ReadUInt32(), ImageBase = reader.ReadUInt64(), SectionAlignment = reader.ReadUInt32(), FileAlignment = reader.ReadUInt32(), MajorOperatingSystemVersion = reader.ReadUInt16(), MinorOperatingSystemVersion = reader.ReadUInt16(), MajorImageVersion = reader.ReadUInt16(), MinorImageVersion = reader.ReadUInt16(), MajorSubsystemVersion = reader.ReadUInt16(), MinorSubsystemVersion = reader.ReadUInt16(), Win32VersionValue = reader.ReadUInt32(), SizeOfImage = reader.ReadUInt32(), SizeOfHeaders = reader.ReadUInt32(), Checksum = reader.ReadUInt32(), Subsystem = (ImageSubsystem)reader.ReadUInt16(), DllCharacteristics = (ImageDllCharacteristics)reader.ReadUInt16(), SizeOfStackReserve = reader.ReadUInt64(), SizeOfStackCommit = reader.ReadUInt64(), SizeOfHeapReserve = reader.ReadUInt64(), SizeOfHeapCommit = reader.ReadUInt64(), LoaderFlags = reader.ReadUInt32(), NumberOfRvaAndSizes = reader.ReadUInt32() }; } else if (magic == 0x107) { throw new PEImageParseException((int)reader.BaseStream.Position - 2, "Optional header for ROM's is not supported."); } else { throw new PEImageParseException((int)reader.BaseStream.Position - 2, "Optional header magic value of '0x" + magic.ToString("x4") + "' unknown."); } // Data Directories if (reader.BaseStream.Length - reader.BaseStream.Position < OptionalHeader.NumberOfRvaAndSizes * 8) { throw new PEImageParseException((int)reader.BaseStream.Position, "Data directories incomplete."); } OptionalHeader.DataDirectories = Create.Array((int)OptionalHeader.NumberOfRvaAndSizes, i => new ImageDataDirectory((ImageDataDirectoryName)i, reader.ReadUInt32(), reader.ReadUInt32())); // Section Headers if (reader.BaseStream.Length - reader.BaseStream.Position < CoffHeader.NumberOfSections * 40) { throw new PEImageParseException((int)reader.BaseStream.Position, "Section headers incomplete."); } Sections = Create .Enumerable(CoffHeader.NumberOfSections, i => new ImageSectionHeader { Name = reader.ReadBytes(8).TakeWhile(c => c != 0).ToArray().ToUTF8String(), VirtualSize = reader.ReadUInt32(), VirtualAddress = reader.ReadUInt32(), SizeOfRawData = reader.ReadUInt32(), PointerToRawData = reader.ReadUInt32(), PointerToRelocations = reader.ReadUInt32(), PointerToLineNumbers = reader.ReadUInt32(), NumberOfRelocations = reader.ReadUInt16(), NumberOfLineNumbers = reader.ReadUInt16(), Characteristics = (ImageSectionFlags)reader.ReadUInt32() }) .Select(header => { if (header.PointerToRawData + header.SizeOfRawData <= reader.BaseStream.Length) { return(new ImageSection(header, OriginalImage.GetBytes((int)header.PointerToRawData, (int)header.SizeOfRawData))); } else { throw new PEImageParseException((int)reader.BaseStream.Position, "Section '" + header.Name + "' incomplete."); } }) .ToArray(); }
private static void ParseCities() { Cities = CsvFile .EnumerateBinary(Csv.City, ",", true, false, Encoding.UTF8) .Select(row => new City { ID = row[0].Int32Value.Value, CountryIndex = GetCountryIndex(row[4].Value), Name = row[10].Value, Subdivision1Name = row[7].Value, Subdivision1IsoCode = row[6].Value, Subdivision2Name = row[9].Value, Subdivision2IsoCode = row[8].Value, TimeZone = row[12].Value }) .OrderBy(city => city.Name, StringComparer.OrdinalIgnoreCase) .ToArray(); int[] cityIndices = Create.Array(Cities.Max(city => city.ID) + 1, -1); for (int i = 0; i < Cities.Length; i++) { cityIndices[Cities[i].ID] = i; } CityRanges = CsvFile .EnumerateBinary(Csv.CityRange, ",", true, false, Encoding.UTF8) .Where(row => row[1].Value != "") .Select(row => { ConvertCidr(row[0].Value, out uint from, out uint to); return(new CityRange { CityIndex = GetCityIndex(row[1].Int32Value.Value), PostalCode = row[6].Value, Latitude = row[7].Value.ToSingleOrNull().Value, Longitude = row[8].Value.ToSingleOrNull().Value, AccuracyRadius = Convert.ToInt16(row[9].Int32Value.Value), From = from, To = to }); }) .ToArray(); CityRanges6 = CsvFile .EnumerateBinary(Csv.CityRange6, ",", true, false, Encoding.UTF8) .Where(row => row[1].Value != "") .Select(row => { ConvertCidr(row[0].Value, out byte[] from, out byte[] to); return(new CityRange6 { CityIndex = GetCityIndex(row[1].Int32Value.Value), PostalCode = row[6].Value, Latitude = row[7].Value.ToSingleOrNull().Value, Longitude = row[8].Value.ToSingleOrNull().Value, AccuracyRadius = Convert.ToInt16(row[9].Int32Value.Value), From = from, To = to }); }) .ToArray(); byte GetCountryIndex(string isoCode) { int index = Countries.IndexOf(country => country.IsoCode == isoCode); return(index != -1 ? (byte)index : byte.MaxValue); } int GetCityIndex(int id) { int index = cityIndices[id]; return(index != -1 ? index : throw new FormatException("City ID '" + id + "' not found.")); } }