internal static DnsEntry Create(Win32.DNS_RECORD record, IntPtr ptr) { switch (record.Type) { case (ushort)DnsRecordType.A: case (ushort)DnsRecordType.AAAA: return(new DnsHostEntry(record, ptr)); case (ushort)DnsRecordType.NS: case (ushort)DnsRecordType.PTR: case (ushort)DnsRecordType.CNAME: return(new DnsPointerEntry(record, ptr)); case (ushort)DnsRecordType.MX: return(new DnsMailExchangeEntry(record, ptr)); case (ushort)DnsRecordType.SRV: return(new DnsServiceEntry(record, ptr)); case (ushort)DnsRecordType.TXT: return(new DnsTextEntry(record, ptr)); default: throw new NotSupportedException(); } }
internal DnsMailExchangeEntry(Win32.DNS_RECORD record, IntPtr ptr) : base(record) { var data = record.GetData <Win32.DNS_MX_DATA>(ptr); Exchanger = Marshal.PtrToStringUni(data.NameExchange); Preference = data.Preference; }
internal DnsEntry(Win32.DNS_RECORD record) { Type = (DnsRecordType)record.Type; Name = Marshal.PtrToStringUni(record.Name); TimeToLive = TimeSpan.FromSeconds(record.TimeToLive); Expires = DateTime.UtcNow.Add(TimeToLive); }
internal DnsHostEntry(Win32.DNS_RECORD record, IntPtr ptr) : base(record) { var data = record.GetData <Win32.DnsHostUnion>(ptr); Address = (Type == DnsRecordType.A) ? Win32.ConvertUintToIpAddress(data.A.IpAddress) : Win32.ConvertAAAAToIpAddress(data.AAAA); }
internal DnsServiceEntry(Win32.DNS_RECORD record, IntPtr ptr) : base(record) { var data = record.GetData <Win32.DNS_SRV_DATA>(ptr); Host = Marshal.PtrToStringUni(data.NameTarget); Priority = data.Priority; Weight = data.Weight; Port = data.Port; }
internal DnsTextEntry(Win32.DNS_RECORD record, IntPtr ptr) : base(record) { // get TXT DATA block var txt = record.GetData <Win32.DNS_TXT_DATA>(ptr); // get pointers to strings var stringPointers = new IntPtr[txt.Count()]; IntPtr pointer0 = ptr + Marshal.SizeOf(record) + Marshal.SizeOf(txt.StringCount); Marshal.Copy(pointer0, stringPointers, 0, stringPointers.Length); // get string values Text = new string[stringPointers.Length]; for (int i = 0; i < stringPointers.Length; i++) { Text[i] = Marshal.PtrToStringUni(stringPointers[i]); } }
internal DnsPointerEntry(Win32.DNS_RECORD record, IntPtr ptr) : base(record) { var data = record.GetData <Win32.DNS_PTR_DATA>(ptr); Target = Marshal.PtrToStringUni(data.NameHost); }