[DNSAPI][DNSRSLVR] Parse the hosts file when the resolver is initializing

- Move the hosts file handling from dnsapi.dll to the resolver service. Now, the hosts file is no longer parsed on each query.
- Add support for DNS_QUERY_WIRE_ONLY and DNS_QUERY_NO_WIRE_QUERY flags to R_ResolverQuery.
- GetCurrentTimeInSeconds() should return DWORD instead of DNS_STATUS.
This commit is contained in:
Eric Kohl 2019-11-23 17:07:59 +01:00
parent d4a0549eb6
commit 630f34a0d0
9 changed files with 484 additions and 263 deletions

View file

@ -5,6 +5,7 @@ add_rpc_files(server ${REACTOS_SOURCE_DIR}/sdk/include/reactos/idl/dnsrslvr.idl)
list(APPEND SOURCE
cache.c
dnsrslvr.c
hostsfile.c
rpcserver.c
precomp.h
${CMAKE_CURRENT_BINARY_DIR}/dnsrslvr_s.c)

View file

@ -20,7 +20,7 @@ static BOOL DnsCacheInitialized = FALSE;
VOID
DnsIntCacheInitialize(VOID)
{
DPRINT("DnsIntCacheInitialize\n");
DPRINT("DnsIntCacheInitialize()\n");
/* Check if we're initialized */
if (DnsCacheInitialized)
@ -35,7 +35,7 @@ DnsIntCacheInitialize(VOID)
VOID
DnsIntCacheFree(VOID)
{
DPRINT("DnsIntCacheFree\n");
DPRINT("DnsIntCacheFree()\n");
/* Check if we're initialized */
if (!DnsCacheInitialized)
@ -53,7 +53,7 @@ DnsIntCacheFree(VOID)
VOID
DnsIntCacheRemoveEntryItem(PRESOLVER_CACHE_ENTRY CacheEntry)
{
DPRINT("DnsIntCacheRemoveEntryItem %p\n", CacheEntry);
DPRINT("DnsIntCacheRemoveEntryItem(%p)\n", CacheEntry);
/* Remove the entry from the list */
RemoveEntryList(&CacheEntry->CacheLink);
@ -71,7 +71,7 @@ DnsIntCacheFlush(VOID)
PLIST_ENTRY Entry;
PRESOLVER_CACHE_ENTRY CacheEntry;
DPRINT("DnsIntCacheFlush\n");
DPRINT("DnsIntCacheFlush()\n");
/* Lock the cache */
DnsCacheLock();
@ -94,15 +94,19 @@ DnsIntCacheFlush(VOID)
DnsCacheUnlock();
}
BOOL
DnsIntCacheGetEntryFromName(LPCWSTR Name,
PDNS_RECORDW *Record)
DNS_STATUS
DnsIntCacheGetEntryByName(
LPCWSTR Name,
WORD wType,
DWORD dwFlags,
PDNS_RECORDW *Record)
{
BOOL Ret = FALSE;
DNS_STATUS Status = DNS_INFO_NO_RECORDS;
PRESOLVER_CACHE_ENTRY CacheEntry;
PLIST_ENTRY NextEntry;
DPRINT("DnsIntCacheGetEntryFromName %ws %p\n", Name, Record);
DPRINT("DnsIntCacheGetEntryByName(%S %hu 0x%lx %p)\n",
Name, wType, dwFlags, Record);
/* Assume failure */
*Record = NULL;
@ -122,7 +126,7 @@ DnsIntCacheGetEntryFromName(LPCWSTR Name,
{
/* Copy the entry and return it */
*Record = DnsRecordSetCopyEx(CacheEntry->Record, DnsCharSetUnicode, DnsCharSetUnicode);
Ret = TRUE;
Status = ERROR_SUCCESS;
break;
}
@ -132,8 +136,7 @@ DnsIntCacheGetEntryFromName(LPCWSTR Name,
/* Release the cache */
DnsCacheUnlock();
/* Return */
return Ret;
return Status;
}
BOOL
@ -143,7 +146,7 @@ DnsIntCacheRemoveEntryByName(LPCWSTR Name)
PRESOLVER_CACHE_ENTRY CacheEntry;
PLIST_ENTRY NextEntry;
DPRINT("DnsIntCacheRemoveEntryByName %ws\n", Name);
DPRINT("DnsIntCacheRemoveEntryByName(%S)\n", Name);
/* Lock the cache */
DnsCacheLock();
@ -179,7 +182,10 @@ DnsIntCacheAddEntry(PDNS_RECORDW Record)
{
PRESOLVER_CACHE_ENTRY Entry;
DPRINT("DnsIntCacheRemoveEntryByName %p\n", Record);
DPRINT("DnsIntCacheAddEntry(%p)\n", Record);
DPRINT("Name: %S\n", Record->pName);
DPRINT("TTL: %lu\n", Record->dwTtl);
/* Lock the cache */
DnsCacheLock();

View file

@ -101,6 +101,8 @@ ServiceMain(
DnsIntCacheInitialize();
ReadHostsFile();
hThread = CreateThread(NULL,
0,
(LPTHREAD_START_ROUTINE)

View file

@ -0,0 +1,396 @@
/*
* COPYRIGHT: See COPYING in the top level directory
* PROJECT: ReactOS system libraries
* FILE: base/services/dnsrslvr/hostsfile.c
* PURPOSE: HOSTS file routines
* PROGRAMERS: Art Yerkes
* Eric Kohl
*/
#include "precomp.h"
#define NDEBUG
#include <debug.h>
static
PWSTR
AnsiToUnicode(
PSTR NarrowString)
{
PWSTR WideString;
int WideLen;
WideLen = MultiByteToWideChar(CP_ACP,
0,
NarrowString,
-1,
NULL,
0);
if (WideLen == 0)
return NULL;
WideString = HeapAlloc(GetProcessHeap(),
0,
WideLen * sizeof(WCHAR));
if (WideString == NULL)
return NULL;
MultiByteToWideChar(CP_ACP,
0,
NarrowString,
-1,
WideString,
WideLen);
return WideString;
}
static
BOOL
ParseV4Address(
LPCSTR AddressString,
OUT PDWORD pAddress)
{
CHAR *cp;
DWORD val, base;
unsigned char c;
DWORD parts[4], *pp = parts;
cp = (CHAR *)AddressString;
if (!AddressString)
return FALSE;
if (!isdigit(*cp))
return FALSE;
again:
/*
* Collect number up to ``.''.
* Values are specified as for C:
* 0x=hex, 0=octal, other=decimal.
*/
val = 0; base = 10;
if (*cp == '0')
{
if (*++cp == 'x' || *cp == 'X')
base = 16, cp++;
else
base = 8;
}
while ((c = *cp))
{
if (isdigit(c))
{
val = (val * base) + (c - '0');
cp++;
continue;
}
if (base == 16 && isxdigit(c))
{
val = (val << 4) + (c + 10 - (islower(c) ? 'a' : 'A'));
cp++;
continue;
}
break;
}
if (*cp == '.')
{
/*
* Internet format:
* a.b.c.d
*/
if (pp >= parts + 4)
return FALSE;
*pp++ = val;
cp++;
goto again;
}
/* Check for trailing characters */
if (*cp && *cp > ' ')
return FALSE;
if (pp >= parts + 4)
return FALSE;
*pp++ = val;
/*
* Concoct the address according to
* the number of parts specified.
*/
if ((DWORD)(pp - parts) != 4)
return FALSE;
if (parts[0] > 0xff || parts[1] > 0xff || parts[2] > 0xff || parts[3] > 0xff)
return FALSE;
val = (parts[3] << 24) | (parts[2] << 16) | (parts[1] << 8) | parts[0];
if (pAddress)
*pAddress = val;
return TRUE;
}
static
VOID
AddV4HostEntries(
PWSTR pszHostName,
DWORD dwIpAddress)
{
DNS_RECORDW ARecord, PtrRecord;
WCHAR szInAddrArpaName[32];
/* Prepare the A record */
ZeroMemory(&ARecord, sizeof(DNS_RECORDW));
ARecord.pName = pszHostName;
ARecord.wType = DNS_TYPE_A;
ARecord.wDataLength = sizeof(DNS_A_DATA);
ARecord.dwTtl = 86400;
ARecord.Data.A.IpAddress = dwIpAddress;
swprintf(szInAddrArpaName,
L"%u.%u.%u.%u.in-addr.arpa",
(dwIpAddress >> 24) & 0xFF,
(dwIpAddress >> 16) & 0xFF,
(dwIpAddress >> 8) & 0xFF,
dwIpAddress & 0xFF);
/* Prepare the PTR record */
ZeroMemory(&PtrRecord, sizeof(DNS_RECORDW));
PtrRecord.pName = szInAddrArpaName;
PtrRecord.wType = DNS_TYPE_PTR;
PtrRecord.wDataLength = sizeof(DNS_PTR_DATA);
PtrRecord.dwTtl = 86400;
PtrRecord.Data.PTR.pNameHost = pszHostName;
DnsIntCacheAddEntry(&ARecord);
DnsIntCacheAddEntry(&PtrRecord);
}
static
FILE *
OpenHostsFile(VOID)
{
PWSTR ExpandedPath;
PWSTR DatabasePath;
HKEY DatabaseKey;
DWORD RegSize = 0;
size_t StringLength;
FILE *pHostsFile;
DWORD dwError;
ExpandedPath = HeapAlloc(GetProcessHeap(), 0, MAX_PATH * sizeof(WCHAR));
if (ExpandedPath == NULL)
return NULL;
/* Open the database path key */
dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
L"System\\CurrentControlSet\\Services\\Tcpip\\Parameters",
0,
KEY_READ,
&DatabaseKey);
if (dwError == ERROR_SUCCESS)
{
/* Read the actual path */
RegQueryValueExW(DatabaseKey,
L"DatabasePath",
NULL,
NULL,
NULL,
&RegSize);
DatabasePath = HeapAlloc(GetProcessHeap(), 0, RegSize);
if (DatabasePath == NULL)
{
HeapFree(GetProcessHeap(), 0, ExpandedPath);
RegCloseKey(DatabaseKey);
return NULL;
}
/* Read the actual path */
dwError = RegQueryValueExW(DatabaseKey,
L"DatabasePath",
NULL,
NULL,
(LPBYTE)DatabasePath,
&RegSize);
/* Close the key */
RegCloseKey(DatabaseKey);
if (dwError != ERROR_SUCCESS)
{
HeapFree(GetProcessHeap(), 0, DatabasePath);
HeapFree(GetProcessHeap(), 0, ExpandedPath);
return NULL;
}
/* Expand the name */
ExpandEnvironmentStringsW(DatabasePath, ExpandedPath, MAX_PATH);
HeapFree(GetProcessHeap(), 0, DatabasePath);
}
else
{
/* Use defalt path */
GetSystemDirectoryW(ExpandedPath, MAX_PATH);
StringCchLengthW(ExpandedPath, MAX_PATH, &StringLength);
if (ExpandedPath[StringLength - 1] != L'\\')
{
/* It isn't, so add it ourselves */
StringCchCatW(ExpandedPath, MAX_PATH, L"\\");
}
StringCchCatW(ExpandedPath, MAX_PATH, L"drivers\\etc\\");
}
/* Make sure that the path is backslash-terminated */
StringCchLengthW(ExpandedPath, MAX_PATH, &StringLength);
if (ExpandedPath[StringLength - 1] != L'\\')
{
/* It isn't, so add it ourselves */
StringCchCatW(ExpandedPath, MAX_PATH, L"\\");
}
/* Add the database name */
StringCchCatW(ExpandedPath, MAX_PATH, L"hosts");
/* Open the hosts file */
pHostsFile = _wfopen(ExpandedPath, L"r");
HeapFree(GetProcessHeap(), 0, ExpandedPath);
return pHostsFile;
}
BOOL
ReadHostsFile(VOID)
{
CHAR szLineBuffer[512];
FILE *pHostFile = NULL;
CHAR *Ptr, *NameStart, *NameEnd, *AddressStart, *AddressEnd;
DWORD Address;
PWSTR pszHostName;
pHostFile = OpenHostsFile();
if (pHostFile == NULL)
return FALSE;
for (;;)
{
/* Read a line */
if (fgets(szLineBuffer, sizeof(szLineBuffer), pHostFile) == NULL)
break;
NameStart = NameEnd = NULL;
AddressStart = AddressEnd = NULL;
/* Search for the start of the ip address */
Ptr = szLineBuffer;
for (;;)
{
if (*Ptr == 0 || *Ptr == '#')
break;
if (!isspace(*Ptr))
{
AddressStart = Ptr;
Ptr = Ptr + 1;
break;
}
Ptr = Ptr + 1;
}
/* Search for the end of the ip address */
for (;;)
{
if (*Ptr == 0 || *Ptr == '#')
break;
if (isspace(*Ptr))
{
AddressEnd = Ptr;
Ptr = Ptr + 1;
break;
}
Ptr = Ptr + 1;
}
/* Search for the start of the name */
for (;;)
{
if (*Ptr == 0 || *Ptr == '#')
break;
if (!isspace(*Ptr))
{
NameStart = Ptr;
Ptr = Ptr + 1;
break;
}
Ptr = Ptr + 1;
}
/* Search for the end of the name */
for (;;)
{
if (*Ptr == 0 || *Ptr == '#')
break;
if (isspace(*Ptr))
{
NameEnd = Ptr;
break;
}
Ptr = Ptr + 1;
}
if (AddressStart == NULL || AddressEnd == NULL ||
NameStart == NULL || NameEnd == NULL)
continue;
*AddressEnd = 0;
*NameEnd = 0;
DPRINT("%s ==> %s\n", NameStart, AddressStart);
if (ParseV4Address(AddressStart, &Address))
{
DPRINT("IP4: %s ==> 0x%08lx\n", AddressStart, Address);
pszHostName = AnsiToUnicode(NameStart);
if (pszHostName != NULL)
{
AddV4HostEntries(pszHostName, Address);
HeapFree(GetProcessHeap(), 0, pszHostName);
}
}
}
fclose(pHostFile);
return TRUE;
}
/* EOF */

View file

@ -2,6 +2,7 @@
#define _DNSRSLVR_PCH_
#include <stdarg.h>
#include <stdio.h>
#define WIN32_NO_STATUS
#define _INC_WINDOWS
@ -9,15 +10,20 @@
#include <windef.h>
#include <winbase.h>
#include <winnls.h>
#include <winreg.h>
#include <winsvc.h>
#include <windns.h>
#include <windns_undoc.h>
#define NTOS_MODE_USER
#include <ndk/rtlfuncs.h>
#include <ndk/obfuncs.h>
#include <dnsrslvr_s.h>
#include <strsafe.h>
typedef struct _RESOLVER_CACHE_ENTRY
{
LIST_ENTRY CacheLink;
@ -37,10 +43,22 @@ VOID DnsIntCacheInitialize(VOID);
VOID DnsIntCacheRemoveEntryItem(PRESOLVER_CACHE_ENTRY CacheEntry);
VOID DnsIntCacheFree(VOID);
VOID DnsIntCacheFlush(VOID);
BOOL DnsIntCacheGetEntryFromName(LPCWSTR Name,
PDNS_RECORDW *Record);
DNS_STATUS
DnsIntCacheGetEntryByName(
LPCWSTR Name,
WORD wType,
DWORD dwFlags,
PDNS_RECORDW *Record);
VOID DnsIntCacheAddEntry(PDNS_RECORDW Record);
BOOL DnsIntCacheRemoveEntryByName(LPCWSTR Name);
/* hostsfile.c */
BOOL
ReadHostsFile(VOID);
#endif /* _DNSRSLVR_PCH_ */

View file

@ -41,30 +41,32 @@ RpcThreadRoutine(LPVOID lpParameter)
return 0;
}
/* Function: 0x04 */
DWORD
__stdcall
R_ResolverFlushCache(
DNSRSLVR_HANDLE pwszServerName)
_In_ DNSRSLVR_HANDLE pwszServerName)
{
DPRINT("R_ResolverFlushCache()\n");
// FIXME Should store (and flush) entries by server handle
DnsIntCacheFlush();
return 0;
return ERROR_SUCCESS;
}
/* Function: 0x07 */
DWORD
__stdcall
R_ResolverQuery(
DNSRSLVR_HANDLE pszServerName,
LPCWSTR pszName,
WORD wType,
DWORD dwFlags,
DWORD *dwRecords,
DNS_RECORDW **ppResultRecords)
_In_ DNSRSLVR_HANDLE pszServerName,
_In_ LPCWSTR pszName,
_In_ WORD wType,
_In_ DWORD dwFlags,
_Inout_ DWORD *dwRecords,
_Out_ DNS_RECORDW **ppResultRecords)
{
PDNS_RECORDW Record;
DNS_STATUS Status;
DNS_STATUS Status = ERROR_SUCCESS;
DPRINT("R_ResolverQuery(%S %S %x %lx %p %p)\n",
pszServerName, pszName, wType, dwFlags, dwRecords, ppResultRecords);
@ -75,22 +77,41 @@ R_ResolverQuery(
if ((dwFlags & DNS_QUERY_WIRE_ONLY) != 0 && (dwFlags & DNS_QUERY_NO_WIRE_QUERY) != 0)
return ERROR_INVALID_PARAMETER;
if (DnsIntCacheGetEntryFromName(pszName, ppResultRecords))
{
DPRINT("DNS cache query successful!\n");
Status = ERROR_SUCCESS;
}
else
if (dwFlags & DNS_QUERY_WIRE_ONLY)
{
DPRINT("DNS query!\n");
Status = Query_Main(pszName,
wType,
dwFlags,
ppResultRecords);
if (Status == ERROR_SUCCESS)
}
else if (dwFlags & DNS_QUERY_NO_WIRE_QUERY)
{
DPRINT("DNS cache query!\n");
Status = DnsIntCacheGetEntryByName(pszName,
wType,
dwFlags,
ppResultRecords);
}
else
{
DPRINT("DNS cache query!\n");
Status = DnsIntCacheGetEntryByName(pszName,
wType,
dwFlags,
ppResultRecords);
if (Status == DNS_INFO_NO_RECORDS)
{
DPRINT("DNS query successful!\n");
DnsIntCacheAddEntry(*ppResultRecords);
DPRINT("DNS query!\n");
Status = Query_Main(pszName,
wType,
dwFlags,
ppResultRecords);
if (Status == ERROR_SUCCESS)
{
DPRINT("DNS query successful!\n");
DnsIntCacheAddEntry(*ppResultRecords);
}
}
}
@ -125,6 +146,6 @@ void __RPC_USER midl_user_free(void __RPC_FAR * ptr)
HeapFree(GetProcessHeap(), 0, ptr);
}
void __RPC_USER WLANSVC_RPC_HANDLE_rundown(DNSRSLVR_HANDLE hClientHandle)
void __RPC_USER DNSRSLVR_RPC_HANDLE_rundown(DNSRSLVR_HANDLE hClientHandle)
{
}

View file

@ -377,97 +377,6 @@ CHAR
return p;
}
HANDLE
OpenNetworkDatabase(LPCWSTR Name)
{
PWSTR ExpandedPath;
PWSTR DatabasePath;
INT ErrorCode;
HKEY DatabaseKey;
DWORD RegType;
DWORD RegSize = 0;
size_t StringLength;
HANDLE ret;
ExpandedPath = HeapAlloc(GetProcessHeap(), 0, MAX_PATH * sizeof(WCHAR));
if (!ExpandedPath)
return INVALID_HANDLE_VALUE;
/* Open the database path key */
ErrorCode = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
L"System\\CurrentControlSet\\Services\\Tcpip\\Parameters",
0,
KEY_READ,
&DatabaseKey);
if (ErrorCode == NO_ERROR)
{
/* Read the actual path */
ErrorCode = RegQueryValueExW(DatabaseKey,
L"DatabasePath",
NULL,
&RegType,
NULL,
&RegSize);
DatabasePath = HeapAlloc(GetProcessHeap(), 0, RegSize);
if (!DatabasePath)
{
HeapFree(GetProcessHeap(), 0, ExpandedPath);
return INVALID_HANDLE_VALUE;
}
/* Read the actual path */
ErrorCode = RegQueryValueExW(DatabaseKey,
L"DatabasePath",
NULL,
&RegType,
(LPBYTE)DatabasePath,
&RegSize);
/* Close the key */
RegCloseKey(DatabaseKey);
/* Expand the name */
ExpandEnvironmentStringsW(DatabasePath, ExpandedPath, MAX_PATH);
HeapFree(GetProcessHeap(), 0, DatabasePath);
}
else
{
/* Use defalt path */
GetSystemDirectoryW(ExpandedPath, MAX_PATH);
StringCchLengthW(ExpandedPath, MAX_PATH, &StringLength);
if (ExpandedPath[StringLength - 1] != L'\\')
{
/* It isn't, so add it ourselves */
StringCchCatW(ExpandedPath, MAX_PATH, L"\\");
}
StringCchCatW(ExpandedPath, MAX_PATH, L"DRIVERS\\ETC\\");
}
/* Make sure that the path is backslash-terminated */
StringCchLengthW(ExpandedPath, MAX_PATH, &StringLength);
if (ExpandedPath[StringLength - 1] != L'\\')
{
/* It isn't, so add it ourselves */
StringCchCatW(ExpandedPath, MAX_PATH, L"\\");
}
/* Add the database name */
StringCchCatW(ExpandedPath, MAX_PATH, Name);
/* Return a handle to the file */
ret = CreateFileW(ExpandedPath,
FILE_READ_DATA,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
HeapFree(GetProcessHeap(), 0, ExpandedPath);
return ret;
}
/* This function is far from perfect but it works enough */
IP4_ADDRESS
@ -609,118 +518,6 @@ again:
return TRUE;
}
/* This function is far from perfect but it works enough */
IP4_ADDRESS
FindEntryInHosts(CONST CHAR * name)
{
BOOL Found = FALSE;
HANDLE HostsFile;
CHAR HostsDBData[BUFSIZ] = { 0 };
PCHAR AddressStr, DnsName = NULL, AddrTerm, NameSt, NextLine, ThisLine, Comment;
UINT ValidData = 0;
DWORD ReadSize;
DWORD Address;
/* Open the network database */
HostsFile = OpenNetworkDatabase(L"hosts");
if (HostsFile == INVALID_HANDLE_VALUE)
{
WSASetLastError(WSANO_RECOVERY);
return 0;
}
while (!Found && ReadFile(HostsFile,
HostsDBData + ValidData,
sizeof(HostsDBData) - ValidData,
&ReadSize,
NULL))
{
ValidData += ReadSize;
ReadSize = 0;
NextLine = ThisLine = HostsDBData;
/* Find the beginning of the next line */
while ((NextLine < HostsDBData + ValidData) &&
(*NextLine != '\r') &&
(*NextLine != '\n'))
{
NextLine++;
}
/* Zero and skip, so we can treat what we have as a string */
if (NextLine > HostsDBData + ValidData)
break;
*NextLine = 0;
NextLine++;
Comment = strchr(ThisLine, '#');
if (Comment)
*Comment = 0; /* Terminate at comment start */
AddressStr = ThisLine;
/* Find the first space separating the IP address from the DNS name */
AddrTerm = strchr(ThisLine, ' ');
if (AddrTerm)
{
/* Terminate the address string */
*AddrTerm = 0;
/* Find the last space before the DNS name */
NameSt = strrchr(ThisLine, ' ');
/* If there is only one space (the one we removed above), then just use the address terminator */
if (!NameSt)
NameSt = AddrTerm;
/* Move from the space to the first character of the DNS name */
NameSt++;
DnsName = NameSt;
if (!stricmp(name, DnsName) || !stricmp(name, AddressStr))
{
Found = TRUE;
break;
}
}
/* Get rid of everything we read so far */
while (NextLine <= HostsDBData + ValidData &&
isspace(*NextLine))
{
NextLine++;
}
if (HostsDBData + ValidData - NextLine <= 0)
break;
memmove(HostsDBData, NextLine, HostsDBData + ValidData - NextLine);
ValidData -= NextLine - HostsDBData;
}
CloseHandle(HostsFile);
if (!Found)
{
WSASetLastError(WSANO_DATA);
return 0;
}
if (strstr(AddressStr, ":"))
{
WSASetLastError(WSAEINVAL);
return 0;
}
if (!ParseV4Address(AddressStr, &Address))
{
WSASetLastError(WSAEINVAL);
return 0;
}
return Address;
}
DNS_STATUS WINAPI
DnsQuery_W(LPCWSTR Name,
@ -858,29 +655,6 @@ Query_Main(LPCWSTR Name,
i++;
}
if ((Options & DNS_QUERY_NO_HOSTS_FILE) == 0)
{
if ((Address = FindEntryInHosts(AnsiName)) != 0)
{
RtlFreeHeap(RtlGetProcessHeap(), 0, AnsiName);
*QueryResultSet = (PDNS_RECORD)RtlAllocateHeap(RtlGetProcessHeap(), 0, sizeof(DNS_RECORD));
if (NULL == *QueryResultSet)
{
return ERROR_OUTOFMEMORY;
}
(*QueryResultSet)->pNext = NULL;
(*QueryResultSet)->wType = Type;
(*QueryResultSet)->wDataLength = sizeof(DNS_A_DATA);
(*QueryResultSet)->Data.A.IpAddress = Address;
(*QueryResultSet)->pName = (LPSTR)xstrsave(Name);
return (*QueryResultSet)->pName ? ERROR_SUCCESS : ERROR_OUTOFMEMORY;
}
}
network_info_result = GetNetworkParams(NULL, &network_info_blen);
network_info = (PFIXED_INFO)RtlAllocateHeap(RtlGetProcessHeap(), 0, (size_t)network_info_blen);
if (NULL == network_info)
@ -1122,7 +896,7 @@ DnsFlushResolverCache(VOID)
return (Status == ERROR_SUCCESS);
}
DNS_STATUS
DWORD
WINAPI
GetCurrentTimeInSeconds(VOID)
{

View file

@ -10,6 +10,9 @@
cpp_quote("#ifndef _WINDNS_INCLUDED_")
#include <windns.h>
cpp_quote("#endif")
cpp_quote("#ifndef _WINDNS_UNDOC_H_")
#include <windns_undoc.h>
cpp_quote("#endif")
typedef [handle, string] LPWSTR DNSRSLVR_HANDLE;

View file

@ -27,7 +27,7 @@ WINAPI
DnsGetCacheDataTable(
_Out_ PDNS_CACHE_ENTRY *DnsCache);
DNS_STATUS
DWORD
WINAPI
GetCurrentTimeInSeconds(VOID);