Java Native Access-GetExtendedTcpTable:界限超出了可用空间

问题描述 投票:1回答:1

我已经用JNA实现了GetExtendedTcpTable(),但是当我使用该函数时,会收到错误消息:

java.lang.IndexOutOfBoundsException: Bounds exceeds available space : size=28, offset=52

我的功能的定义如下:

public interface IPHlpAPIExtended extends IPHlpAPI {

IPHlpAPIExtended INSTANCE = Native.load("IPHlpAPI", IPHlpAPIExtended.class, W32APIOptions.DEFAULT_OPTIONS);

int GetExtendedTcpTable( MIB_TCPTABLE_OWNER_PID pTcpTable, IntByReference pdwSize, boolean bOrder, int ulAf, int TableClass, int Reserved );

@Structure.FieldOrder( { "dwNumEntries", "table" } )
public static class MIB_TCPTABLE_OWNER_PID extends Structure {

    public WinDef.DWORD dwNumEntries;
    public MIB_TCPROW_OWNER_PID[] table = new MIB_TCPROW_OWNER_PID[]{ new MIB_TCPROW_OWNER_PID() };

    public MIB_TCPTABLE_OWNER_PID() {
    }

    public MIB_TCPTABLE_OWNER_PID( Pointer pointer ) {
        super( pointer );
        this.read();
    }

    @Override
    public void read() {
        super.read();
        if ( dwNumEntries.intValue() > 0 ) {
            table = ( MIB_TCPROW_OWNER_PID[] ) table[0].toArray( dwNumEntries.intValue() );
        } else {
            table = new MIB_TCPROW_OWNER_PID[]{ new MIB_TCPROW_OWNER_PID() };
        }
    }
}

}

和:

  IPHlpAPIExtended.MIB_TCPTABLE_OWNER_PID pTcpTable = new IPHlpAPIExtended.MIB_TCPTABLE_OWNER_PID();
    final IntByReference pdwSize = new IntByReference( 0 );

    try {
        if ( IPHlpAPIExtended.INSTANCE.GetExtendedTcpTable( pTcpTable, pdwSize, true, AF_INET,
                IPHlpAPIExtended.TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL.ordinal(), 0 ) == ERROR_INSUFFICIENT_BUFFER ) {

            IPHlpAPIExtended.MIB_TCPTABLE_OWNER_PID newPTcpTable = new IPHlpAPIExtended.MIB_TCPTABLE_OWNER_PID( pTcpTable.getPointer() );

            assertThat(
                    IPHlpAPIExtended.INSTANCE.GetExtendedTcpTable( newPTcpTable, pdwSize, true, AF_INET,
                            IPHlpAPIExtended.TCP_TABLE_CLASS.TCP_TABLE_OWNER_PID_ALL.ordinal(), 0 ) ).isEqualTo( NO_ERROR );

            for ( int i = 0; i < newPTcpTable.dwNumEntries.intValue(); i++ ) {
                final IPHlpAPIExtended.MIB_TCPROW_OWNER_PID row = newPTcpTable.table[i];
                System.out.println( row.dwOwningPid.intValue() );
            }
        } else {
            // TODO getLasError()
            Assertions.fail( "GetExtendedTcpTable terminate with errors" );
        }
    } catch ( Throwable t ) {
        t.printStackTrace();
    }

dwNumEntries字段已正确填充。但行:

table = ( MIB_TCPROW_OWNER_PID[] ) table[0].toArray( dwNumEntries.intValue() );

引发异常。

编辑:

这是MIB_TCPROW_OWNER_PID的映射:

@Structure.FieldOrder( { "dwState", "dwLocalAddr", "dwLocalPort", "dwRemoteAddr", "dwRemotePort", "dwOwningPid" } )
public static class MIB_TCPROW_OWNER_PID extends Structure {

    public WinDef.DWORD dwState;
    public WinDef.DWORD dwLocalAddr;
    public WinDef.DWORD dwLocalPort;
    public WinDef.DWORD dwRemoteAddr;
    public WinDef.DWORD dwRemotePort;
    public WinDef.DWORD dwOwningPid;

}
java jna
1个回答
0
投票

问题出在MIB_TCPTABLE_OWNER_PID结构的映射中,您已将第二个元素定义为数组,固定大小为1:

© www.soinside.com 2019 - 2024. All rights reserved.