https://git.reactos.org/?p=reactos.git;a=commitdiff;h=305035be7d4983eebd769…
commit 305035be7d4983eebd7691b3092e232d497626a4
Author: Eric Kohl <eric.kohl(a)reactos.org>
AuthorDate: Sun Nov 10 15:28:42 2019 +0100
Commit: Eric Kohl <eric.kohl(a)reactos.org>
CommitDate: Sun Nov 10 15:28:42 2019 +0100
[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
---
base/services/dnsrslvr/precomp.h | 1 +
base/services/dnsrslvr/rpcserver.c | 64 +++++++++++++++++-------------------
dll/win32/dnsapi/dnsapi.spec | 3 +-
dll/win32/dnsapi/dnsapi/query.c | 43 +++++++++++++++++++++---
sdk/include/reactos/idl/dnsrslvr.idl | 2 +-
sdk/include/reactos/windns_undoc.h | 8 +++++
6 files changed, 80 insertions(+), 41 deletions(-)
diff --git a/base/services/dnsrslvr/precomp.h b/base/services/dnsrslvr/precomp.h
index 0a11db5ee62..3983d3100a3 100644
--- a/base/services/dnsrslvr/precomp.h
+++ b/base/services/dnsrslvr/precomp.h
@@ -11,6 +11,7 @@
#include <winbase.h>
#include <winsvc.h>
#include <windns.h>
+#include <windns_undoc.h>
#include <ndk/rtlfuncs.h>
#include <ndk/obfuncs.h>
diff --git a/base/services/dnsrslvr/rpcserver.c b/base/services/dnsrslvr/rpcserver.c
index 0cb5c1f8b59..96e398c9b52 100644
--- a/base/services/dnsrslvr/rpcserver.c
+++ b/base/services/dnsrslvr/rpcserver.c
@@ -45,6 +45,8 @@ DWORD
R_ResolverFlushCache(
DNSRSLVR_HANDLE pwszServerName)
{
+ DPRINT("R_ResolverFlushCache()\n");
+
// FIXME Should store (and flush) entries by server handle
DnsIntCacheFlush();
return 0;
@@ -52,65 +54,61 @@ R_ResolverFlushCache(
DWORD
R_ResolverQuery(
- DNSRSLVR_HANDLE pwszServerName,
- LPCWSTR pwsName,
+ DNSRSLVR_HANDLE pszServerName,
+ LPCWSTR pszName,
WORD wType,
- DWORD Flags,
+ DWORD dwFlags,
DWORD *dwRecords,
DNS_RECORDW **ppResultRecords)
{
-#if 0
- DNS_QUERY_REQUEST QueryRequest = { 0 };
- DNS_QUERY_RESULT QueryResults = { 0 };
-#endif
- DNS_STATUS Status;
- PDNS_RECORDW Record;
+ PDNS_RECORDW Record;
+ DNS_STATUS Status;
+
+ DPRINT("R_ResolverQuery(%S %S %x %lx %p %p)\n",
+ pszServerName, pszName, wType, dwFlags, dwRecords, ppResultRecords);
- DPRINT1("R_ResolverQuery %p %p %x %lx %p %p\n",
- pwszServerName, pwsName, wType, Flags, dwRecords, ppResultRecords);
+ if (pszName == NULL || wType == 0 || ppResultRecords == NULL)
+ return ERROR_INVALID_PARAMETER;
- if (!pwszServerName || !pwsName || !wType || !ppResultRecords)
+ if ((dwFlags & DNS_QUERY_WIRE_ONLY) != 0 && (dwFlags &
DNS_QUERY_NO_WIRE_QUERY) != 0)
return ERROR_INVALID_PARAMETER;
- // FIXME Should lookup entries by server handle
- if (DnsIntCacheGetEntryFromName(pwsName, ppResultRecords))
+ if (DnsIntCacheGetEntryFromName(pszName, ppResultRecords))
{
+ DPRINT("DNS cache query successful!\n");
Status = ERROR_SUCCESS;
}
else
{
-#if 0
- QueryRequest.Version = DNS_QUERY_REQUEST_VERSION1;
- QueryRequest.QueryType = wType;
- QueryRequest.QueryName = pwsName;
- QueryRequest.QueryOptions = Flags;
- QueryResults.Version = DNS_QUERY_REQUEST_VERSION1;
-
- Status = DnsQueryEx(&QueryRequest, &QueryResults, NULL);
+ DPRINT("DNS query!\n");
+ Status = Query_Main(pszName,
+ wType,
+ dwFlags,
+ ppResultRecords);
if (Status == ERROR_SUCCESS)
{
- // FIXME Should store (and flush) entries by server handle
- DnsIntCacheAddEntry(QueryResults.pQueryRecords);
- *ppResultRecords = QueryResults.pQueryRecords;
+ DPRINT("DNS query successful!\n");
+ DnsIntCacheAddEntry(*ppResultRecords);
}
-#endif
}
if (dwRecords)
+ {
*dwRecords = 0;
- if (Status == ERROR_SUCCESS)
- {
- Record = *ppResultRecords;
- while (Record)
+ if (Status == ERROR_SUCCESS)
{
- if (dwRecords)
+ Record = *ppResultRecords;
+ while (Record)
+ {
+ DPRINT("Record: %S\n", Record->pName);
(*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;
}
diff --git a/dll/win32/dnsapi/dnsapi.spec b/dll/win32/dnsapi/dnsapi.spec
index bb69e12d333..afc309e83bc 100644
--- a/dll/win32/dnsapi/dnsapi.spec
+++ b/dll/win32/dnsapi/dnsapi.spec
@@ -82,7 +82,6 @@
@ stdcall DnsNameCompareEx_W()
@ stdcall DnsNameCompare_A(str str)
@ stdcall DnsNameCompare_W(wstr wstr)
-
@ stdcall DnsNameCopy()
@ stdcall DnsNameCopyAllocate()
@ stdcall DnsNotifyResolver()
@@ -188,5 +187,5 @@
@ stub NetInfo_IsForUpdate
@ stub NetInfo_ResetServerPriorities
@ stub QueryDirectEx
-@ stub Query_Main
+@ stdcall Query_Main(wstr long long ptr)
@ stub Reg_ReadGlobalsEx
diff --git a/dll/win32/dnsapi/dnsapi/query.c b/dll/win32/dnsapi/dnsapi/query.c
index bc89c8d8ad8..d830e26f4a0 100644
--- a/dll/win32/dnsapi/dnsapi/query.c
+++ b/dll/win32/dnsapi/dnsapi/query.c
@@ -164,7 +164,7 @@ DnsQuery_CodePage(UINT CodePage,
PWCHAR Buffer;
DNS_STATUS Status;
PDNS_RECORD QueryResultWide;
- PDNS_RECORD ConvertedRecord = NULL, LastRecord = NULL;
+ PDNS_RECORD ConvertedRecord = 0, LastRecord = 0;
if (Name == NULL)
return ERROR_INVALID_PARAMETER;
@@ -309,7 +309,7 @@ DnsQuery_CodePage(UINT CodePage,
}
if (LastRecord)
- LastRecord->pNext = NULL;
+ LastRecord->pNext = 0;
/* The name */
RtlFreeHeap(RtlGetProcessHeap(), 0, Buffer);
@@ -729,6 +729,41 @@ DnsQuery_W(LPCWSTR Name,
PVOID Extra,
PDNS_RECORD *QueryResultSet,
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;
int quflags = (Options & DNS_QUERY_NO_RECURSION) == 0 ? adns_qf_search : 0;
@@ -750,10 +785,8 @@ DnsQuery_W(LPCWSTR Name,
return ERROR_INVALID_PARAMETER;
if (QueryResultSet == NULL)
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)
{
diff --git a/sdk/include/reactos/idl/dnsrslvr.idl b/sdk/include/reactos/idl/dnsrslvr.idl
index 787e5c71267..ce0514557a6 100644
--- a/sdk/include/reactos/idl/dnsrslvr.idl
+++ b/sdk/include/reactos/idl/dnsrslvr.idl
@@ -53,7 +53,7 @@ interface DnsResolver
[in] WORD wType,
[in] DWORD Flags,
[in][out] DWORD *dwRecords,
- [out][ref] DNS_RECORDW** ppResultRecords);
+ [out] DNS_RECORDW **ppResultRecords);
/* Function: 0x08 */
/* R_ResolverEnumCache */
diff --git a/sdk/include/reactos/windns_undoc.h b/sdk/include/reactos/windns_undoc.h
index cb2e5abdbe4..56cc56d205c 100644
--- a/sdk/include/reactos/windns_undoc.h
+++ b/sdk/include/reactos/windns_undoc.h
@@ -31,6 +31,14 @@ DNS_STATUS
WINAPI
GetCurrentTimeInSeconds(VOID);
+DNS_STATUS
+WINAPI
+Query_Main(
+ LPCWSTR Name,
+ WORD Type,
+ DWORD Options,
+ PDNS_RECORD *QueryResultSet);
+
#endif /* __WIDL__ */
#ifdef __cplusplus