Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add GetIfEntry, GetNetworkParams, and supporting IPHlpAPI structures #983

Closed
wants to merge 2 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGES.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ Features
* [#959](https://github.com/java-native-access/jna/pull/959): Added `GetProcessTimes` and `GetProcessIoCounters` to `com.sun.jna.platform.win32.Kernel32` - [@dbwiddis](https://github.com/dbwiddis).
* [#952](https://github.com/java-native-access/jna/issues/952): Added `CreateMutex`, `OpenMutex` and `ReleaseMutex` to `com.sun.jna.platform.win32.Kernel32` - [@matthiasblaesing](https://github.com/matthiasblaesing).
* [#973](https://github.com/java-native-access/jna/issues/973): Added `PdhLookupPerfNameByIndex`, `PdhLookupPerfIndexByName`, and `PdhEnumObjectItems` to `c.s.j.platform.win32.Pdh` and a `c.s.j.platform.win32.PdhUtil` class to access them - [@dbwiddis](https://github.com/dbwiddis).
* [#983](https://github.com/java-native-access/jna/issues/983): Added `GetIfEntry`, `GetIfEntry2`, and `GetNetworkParams` and supporting structures `MIB_IFROW`, `MIB_IF_ROW2`, and `FIXED_INFO` to `c.s.j.platform.win32.IPHlpAPI.java` - [@dbwiddis](https://github.com/dbwiddis).

Bug Fixes
---------
Expand Down
278 changes: 278 additions & 0 deletions contrib/platform/src/com/sun/jna/platform/win32/IPHlpAPI.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,278 @@
/* Copyright (c) 2018 Daniel Widdis, All Rights Reserved
*
* The contents of this file is dual-licensed under 2
* alternative Open Source/Free licenses: LGPL 2.1 or later and
* Apache License 2.0. (starting with JNA version 4.0.0).
*
* You can freely decide which license you want to apply to
* the project.
*
* You may obtain a copy of the LGPL License at:
*
* http://www.gnu.org/licenses/licenses.html
*
* A copy is also included in the downloadable source code package
* containing JNA, in file "LGPL2.1".
*
* You may obtain a copy of the Apache License at:
*
* http://www.apache.org/licenses/
*
* A copy is also included in the downloadable source code package
* containing JNA, in file "AL2.0".
*/
package com.sun.jna.platform.win32;

import com.sun.jna.Library;
import com.sun.jna.Native;
import com.sun.jna.Pointer;
import com.sun.jna.Structure;
import com.sun.jna.Structure.FieldOrder;
import com.sun.jna.platform.win32.Guid.GUID;
import com.sun.jna.ptr.IntByReference;
import com.sun.jna.win32.W32APIOptions;

/**
* Windows IP Helper API
*
* @see <A HREF=
* "https://msdn.microsoft.com/en-us/library/windows/desktop/aa373083(v=vs.85).aspx">IP
* Helper Reference</A>
*/
public interface IPHlpAPI extends Library {
IPHlpAPI INSTANCE = Native.load("IPHlpAPI", IPHlpAPI.class, W32APIOptions.DEFAULT_OPTIONS);

int IF_MAX_STRING_SIZE = 256;
int IF_MAX_PHYS_ADDRESS_LENGTH = 32;
int MAX_INTERFACE_NAME_LEN = 256;
int MAXLEN_IFDESCR = 256;
int MAXLEN_PHYSADDR = 8;
int MAX_HOSTNAME_LEN = 128;
int MAX_DOMAIN_NAME_LEN = 128;
int MAX_SCOPE_ID_LEN = 256;

/**
* The MIB_IFROW structure stores information about a particular interface.
*
* @see <A HREF=
* "https://docs.microsoft.com/en-us/previous-versions/windows/desktop/api/ifmib/ns-ifmib-_mib_ifrow">MIB_IFROW</A>
*/
@FieldOrder({ "wszName", "dwIndex", "dwType", "dwMtu", "dwSpeed", "dwPhysAddrLen", "bPhysAddr", "dwAdminStatus",
"dwOperStatus", "dwLastChange", "dwInOctets", "dwInUcastPkts", "dwInNUcastPkts", "dwInDiscards",
"dwInErrors", "dwInUnknownProtos", "dwOutOctets", "dwOutUcastPkts", "dwOutNUcastPkts", "dwOutDiscards",
"dwOutErrors", "dwOutQLen", "dwDescrLen", "bDescr" })
class MIB_IFROW extends Structure {
public char[] wszName = new char[MAX_INTERFACE_NAME_LEN];
public int dwIndex;
public int dwType;
public int dwMtu;
public int dwSpeed;
public int dwPhysAddrLen;
public byte[] bPhysAddr = new byte[MAXLEN_PHYSADDR];
public int dwAdminStatus;
public int dwOperStatus;
public int dwLastChange;
public int dwInOctets;
public int dwInUcastPkts;
public int dwInNUcastPkts;
public int dwInDiscards;
public int dwInErrors;
public int dwInUnknownProtos;
public int dwOutOctets;
public int dwOutUcastPkts;
public int dwOutNUcastPkts;
public int dwOutDiscards;
public int dwOutErrors;
public int dwOutQLen;
public int dwDescrLen;
public byte[] bDescr = new byte[MAXLEN_IFDESCR];
}

/**
* The MIB_IF_ROW2 structure stores information about a particular
* interface.
*
* @see <A HREF=
* "https://msdn.microsoft.com/library/windows/hardware/ff559214">MIB_IF_ROW2</A>
*/
@FieldOrder({ "InterfaceLuid", "InterfaceIndex", "InterfaceGuid", "Alias", "Description", "PhysicalAddressLength",
"PhysicalAddress", "PermanentPhysicalAddress", "Mtu", "Type", "TunnelType", "MediaType",
"PhysicalMediumType", "AccessType", "DirectionType", "InterfaceAndOperStatusFlags", "OperStatus",
"AdminStatus", "MediaConnectState", "NetworkGuid", "ConnectionType", "TransmitLinkSpeed",
"ReceiveLinkSpeed", "InOctets", "InUcastPkts", "InNUcastPkts", "InDiscards", "InErrors", "InUnknownProtos",
"InUcastOctets", "InMulticastOctets", "InBroadcastOctets", "OutOctets", "OutUcastPkts", "OutNUcastPkts",
"OutDiscards", "OutErrors", "OutUcastOctets", "OutMulticastOctets", "OutBroadcastOctets", "OutQLen" })
class MIB_IF_ROW2 extends Structure {
public long InterfaceLuid; // 64-bit union NET_LUID
public int InterfaceIndex;
public GUID InterfaceGuid;
public char[] Alias = new char[IF_MAX_STRING_SIZE + 1];
public char[] Description = new char[IF_MAX_STRING_SIZE + 1];
public int PhysicalAddressLength;
public byte[] PhysicalAddress = new byte[IF_MAX_PHYS_ADDRESS_LENGTH];
public byte[] PermanentPhysicalAddress = new byte[IF_MAX_PHYS_ADDRESS_LENGTH];
public int Mtu;
public int Type;
// enums
public int TunnelType;
public int MediaType;
public int PhysicalMediumType;
public int AccessType;
public int DirectionType;
// 8-bit structure
public byte InterfaceAndOperStatusFlags;
// enums
public int OperStatus;
public int AdminStatus;
public int MediaConnectState;
public GUID NetworkGuid;
public int ConnectionType;
public long TransmitLinkSpeed;
public long ReceiveLinkSpeed;
public long InOctets;
public long InUcastPkts;
public long InNUcastPkts;
public long InDiscards;
public long InErrors;
public long InUnknownProtos;
public long InUcastOctets;
public long InMulticastOctets;
public long InBroadcastOctets;
public long OutOctets;
public long OutUcastPkts;
public long OutNUcastPkts;
public long OutDiscards;
public long OutErrors;
public long OutUcastOctets;
public long OutMulticastOctets;
public long OutBroadcastOctets;
public long OutQLen;
}

/**
* The IP_ADDRESS_STRING structure stores an IPv4 address in dotted decimal
* notation. The IP_ADDRESS_STRING structure definition is also the type
* definition for the IP_MASK_STRING structure.
*
* @see <A HREF=
* "https://docs.microsoft.com/en-us/windows/desktop/api/iptypes/ns-iptypes-ip_address_string">IP_ADDRESS_STRING</A>
*/
@FieldOrder({ "String" })
class IP_ADDRESS_STRING extends Structure {
// Null terminated string
// up to 3 chars (decimal 0-255) and dot
// ending with null
public byte[] String = new byte[16];
}

/**
* The IP_ADDR_STRING structure represents a node in a linked-list of IPv4
* addresses.
*
* @see <A HREF=
* "https://docs.microsoft.com/en-us/windows/desktop/api/iptypes/ns-iptypes-_ip_addr_string">IP_ADDR_STRING</A>
*/
@FieldOrder({ "Next", "IpAddress", "IpMask", "Context" })
class IP_ADDR_STRING extends Structure {
public IP_ADDR_STRING.ByReference Next;
public IP_ADDRESS_STRING IpAddress;
public IP_ADDRESS_STRING IpMask;
public int Context;

public static class ByReference extends IP_ADDR_STRING implements Structure.ByReference {
}
}

/**
* The FIXED_INFO structure contains information that is the same across all
* the interfaces on a computer.
*
* @see <A HREF=
* "https://docs.microsoft.com/en-us/windows/desktop/api/iptypes/ns-iptypes-fixed_info_w2ksp1">FIXED_INFO</A>
*/
@FieldOrder({ "HostName", "DomainName", "CurrentDnsServer", "DnsServerList", "NodeType", "ScopeId", "EnableRouting",
"EnableProxy", "EnableDns" })
class FIXED_INFO extends Structure {
public byte[] HostName = new byte[MAX_HOSTNAME_LEN + 4];
public byte[] DomainName = new byte[MAX_DOMAIN_NAME_LEN + 4];
public IP_ADDR_STRING.ByReference CurrentDnsServer; // IP_ADDR_STRING
public IP_ADDR_STRING DnsServerList;
public int NodeType;
public byte[] ScopeId = new byte[MAX_SCOPE_ID_LEN + 4];
public int EnableRouting;
public int EnableProxy;
public int EnableDns;

public FIXED_INFO(Pointer p) {
super(p);
read();
}

public FIXED_INFO() {
super();
}
}

/**
* The GetIfEntry function retrieves information for the specified interface
* on the local computer.
*
* The dwIndex member in the MIB_IFROW structure pointed to by the pIfRow
* parameter must be initialized to a valid network interface index
* retrieved by a previous call to the GetIfTable, GetIfTable2, or
* GetIfTable2Ex function. The GetIfEntry function will fail if the dwIndex
* member of the MIB_IFROW pointed to by the pIfRow parameter does not match
* an existing interface index on the local computer.
*
* @param pIfRow
* A pointer to a MIB_IFROW structure that, on successful return,
* receives information for an interface on the local computer.
* On input, set the dwIndex member of MIB_IFROW to the index of
* the interface for which to retrieve information.
* @return If the function succeeds, the return value is NO_ERROR.
*/
int GetIfEntry(MIB_IFROW pIfRow);

/**
* The GetIfEntry2 function retrieves information for the specified
* interface on the local computer.
*
* On input, at least one of the following members in the MIB_IF_ROW2
* structure passed in the Row parameter must be initialized: InterfaceLuid
* or InterfaceIndex. The fields are used in the order listed above. So if
* the InterfaceLuid is specified, then this member is used to determine the
* interface. If no value was set for the InterfaceLuid member (the value of
* this member was set to zero), then the InterfaceIndex member is next used
* to determine the interface. On output, the remaining fields of the
* MIB_IF_ROW2 structure pointed to by the Row parameter are filled in.
*
* @param pIfRow2
* A pointer to a MIB_IF_ROW2 structure that, on successful
* return, receives information for an interface on the local
* computer. On input, the InterfaceLuid or the InterfaceIndex
* member of the MIB_IF_ROW2 must be set to the interface for
* which to retrieve information.
* @return If the function succeeds, the return value is NO_ERROR.
*/
int GetIfEntry2(MIB_IF_ROW2 pIfRow2);

/**
* The GetNetworkParams function retrieves network parameters for the local
* computer.
*
* @param pFixedInfo
* A pointer to a buffer that contains a FIXED_INFO structure
* that receives the network parameters for the local computer,
* if the function was successful. This buffer must be allocated
* by the caller prior to calling the GetNetworkParams function.
* @param pOutBufLen
* A pointer to a ULONG variable that specifies the size of the
* FIXED_INFO structure. If this size is insufficient to hold the
* information, GetNetworkParams fills in this variable with the
* required size, and returns an error code of
* ERROR_BUFFER_OVERFLOW.
* @return If the function succeeds, the return value is ERROR_SUCCESS.
*/
int GetNetworkParams(FIXED_INFO pFixedInfo, IntByReference pOutBufLen);
}

Loading