GetInterfaceDnsSettings不兼容*mut DNS_INTERFACE_SETTINGS3及ServerProperties获取问题
从DNS_INTERFACE_SETTINGS3获取ServerProperties成员的问题
问题背景
我尝试从DNS_INTERFACE_SETTINGS3结构体中获取ServerProperties成员,根据官方文档说明,需调用GetInterfaceDnsSettings函数,且当Settings参数的Version成员设为3时,底层结构体应为DNS_INTERFACE_SETTINGS3。
遇到的问题
- 编译类型不匹配:调用函数时提示预期原始指针
*mut DNS_INTERFACE_SETTINGS,但实际传入的是*mut DNS_INTERFACE_SETTINGS3;手动做类型转换后编译通过,但出现第二个问题。 - 字段值异常:在已配置DNS over HTTPS的Windows 11 WiFi适配器上,
cServerProperties成员值始终为0,不符合预期。
代码示例
// 注:GUID是通过GetAdaptersAddresses获取并从LUID转换而来,已验证为有效值 let mut dns_interface_settings: DNS_INTERFACE_SETTINGS3 = Default::default(); dns_interface_settings.Version = DNS_INTERFACE_SETTINGS_VERSION3; // 编译错误:预期`*mut DNS_INTERFACE_SETTINGS`,实际为`*mut DNS_INTERFACE_SETTINGS3` let dns_setting_result = GetInterfaceDnsSettings(guid, &mut dns_interface_settings as *mut DNS_INTERFACE_SETTINGS3); // 手动类型转换后编译通过,但cServerProperties值为0 let dns_setting_result = GetInterfaceDnsSettings(guid, &mut dns_interface_settings as *mut _ as *mut DNS_INTERFACE_SETTINGS);
官方文档核心说明(翻译)
GetInterfaceDnsSettings函数的Settings参数要求:
传入的结构体版本必须与
Version成员匹配。当Version设为DNS_INTERFACE_SETTINGS_VERSION3时,必须传入DNS_INTERFACE_SETTINGS3类型的结构体指针,该结构体包含DNS服务器属性(如DoH配置)的相关字段。
排查方向
- 结构体内存布局:确保Rust中
DNS_INTERFACE_SETTINGS3的定义添加了#[repr(C)]属性,保证与Windows API的C结构体内存布局、字段顺序、对齐方式完全一致。 - 权限验证:获取DNS设置可能需要管理员权限,尝试以管理员身份运行程序后重试。
- GUID准确性:交叉验证传入的适配器GUID是否对应目标WiFi适配器,可通过
ipconfig /all命令核对。 - 函数返回值检查:不要忽略
dns_setting_result的返回值,通过Windows错误码排查函数调用是否成功——若调用失败,结构体字段自然不会被正确填充。
内容的提问来源于stack exchange,提问作者50Fifty
相关产品推荐
相关产品推荐

