[dnsapi][dnsrslvr] Implement DnsFlushResolverCacheEntry_A/_UTF8/_W

This commit is contained in:
Eric Kohl 2021-05-24 14:43:30 +02:00
parent b232efe12a
commit 894cc4ac0c
7 changed files with 177 additions and 27 deletions

View file

@ -101,6 +101,51 @@ DnsIntCacheFlush(
return ERROR_SUCCESS; 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 DNS_STATUS
DnsIntCacheGetEntryByName( DnsIntCacheGetEntryByName(
LPCWSTR Name, LPCWSTR Name,

View file

@ -52,6 +52,11 @@ DNS_STATUS
DnsIntCacheFlush( DnsIntCacheFlush(
_In_ ULONG ulFlags); _In_ ULONG ulFlags);
DNS_STATUS
DnsIntFlushCacheEntry(
_In_ LPCWSTR pszName,
_In_ WORD wType);
DNS_STATUS DNS_STATUS
DnsIntCacheGetEntryByName( DnsIntCacheGetEntryByName(
LPCWSTR Name, LPCWSTR Name,

View file

@ -60,15 +60,33 @@ CRrReadCache(
DWORD DWORD
__stdcall __stdcall
R_ResolverFlushCache( R_ResolverFlushCache(
_In_ DNSRSLVR_HANDLE pwszServerName) _In_ DNSRSLVR_HANDLE pszServerName)
{ {
DPRINT("R_ResolverFlushCache(%S)\n", DPRINT("R_ResolverFlushCache(%S)\n",
pwszServerName); pszServerName);
return DnsIntCacheFlush(CACHE_FLUSH_NON_HOSTS_FILE_ENTRIES); 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 */ /* Function: 0x07 */
DWORD DWORD
__stdcall __stdcall

View file

@ -39,8 +39,8 @@
@ stdcall DnsFindAuthoritativeZone() @ stdcall DnsFindAuthoritativeZone()
@ stdcall DnsFlushResolverCache() @ stdcall DnsFlushResolverCache()
@ stdcall DnsFlushResolverCacheEntry_A(str) @ stdcall DnsFlushResolverCacheEntry_A(str)
@ stdcall DnsFlushResolverCacheEntry_UTF8() @ stdcall DnsFlushResolverCacheEntry_UTF8(str)
@ stdcall DnsFlushResolverCacheEntry_W() @ stdcall DnsFlushResolverCacheEntry_W(wstr)
@ stdcall DnsFree(ptr long) @ stdcall DnsFree(ptr long)
@ stdcall DnsFreeAdapterInformation() @ stdcall DnsFreeAdapterInformation()
@ stub DnsFreeConfigStructure @ stub DnsFreeConfigStructure

View file

@ -951,6 +951,105 @@ DnsFlushResolverCache(VOID)
return (Status == ERROR_SUCCESS); 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 BOOL
WINAPI WINAPI
DnsGetCacheDataTable( DnsGetCacheDataTable(

View file

@ -216,28 +216,6 @@ DnsFindAuthoritativeZone()
return ERROR_OUTOFMEMORY; 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 DNS_STATUS WINAPI
DnsFreeAdapterInformation() DnsFreeAdapterInformation()
{ {

View file

@ -50,7 +50,12 @@ interface DnsResolver
[in, unique, string] DNSRSLVR_HANDLE pwszServerName); [in, unique, string] DNSRSLVR_HANDLE pwszServerName);
/* Function: 0x05 */ /* Function: 0x05 */
/* R_ResolverFlushCacheEntry */ DWORD
__stdcall
R_ResolverFlushCacheEntry(
[in, unique, string] DNSRSLVR_HANDLE pwszServerName,
[in, string] LPCWSTR pszName,
[in] WORD wType);
/* Function: 0x06 */ /* Function: 0x06 */
/* R_ResolverRegisterCluster */ /* R_ResolverRegisterCluster */