oshi.software.os.windows.WindowsNetworkParams Maven / Gradle / Ivy
package oshi.software.os.windows;
import oshi.jna.platform.windows.IPHlpAPI;
import oshi.jna.platform.windows.Kernel32;
import oshi.software.common.AbstractNetworkParams;
import oshi.util.ExecutingCommand;
import oshi.util.platform.windows.WmiUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.sun.jna.Memory;
import com.sun.jna.platform.win32.WinDef;
import com.sun.jna.ptr.IntByReference;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* @author angju
*
*/
public class WindowsNetworkParams extends AbstractNetworkParams {
private static final long serialVersionUID = 1L;
private static final Logger LOG = LoggerFactory.getLogger(WindowsNetworkParams.class);
private static final WmiUtil.ValueType[] GATEWAY_TYPES = { WmiUtil.ValueType.STRING, WmiUtil.ValueType.UINT16 };
private static final String IPV4_DEFAULT_DEST = "0.0.0.0/0";
private static final String IPV6_DEFAULT_DEST = "::/0";
/**
* {@inheritDoc}
*/
@Override
public String getDomainName() {
char[] buffer = new char[256];
IntByReference bufferSize = new IntByReference(buffer.length);
if (!Kernel32.INSTANCE.GetComputerNameEx(Kernel32.ComputerNameDnsDomainFullyQualified, buffer, bufferSize)) {
LOG.error("Failed to get dns domain name. Error code: {}", Kernel32.INSTANCE.GetLastError());
return "";
}
return new String(buffer).trim();
}
/**
* {@inheritDoc}
*/
@Override
public String[] getDnsServers() {
// this may be done by iterating WMI instances
// ROOT\CIMV2\Win32_NetworkAdapterConfiguration
// then sort by IPConnectionMetric, but current JNA release does not
// have string array support
// for Variant (it's merged but not release yet).
WinDef.ULONGByReference bufferSize = new WinDef.ULONGByReference();
int ret = IPHlpAPI.INSTANCE.GetNetworkParams(null, bufferSize);
if (ret != IPHlpAPI.ERROR_BUFFER_OVERFLOW) {
LOG.error("Failed to get network parameters buffer size. Error code: {}", ret);
return new String[0];
}
IPHlpAPI.FIXED_INFO buffer = new IPHlpAPI.FIXED_INFO(new Memory(bufferSize.getValue().longValue()));
ret = IPHlpAPI.INSTANCE.GetNetworkParams(buffer, bufferSize);
if (ret != 0) {
LOG.error("Failed to get network parameters. Error code: {}", ret);
return new String[0];
}
List list = new ArrayList();
IPHlpAPI.IP_ADDR_STRING dns = buffer.DnsServerList;
while (dns != null) {
String addr = new String(dns.IpAddress.String);
int nullPos = addr.indexOf(0);
if (nullPos != -1) {
addr = addr.substring(0, nullPos);
}
list.add(addr);
dns = dns.Next;
}
return list.toArray(new String[list.size()]);
}
/**
* {@inheritDoc}
*/
@Override
public String getIpv4DefaultGateway() {
// IPv6 info not available in WMI pre Windows 8
if (WmiUtil.hasNamespace("StandardCimv2")) {
return getNextHop(IPV4_DEFAULT_DEST);
}
// IPv4 info available in Win32_IP4RouteTable
return getNextHopWin7(IPV4_DEFAULT_DEST.split("/")[0]);
}
/**
* {@inheritDoc}
*/
@Override
public String getIpv6DefaultGateway() {
// IPv6 info not available in WMI pre Windows 8
if (WmiUtil.hasNamespace("StandardCimv2")) {
return getNextHop(IPV6_DEFAULT_DEST);
}
return parseIpv6Route();
}
private String getNextHop(String dest) {
Map> vals = WmiUtil.selectObjectsFrom("ROOT\\StandardCimv2", "MSFT_NetRoute",
"NextHop,RouteMetric", "WHERE DestinationPrefix=\"" + dest + "\"", GATEWAY_TYPES);
List