mirror of
https://github.com/reactos/reactos.git
synced 2025-02-22 16:36:33 +00:00
[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:
parent
fc6e4ed576
commit
305035be7d
6 changed files with 80 additions and 41 deletions
|
@ -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>
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue