예제 #1
0
    /// <summary>
    /// Wrapper method to perform DNS Query.
    /// </summary>
    /// <remarks>Makes DnsQuery a little more palatable.</remarks>
    /// <param name="domain">The domain.</param>
    /// <param name="dnsServerAddress">IPAddress of DNS server (may be null) </param>
    /// <param name="recordType">Type of DNS dnsRecord.</param>
    /// <param name="ppQueryResults">Pointer to pointer to query results.</param>
    /// <returns>Win32 status code.</returns>
    static int DnsQuery(
        String domain,
        IPAddress dnsServerAddress,
        DnsRecordType recordType,
        ref IntPtr ppQueryResults)
    {
        Debug.Assert(!StringUtils.IsNullOrEmpty(domain), "domain cannot be null.");

        IntPtr pServerList = IntPtr.Zero;

        try
        {
            pServerList = DnsNativeMethods.AllocDnsServerList(dnsServerAddress);

            return(DnsNativeMethods.DnsQuery(
                       domain,
                       recordType,
                       DnsQueryOptions.DNS_QUERY_STANDARD,
                       pServerList,
                       ref ppQueryResults,
                       0));
        }
        finally
        {
            // Note: if pServerList is IntPtr.Zero, FreeHGlobal does nothing.
            Marshal.FreeHGlobal(pServerList);
        }
    }
예제 #2
0
    /// <summary>
    /// Perform DNS Query.
    /// </summary>
    /// <typeparam name="T">DnsRecord type.</typeparam>
    /// <param name="domain">The domain.</param>
    /// <param name="dnsServerAddress">IPAddress of DNS server to use (may be null).</param>
    /// <returns>The DNS record list (never null but may be empty).</returns>
    static List <T> DnsQuery <T>(String domain, IPAddress dnsServerAddress) where T : DnsRecord, new()
    {
        List <T> dnsRecordList = new List <T>();

        // Each strongly-typed DnsRecord type maps to a DnsRecordType enum.
        DnsRecordType dnsRecordTypeToQuery = typeToDnsTypeMap.Member[typeof(T)];

        // queryResultsPtr will point to unmanaged heap memory if DnsQuery succeeds.
        IntPtr queryResultsPtr = IntPtr.Zero;

        try
        {
            // Perform DNS query. If successful, construct a list of results.
            int errorCode = DnsNativeMethods.DnsQuery(
                domain,
                dnsServerAddress,
                dnsRecordTypeToQuery,
                ref queryResultsPtr);

            if (errorCode == Win32Success)
            {
                DnsRecordHeader dnsRecordHeader;

                // Interate through linked list of query result records.
                for (IntPtr recordPtr = queryResultsPtr; !recordPtr.Equals(IntPtr.Zero); recordPtr = dnsRecordHeader.NextRecord)
                {
                    dnsRecordHeader = (DnsRecordHeader)Marshal.PtrToStructure(recordPtr, typeof(DnsRecordHeader));

                    T dnsRecord = new T();
                    if (dnsRecordHeader.RecordType == dnsRecord.RecordType)
                    {
                        dnsRecord.Load(dnsRecordHeader, recordPtr);
                        dnsRecordList.Add(dnsRecord);
                    }
                }
            }
            else
            {
                throw new DnsException(errorCode);
            }
        }
        finally
        {
            if (queryResultsPtr != IntPtr.Zero)
            {
                // DnsQuery allocated unmanaged heap, free it now.
                DnsNativeMethods.FreeDnsQueryResults(queryResultsPtr);
            }
        }

        return(dnsRecordList);
    }
예제 #3
0
    /// <summary>
    /// Free results from DnsQuery call.
    /// </summary>
    /// <remarks>Makes DnsRecordListFree a little more palatable.</remarks>
    /// <param name="ptrRecords">Pointer to records.</param>
    static void FreeDnsQueryResults(IntPtr ptrRecords)
    {
        Debug.Assert(!ptrRecords.Equals(IntPtr.Zero), "ptrRecords cannot be null.");

        DnsNativeMethods.DnsRecordListFree(ptrRecords, FreeType.RecordList);
    }