https://git.reactos.org/?p=reactos.git;a=commitdiff;h=305035be7d4983eebd7691...
commit 305035be7d4983eebd7691b3092e232d497626a4 Author: Eric Kohl eric.kohl@reactos.org AuthorDate: Sun Nov 10 15:28:42 2019 +0100 Commit: Eric Kohl eric.kohl@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