[DNSRSLVR][DNSAPI] Enable the DNS resolver cache

- Fix the IDL file to return DNS records properly
- Reroute the DNS query call path: DNSQuery->R_ResolverQuery->Query_Main

DNS records get cached and 'ipconfig /flushdns' works as expected.

CORE-12159
This commit is contained in:
Eric Kohl 2019-11-10 15:28:42 +01:00
parent fc6e4ed576
commit 305035be7d
6 changed files with 80 additions and 41 deletions

View file

@ -11,6 +11,7 @@
#include <winbase.h> #include <winbase.h>
#include <winsvc.h> #include <winsvc.h>
#include <windns.h> #include <windns.h>
#include <windns_undoc.h>
#include <ndk/rtlfuncs.h> #include <ndk/rtlfuncs.h>
#include <ndk/obfuncs.h> #include <ndk/obfuncs.h>

View file

@ -45,6 +45,8 @@ DWORD
R_ResolverFlushCache( R_ResolverFlushCache(
DNSRSLVR_HANDLE pwszServerName) DNSRSLVR_HANDLE pwszServerName)
{ {
DPRINT("R_ResolverFlushCache()\n");
// FIXME Should store (and flush) entries by server handle // FIXME Should store (and flush) entries by server handle
DnsIntCacheFlush(); DnsIntCacheFlush();
return 0; return 0;
@ -52,65 +54,61 @@ R_ResolverFlushCache(
DWORD DWORD
R_ResolverQuery( R_ResolverQuery(
DNSRSLVR_HANDLE pwszServerName, DNSRSLVR_HANDLE pszServerName,
LPCWSTR pwsName, LPCWSTR pszName,
WORD wType, WORD wType,
DWORD Flags, DWORD dwFlags,
DWORD *dwRecords, DWORD *dwRecords,
DNS_RECORDW **ppResultRecords) DNS_RECORDW **ppResultRecords)
{ {
#if 0 PDNS_RECORDW Record;
DNS_QUERY_REQUEST QueryRequest = { 0 }; DNS_STATUS Status;
DNS_QUERY_RESULT QueryResults = { 0 };
#endif
DNS_STATUS Status;
PDNS_RECORDW Record;
DPRINT1("R_ResolverQuery %p %p %x %lx %p %p\n", DPRINT("R_ResolverQuery(%S %S %x %lx %p %p)\n",
pwszServerName, pwsName, wType, Flags, dwRecords, ppResultRecords); pszServerName, pszName, wType, dwFlags, dwRecords, ppResultRecords);
if (!pwszServerName || !pwsName || !wType || !ppResultRecords) if (pszName == NULL || wType == 0 || ppResultRecords == NULL)
return ERROR_INVALID_PARAMETER; return ERROR_INVALID_PARAMETER;
// FIXME Should lookup entries by server handle if ((dwFlags & DNS_QUERY_WIRE_ONLY) != 0 && (dwFlags & DNS_QUERY_NO_WIRE_QUERY) != 0)
if (DnsIntCacheGetEntryFromName(pwsName, ppResultRecords)) return ERROR_INVALID_PARAMETER;
if (DnsIntCacheGetEntryFromName(pszName, ppResultRecords))
{ {
DPRINT("DNS cache query successful!\n");
Status = ERROR_SUCCESS; Status = ERROR_SUCCESS;
} }
else else
{ {
#if 0 DPRINT("DNS query!\n");
QueryRequest.Version = DNS_QUERY_REQUEST_VERSION1; Status = Query_Main(pszName,
QueryRequest.QueryType = wType; wType,
QueryRequest.QueryName = pwsName; dwFlags,
QueryRequest.QueryOptions = Flags; ppResultRecords);
QueryResults.Version = DNS_QUERY_REQUEST_VERSION1;
Status = DnsQueryEx(&QueryRequest, &QueryResults, NULL);
if (Status == ERROR_SUCCESS) if (Status == ERROR_SUCCESS)
{ {
// FIXME Should store (and flush) entries by server handle DPRINT("DNS query successful!\n");
DnsIntCacheAddEntry(QueryResults.pQueryRecords); DnsIntCacheAddEntry(*ppResultRecords);
*ppResultRecords = QueryResults.pQueryRecords;
} }
#endif
} }
if (dwRecords) if (dwRecords)
{
*dwRecords = 0; *dwRecords = 0;
if (Status == ERROR_SUCCESS) if (Status == ERROR_SUCCESS)
{
Record = *ppResultRecords;
while (Record)
{ {
if (dwRecords) Record = *ppResultRecords;
while (Record)
{
DPRINT("Record: %S\n", Record->pName);
(*dwRecords)++; (*dwRecords)++;
Record = Record->pNext; Record = Record->pNext;
}
} }
} }
DPRINT1("R_ResolverQuery result %ld %ld\n", Status, *dwRecords); DPRINT("R_ResolverQuery result %ld %ld\n", Status, *dwRecords);
return Status; return Status;
} }

View file

@ -82,7 +82,6 @@
@ stdcall DnsNameCompareEx_W() @ stdcall DnsNameCompareEx_W()
@ stdcall DnsNameCompare_A(str str) @ stdcall DnsNameCompare_A(str str)
@ stdcall DnsNameCompare_W(wstr wstr) @ stdcall DnsNameCompare_W(wstr wstr)
@ stdcall DnsNameCopy() @ stdcall DnsNameCopy()
@ stdcall DnsNameCopyAllocate() @ stdcall DnsNameCopyAllocate()
@ stdcall DnsNotifyResolver() @ stdcall DnsNotifyResolver()
@ -188,5 +187,5 @@
@ stub NetInfo_IsForUpdate @ stub NetInfo_IsForUpdate
@ stub NetInfo_ResetServerPriorities @ stub NetInfo_ResetServerPriorities
@ stub QueryDirectEx @ stub QueryDirectEx
@ stub Query_Main @ stdcall Query_Main(wstr long long ptr)
@ stub Reg_ReadGlobalsEx @ stub Reg_ReadGlobalsEx

View file

@ -164,7 +164,7 @@ DnsQuery_CodePage(UINT CodePage,
PWCHAR Buffer; PWCHAR Buffer;
DNS_STATUS Status; DNS_STATUS Status;
PDNS_RECORD QueryResultWide; PDNS_RECORD QueryResultWide;
PDNS_RECORD ConvertedRecord = NULL, LastRecord = NULL; PDNS_RECORD ConvertedRecord = 0, LastRecord = 0;
if (Name == NULL) if (Name == NULL)
return ERROR_INVALID_PARAMETER; return ERROR_INVALID_PARAMETER;
@ -309,7 +309,7 @@ DnsQuery_CodePage(UINT CodePage,
} }
if (LastRecord) if (LastRecord)
LastRecord->pNext = NULL; LastRecord->pNext = 0;
/* The name */ /* The name */
RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer); RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
@ -729,6 +729,41 @@ DnsQuery_W(LPCWSTR Name,
PVOID Extra, PVOID Extra,
PDNS_RECORD *QueryResultSet, PDNS_RECORD *QueryResultSet,
PVOID *Reserved) PVOID *Reserved)
{
DWORD dwRecords = 0;
DNS_STATUS Status = ERROR_SUCCESS;
DPRINT("DnsQuery_W()\n");
*QueryResultSet = NULL;
RpcTryExcept
{
Status = R_ResolverQuery(NULL,
Name,
Type,
Options,
&dwRecords,
(DNS_RECORDW **)QueryResultSet);
DPRINT("R_ResolverQuery() returned %lu\n", Status);
}
RpcExcept(EXCEPTION_EXECUTE_HANDLER)
{
Status = RpcExceptionCode();
DPRINT("Exception returned %lu\n", Status);
}
RpcEndExcept;
return Status;
}
DNS_STATUS
WINAPI
Query_Main(LPCWSTR Name,
WORD Type,
DWORD Options,
PDNS_RECORD *QueryResultSet)
{ {
adns_state astate; adns_state astate;
int quflags = (Options & DNS_QUERY_NO_RECURSION) == 0 ? adns_qf_search : 0; int quflags = (Options & DNS_QUERY_NO_RECURSION) == 0 ? adns_qf_search : 0;
@ -750,10 +785,8 @@ DnsQuery_W(LPCWSTR Name,
return ERROR_INVALID_PARAMETER; return ERROR_INVALID_PARAMETER;
if (QueryResultSet == NULL) if (QueryResultSet == NULL)
return ERROR_INVALID_PARAMETER; return ERROR_INVALID_PARAMETER;
if ((Options & DNS_QUERY_WIRE_ONLY) != 0 && (Options & DNS_QUERY_NO_WIRE_QUERY) != 0)
return ERROR_INVALID_PARAMETER;
*QueryResultSet = 0; *QueryResultSet = NULL;
switch (Type) switch (Type)
{ {

View file

@ -53,7 +53,7 @@ interface DnsResolver
[in] WORD wType, [in] WORD wType,
[in] DWORD Flags, [in] DWORD Flags,
[in][out] DWORD *dwRecords, [in][out] DWORD *dwRecords,
[out][ref] DNS_RECORDW** ppResultRecords); [out] DNS_RECORDW **ppResultRecords);
/* Function: 0x08 */ /* Function: 0x08 */
/* R_ResolverEnumCache */ /* R_ResolverEnumCache */

View file

@ -31,6 +31,14 @@ DNS_STATUS
WINAPI WINAPI
GetCurrentTimeInSeconds(VOID); GetCurrentTimeInSeconds(VOID);
DNS_STATUS
WINAPI
Query_Main(
LPCWSTR Name,
WORD Type,
DWORD Options,
PDNS_RECORD *QueryResultSet);
#endif /* __WIDL__ */ #endif /* __WIDL__ */
#ifdef __cplusplus #ifdef __cplusplus