如何清除/刷新Win32 API中的DNS缓存

时间:2018-08-24 15:14:23

标签: winapi dns

我正在寻找一种以编程方式清除/刷新本地win32 dns缓存的方法(相当于调用“ ipconfig / flushdns”)。

有一些方法可以使用winsock.dll中的隐藏API来执行此操作,但是winsock.dll不再是Windows的一部分,因此该方法将不再起作用。

有人知道现在应该怎么做吗?

1 个答案:

答案 0 :(得分:5)

  • 使用Dependency Walker
  • 检查 ipconfig.exe 的依赖项
  • 在其中找到 dnsapi.dll
  • 检查了其导出的功能,并找到了 DnsFlushResolverCache
  • 几乎没有浏览过网络并找到了其签名(仅在官方网站[MS.Docs]: Windows 8 API Sets上找到了类似的引用),这意味着它不是公开的,因此软件依赖于此,不够健壮
  • 创建了一个小型测试程序

test.c

#include <stdio.h>
#include <Windows.h>

typedef BOOL (WINAPI *DnsFlushResolverCacheFuncPtr)();


int main() {
    HMODULE dnsapi = LoadLibrary("dnsapi.dll");
    if (dnsapi == NULL) {
        printf("Failed loading module: %d\n", GetLastError());
        return -1;
    }
    DnsFlushResolverCacheFuncPtr DnsFlushResolverCache = (DnsFlushResolverCacheFuncPtr)GetProcAddress(dnsapi, "DnsFlushResolverCache");
    if (DnsFlushResolverCache == NULL) {
        printf("Failed loading function: %d\n", GetLastError());
        FreeLibrary(dnsapi);
        return -2;
    }
    BOOL result = DnsFlushResolverCache();
    if (result) {
        printf("DnsFlushResolverCache succeeded\n");
    } else {
        printf("DnsFlushResolverCache succeeded: %d\n", GetLastError());
    }
    FreeLibrary(dnsapi);
    return 0;
}

输出

e:\Work\Dev\StackOverflow\q052007372>"c:\Install\x86\Microsoft\Visual Studio Community\2015\vc\vcvarsall.bat" x64

e:\Work\Dev\StackOverflow\q052007372>dir /b
dnsapi_func_list.txt
test.c

e:\Work\Dev\StackOverflow\q052007372>cl /nologo test.c  /link /OUT:test.exe
test.c

e:\Work\Dev\StackOverflow\q052007372>dir /b
dnsapi_func_list.txt
test.c
test.exe
test.obj

e:\Work\Dev\StackOverflow\q052007372>test.exe
DnsFlushResolverCache succeeded

注意:即使函数调用成功完成,我也不确定如何检查它是否完成了应该做的事情(或更妙的是:它的名字暗示它应该做的事情,这似乎可以满足您的需求)。
让我知道它是如何工作的。

@ EDIT0

感谢您的信息@TimJohnson!我急于查看ipconfig /?[MS.Docs]: ipconfig)的输出(我在另一个 cmd 窗口:d中有此输出),并注意到该选项:)。
可以运行(缓存已大量更新,运行程序前后我可以看到差异)!