https://git.reactos.org/?p=reactos.git;a=commitdiff;h=894cc4ac0c9448d5502a3e8e7d37ff7a6512ea71

commit 894cc4ac0c9448d5502a3e8e7d37ff7a6512ea71
Author:     Eric Kohl <eric.k...@reactos.org>
AuthorDate: Mon May 24 14:43:30 2021 +0200
Commit:     Eric Kohl <eric.k...@reactos.org>
CommitDate: Mon May 24 14:43:30 2021 +0200

    [dnsapi][dnsrslvr] Implement DnsFlushResolverCacheEntry_A/_UTF8/_W
---
 base/services/dnsrslvr/cache.c       | 45 ++++++++++++++++
 base/services/dnsrslvr/precomp.h     |  5 ++
 base/services/dnsrslvr/rpcserver.c   | 22 +++++++-
 dll/win32/dnsapi/dnsapi.spec         |  4 +-
 dll/win32/dnsapi/query.c             | 99 ++++++++++++++++++++++++++++++++++++
 dll/win32/dnsapi/stubs.c             | 22 --------
 sdk/include/reactos/idl/dnsrslvr.idl |  7 ++-
 7 files changed, 177 insertions(+), 27 deletions(-)

diff --git a/base/services/dnsrslvr/cache.c b/base/services/dnsrslvr/cache.c
index b232989f372..c3be82ccde5 100644
--- a/base/services/dnsrslvr/cache.c
+++ b/base/services/dnsrslvr/cache.c
@@ -101,6 +101,51 @@ DnsIntCacheFlush(
     return ERROR_SUCCESS;
 }
 
+
+DNS_STATUS
+DnsIntFlushCacheEntry(
+    _In_ LPCWSTR pszName,
+    _In_ WORD wType)
+{
+    PLIST_ENTRY Entry, NextEntry;
+    PRESOLVER_CACHE_ENTRY CacheEntry;
+
+    DPRINT("DnsIntFlushCacheEntry(%S %x)\n", pszName, wType);
+
+    /* Lock the cache */
+    DnsCacheLock();
+
+    /* Loop every entry */
+    Entry = DnsCache.RecordList.Flink;
+    while (Entry != &DnsCache.RecordList)
+    {
+        NextEntry = Entry->Flink;
+
+        /* Get this entry */
+        CacheEntry = CONTAINING_RECORD(Entry, RESOLVER_CACHE_ENTRY, CacheLink);
+
+        /* Remove it from the list */
+        if ((_wcsicmp(CacheEntry->Record->pName, pszName) == 0) &&
+            (CacheEntry->bHostsFileEntry == FALSE))
+        {
+            if ((wType == DNS_TYPE_ANY) ||
+                (CacheEntry->Record->wType == wType))
+            {
+                DnsIntCacheRemoveEntryItem(CacheEntry);
+            }
+        }
+
+        /* Move to the next entry */
+        Entry = NextEntry;
+    }
+
+    /* Unlock the cache */
+    DnsCacheUnlock();
+
+    return ERROR_SUCCESS;
+}
+
+
 DNS_STATUS
 DnsIntCacheGetEntryByName(
     LPCWSTR Name,
diff --git a/base/services/dnsrslvr/precomp.h b/base/services/dnsrslvr/precomp.h
index 2b7e5f35dd6..ac355a9f06f 100644
--- a/base/services/dnsrslvr/precomp.h
+++ b/base/services/dnsrslvr/precomp.h
@@ -52,6 +52,11 @@ DNS_STATUS
 DnsIntCacheFlush(
     _In_ ULONG ulFlags);
 
+DNS_STATUS
+DnsIntFlushCacheEntry(
+    _In_ LPCWSTR pszName,
+    _In_ WORD wType);
+
 DNS_STATUS
 DnsIntCacheGetEntryByName(
     LPCWSTR Name,
diff --git a/base/services/dnsrslvr/rpcserver.c 
b/base/services/dnsrslvr/rpcserver.c
index 59e91cb4791..550e98786b1 100644
--- a/base/services/dnsrslvr/rpcserver.c
+++ b/base/services/dnsrslvr/rpcserver.c
@@ -60,15 +60,33 @@ CRrReadCache(
 DWORD
 __stdcall
 R_ResolverFlushCache(
-    _In_ DNSRSLVR_HANDLE pwszServerName)
+    _In_ DNSRSLVR_HANDLE pszServerName)
 {
     DPRINT("R_ResolverFlushCache(%S)\n",
-           pwszServerName);
+           pszServerName);
 
     return DnsIntCacheFlush(CACHE_FLUSH_NON_HOSTS_FILE_ENTRIES);
 }
 
 
+/* Function: 0x05 */
+DWORD
+__stdcall
+R_ResolverFlushCacheEntry(
+    _In_ DNSRSLVR_HANDLE pszServerName,
+    _In_ LPCWSTR pszName,
+    _In_ WORD wType)
+{
+    DPRINT("R_ResolverFlushCacheEntry(%S %S %x)\n",
+           pszServerName, pszName, wType);
+
+    if (pszName == NULL)
+        return ERROR_INVALID_PARAMETER;
+
+    return DnsIntFlushCacheEntry(pszName, wType);
+}
+
+
 /* Function: 0x07 */
 DWORD
 __stdcall
diff --git a/dll/win32/dnsapi/dnsapi.spec b/dll/win32/dnsapi/dnsapi.spec
index afc309e83bc..1b72ea192ca 100644
--- a/dll/win32/dnsapi/dnsapi.spec
+++ b/dll/win32/dnsapi/dnsapi.spec
@@ -39,8 +39,8 @@
 @ stdcall DnsFindAuthoritativeZone()
 @ stdcall DnsFlushResolverCache()
 @ stdcall DnsFlushResolverCacheEntry_A(str)
-@ stdcall DnsFlushResolverCacheEntry_UTF8()
-@ stdcall DnsFlushResolverCacheEntry_W()
+@ stdcall DnsFlushResolverCacheEntry_UTF8(str)
+@ stdcall DnsFlushResolverCacheEntry_W(wstr)
 @ stdcall DnsFree(ptr long)
 @ stdcall DnsFreeAdapterInformation()
 @ stub DnsFreeConfigStructure
diff --git a/dll/win32/dnsapi/query.c b/dll/win32/dnsapi/query.c
index 6dbe665473e..8006a3f60bd 100644
--- a/dll/win32/dnsapi/query.c
+++ b/dll/win32/dnsapi/query.c
@@ -951,6 +951,105 @@ DnsFlushResolverCache(VOID)
     return (Status == ERROR_SUCCESS);
 }
 
+
+BOOL
+WINAPI
+DnsFlushResolverCacheEntry_A(
+    _In_ LPCSTR pszEntry)
+{
+    DNS_STATUS Status = ERROR_SUCCESS;
+    LPWSTR pszUnicodeEntry;
+
+    DPRINT1("DnsFlushResolverCacheEntry_A(%s)\n", pszEntry);
+
+    if (pszEntry == NULL)
+        return FALSE;
+
+    pszUnicodeEntry = DnsCToW(pszEntry);
+    if (pszUnicodeEntry == NULL)
+        return FALSE;
+
+    RpcTryExcept
+    {
+        Status = R_ResolverFlushCacheEntry(NULL, pszUnicodeEntry, 
DNS_TYPE_ANY);
+        DPRINT("R_ResolverFlushCacheEntry() returned %lu\n", Status);
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        Status = RpcExceptionCode();
+        DPRINT("Exception returned %lu\n", Status);
+    }
+    RpcEndExcept;
+
+    RtlFreeHeap(RtlGetProcessHeap(), 0, pszUnicodeEntry);
+
+    return (Status == ERROR_SUCCESS);
+}
+
+
+BOOL
+WINAPI
+DnsFlushResolverCacheEntry_UTF8(
+    _In_ LPCSTR pszEntry)
+{
+    DNS_STATUS Status = ERROR_SUCCESS;
+    LPWSTR pszUnicodeEntry;
+
+    DPRINT1("DnsFlushResolverCacheEntry_UTF8(%s)\n", pszEntry);
+
+    if (pszEntry == NULL)
+        return FALSE;
+
+    pszUnicodeEntry = DnsCToW(pszEntry);
+    if (pszUnicodeEntry == NULL)
+        return FALSE;
+
+    RpcTryExcept
+    {
+        Status = R_ResolverFlushCacheEntry(NULL, pszUnicodeEntry, 
DNS_TYPE_ANY);
+        DPRINT("R_ResolverFlushCacheEntry() returned %lu\n", Status);
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        Status = RpcExceptionCode();
+        DPRINT("Exception returned %lu\n", Status);
+    }
+    RpcEndExcept;
+
+    RtlFreeHeap(RtlGetProcessHeap(), 0, pszUnicodeEntry);
+
+    return (Status == ERROR_SUCCESS);
+}
+
+
+BOOL
+WINAPI
+DnsFlushResolverCacheEntry_W(
+    _In_ LPCWSTR pszEntry)
+{
+    DNS_STATUS Status = ERROR_SUCCESS;
+
+    DPRINT1("DnsFlushResolverCacheEntry_W(%S)\n", pszEntry);
+
+    if (pszEntry == NULL)
+        return FALSE;
+
+    RpcTryExcept
+    {
+        Status = R_ResolverFlushCacheEntry(NULL, pszEntry, DNS_TYPE_ANY);
+        DPRINT("R_ResolverFlushCacheEntry() returned %lu\n", Status);
+    }
+    RpcExcept(EXCEPTION_EXECUTE_HANDLER)
+    {
+        Status = RpcExceptionCode();
+        DPRINT("Exception returned %lu\n", Status);
+    }
+    RpcEndExcept;
+
+    return (Status == ERROR_SUCCESS);
+}
+
+
 BOOL
 WINAPI
 DnsGetCacheDataTable(
diff --git a/dll/win32/dnsapi/stubs.c b/dll/win32/dnsapi/stubs.c
index 7d946ababfa..313792facda 100644
--- a/dll/win32/dnsapi/stubs.c
+++ b/dll/win32/dnsapi/stubs.c
@@ -216,28 +216,6 @@ DnsFindAuthoritativeZone()
     return ERROR_OUTOFMEMORY;
 }
 
-BOOL WINAPI
-DnsFlushResolverCacheEntry_A(PCSTR entry)
-{
-    DPRINT1("DnsFlushResolverCacheEntry_A(%s) is stubplemented.\n", entry);
-    if (!entry) return FALSE;
-    return TRUE;
-}
-
-DNS_STATUS WINAPI
-DnsFlushResolverCacheEntry_UTF8()
-{
-    UNIMPLEMENTED;
-    return ERROR_OUTOFMEMORY;
-}
-
-DNS_STATUS WINAPI
-DnsFlushResolverCacheEntry_W()
-{
-    UNIMPLEMENTED;
-    return ERROR_OUTOFMEMORY;
-}
-
 DNS_STATUS WINAPI
 DnsFreeAdapterInformation()
 {
diff --git a/sdk/include/reactos/idl/dnsrslvr.idl 
b/sdk/include/reactos/idl/dnsrslvr.idl
index 91cad5a52eb..ce4d3af41ae 100644
--- a/sdk/include/reactos/idl/dnsrslvr.idl
+++ b/sdk/include/reactos/idl/dnsrslvr.idl
@@ -50,7 +50,12 @@ interface DnsResolver
         [in, unique, string] DNSRSLVR_HANDLE pwszServerName);
 
     /* Function: 0x05 */
-    /* R_ResolverFlushCacheEntry */
+    DWORD
+    __stdcall
+    R_ResolverFlushCacheEntry(
+        [in, unique, string] DNSRSLVR_HANDLE pwszServerName,
+        [in, string] LPCWSTR pszName,
+        [in] WORD wType);
 
     /* Function: 0x06 */
     /* R_ResolverRegisterCluster */

Reply via email to