+static
+BOOL
+ParseIpv4Address(
+ _In_ PCWSTR AddressString,
+ _Out_ PIN_ADDR pAddress)
+{
+ PCWSTR pTerminator = NULL;
+ NTSTATUS Status;
+
+ Status = RtlIpv4StringToAddressW(AddressString,
+ TRUE,
+ &pTerminator,
+ pAddress);
+ if (NT_SUCCESS(Status) && pTerminator != NULL && *pTerminator == L'\0')
+ return TRUE;
+
+ return FALSE;
+}
+
+
+static
+BOOL
+ParseIpv6Address(
+ _In_ PCWSTR AddressString,
+ _Out_ PIN6_ADDR pAddress)
+{
+ PCWSTR pTerminator = NULL;
+ NTSTATUS Status;
+
+ Status = RtlIpv6StringToAddressW(AddressString,
+ &pTerminator,
+ pAddress);
+ if (NT_SUCCESS(Status) && pTerminator != NULL && *pTerminator == L'\0')
+ return TRUE;
+
+ return FALSE;
+}
+
+
+static
+PDNS_RECORDW
+CreateRecordForIpAddress(
+ _In_ PCWSTR Name,
+ _In_ WORD Type)
+{
+ IN_ADDR Ip4Address;
+ IN6_ADDR Ip6Address;
+ PDNS_RECORDW pRecord = NULL;
+
+ if (Type == DNS_TYPE_A)
+ {
+ if (ParseIpv4Address(Name, &Ip4Address))
+ {
+ pRecord = RtlAllocateHeap(RtlGetProcessHeap(),
+ HEAP_ZERO_MEMORY,
+ sizeof(DNS_RECORDW));
+ if (pRecord == NULL)
+ return NULL;
+
+ pRecord->pName = RtlAllocateHeap(RtlGetProcessHeap(),
+ 0,
+ (wcslen(Name) + 1) * sizeof(WCHAR));
+ if (pRecord == NULL)
+ {
+ RtlFreeHeap(RtlGetProcessHeap(), 0, pRecord);
+ return NULL;
+ }
+
+ wcscpy(pRecord->pName, Name);
+ pRecord->wType = DNS_TYPE_A;
+ pRecord->wDataLength = sizeof(DNS_A_DATA);
+ pRecord->Flags.S.Section = DnsSectionQuestion;
+ pRecord->Flags.S.CharSet = DnsCharSetUnicode;
+ pRecord->dwTtl = 7 * 24 * 60 * 60;
+
+ pRecord->Data.A.IpAddress = Ip4Address.S_un.S_addr;
+
+ return pRecord;
+ }
+ }
+ else if (Type == DNS_TYPE_AAAA)
+ {
+ if (ParseIpv6Address(Name, &Ip6Address))
+ {
+ pRecord = RtlAllocateHeap(RtlGetProcessHeap(),
+ HEAP_ZERO_MEMORY,
+ sizeof(DNS_RECORDW));
+ if (pRecord == NULL)
+ return NULL;
+
+ pRecord->pName = RtlAllocateHeap(RtlGetProcessHeap(),
+ 0,
+ (wcslen(Name) + 1) * sizeof(WCHAR));
+ if (pRecord == NULL)
+ {
+ RtlFreeHeap(RtlGetProcessHeap(), 0, pRecord);
+ return NULL;
+ }
+
+ wcscpy(pRecord->pName, Name);
+ pRecord->wType = DNS_TYPE_AAAA;
+ pRecord->wDataLength = sizeof(DNS_AAAA_DATA);
+ pRecord->Flags.S.Section = DnsSectionQuestion;
+ pRecord->Flags.S.CharSet = DnsCharSetUnicode;
+ pRecord->dwTtl = 7 * 24 * 60 * 60;
+
+ CopyMemory(&pRecord->Data.AAAA.Ip6Address,
+ &Ip6Address.u.Byte,
+ sizeof(IN6_ADDR));
+
+ return pRecord;
+ }
+ }
+
+ return NULL;
+}
+