Sweden-Number/include/wine/nsi.h

514 lines
11 KiB
C

/*
* Copyright 2021 Huw Davies
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef __WINE_NSI_H
#define __WINE_NSI_H
#include "inaddr.h"
#include "in6addr.h"
#include "ws2def.h"
#include "ws2ipdef.h"
#include "winioctl.h"
/* Undocumented NSI NDIS tables */
#define NSI_NDIS_IFINFO_TABLE 0
#define NSI_NDIS_INDEX_LUID_TABLE 2
struct nsi_ndis_ifinfo_rw
{
GUID network_guid;
UINT admin_status;
IF_COUNTED_STRING alias; /* .Length in bytes not including '\0' */
IF_PHYSICAL_ADDRESS phys_addr;
USHORT pad;
IF_COUNTED_STRING name2;
UINT unk;
};
struct nsi_ndis_ifinfo_dynamic
{
UINT oper_status;
struct
{
UINT unk : 1;
UINT not_media_conn : 1;
UINT unk2 : 30;
} flags;
UINT media_conn_state;
UINT unk;
UINT mtu;
ULONG64 xmit_speed;
ULONG64 rcv_speed;
ULONG64 in_errors;
ULONG64 in_discards;
ULONG64 out_errors;
ULONG64 out_discards;
ULONG64 unk2;
ULONG64 in_octets;
ULONG64 in_ucast_pkts;
ULONG64 in_mcast_pkts;
ULONG64 in_bcast_pkts;
ULONG64 out_octets;
ULONG64 out_ucast_pkts;
ULONG64 out_mcast_pkts;
ULONG64 out_bcast_pkts;
ULONG64 unk3[2];
ULONG64 in_ucast_octs;
ULONG64 in_mcast_octs;
ULONG64 in_bcast_octs;
ULONG64 out_ucast_octs;
ULONG64 out_mcast_octs;
ULONG64 out_bcast_octs;
ULONG64 unk4;
};
struct nsi_ndis_ifinfo_static
{
UINT if_index;
IF_COUNTED_STRING descr;
UINT type;
UINT access_type;
UINT unk;
UINT conn_type;
GUID if_guid;
USHORT conn_present;
IF_PHYSICAL_ADDRESS perm_phys_addr;
struct
{
UINT hw : 1;
UINT filter : 1;
UINT unk : 30;
} flags;
UINT media_type;
UINT phys_medium_type;
};
/* Undocumented NSI IP tables */
#define NSI_IP_COMPARTMENT_TABLE 2
#define NSI_IP_ICMPSTATS_TABLE 3
#define NSI_IP_IPSTATS_TABLE 6
#define NSI_IP_UNICAST_TABLE 10
#define NSI_IP_NEIGHBOUR_TABLE 11
#define NSI_IP_FORWARD_TABLE 16
struct nsi_ip_cmpt_rw
{
UINT not_forwarding;
UINT unk;
UINT default_ttl;
UINT unk2;
};
struct nsi_ip_cmpt_dynamic
{
UINT num_ifs;
UINT num_routes;
UINT unk;
UINT num_addrs;
};
struct nsi_ip_icmpstats_dynamic
{
UINT in_msgs;
UINT in_errors;
UINT in_type_counts[256];
UINT out_msgs;
UINT out_errors;
UINT out_type_counts[256];
};
struct nsi_ip_ipstats_dynamic
{
UINT unk[4];
ULONGLONG in_recv;
ULONGLONG in_octets;
ULONGLONG fwd_dgrams;
ULONGLONG in_delivers;
ULONGLONG out_reqs;
ULONGLONG unk2;
ULONGLONG unk3;
ULONGLONG out_octets;
ULONGLONG unk4[6];
ULONGLONG in_hdr_errs;
UINT in_addr_errs;
UINT in_unk_protos;
UINT unk5;
UINT reasm_reqds;
UINT reasm_oks;
UINT reasm_fails;
UINT in_discards;
UINT out_no_routes;
UINT out_discards;
UINT routing_discards;
UINT frag_oks;
UINT frag_fails;
UINT frag_creates;
UINT unk6[7];
};
struct nsi_ip_ipstats_static
{
UINT reasm_timeout;
};
struct nsi_ipv4_unicast_key
{
NET_LUID luid;
IN_ADDR addr;
UINT pad;
};
struct nsi_ipv6_unicast_key
{
NET_LUID luid;
IN6_ADDR addr;
};
struct nsi_ip_unicast_rw
{
UINT preferred_lifetime;
UINT valid_lifetime;
UINT prefix_origin;
UINT suffix_origin;
UINT on_link_prefix;
UINT unk[2];
};
struct nsi_ip_unicast_dynamic
{
UINT scope_id;
UINT dad_state;
};
struct nsi_ip_unicast_static
{
ULONG64 creation_time;
};
struct nsi_ipv4_neighbour_key
{
NET_LUID luid;
NET_LUID luid2;
IN_ADDR addr;
UINT pad;
};
struct nsi_ipv6_neighbour_key
{
NET_LUID luid;
NET_LUID luid2;
IN6_ADDR addr;
};
struct nsi_ip_neighbour_rw
{
BYTE phys_addr[IF_MAX_PHYS_ADDRESS_LENGTH];
};
struct nsi_ip_neighbour_dynamic
{
UINT state;
UINT time;
struct
{
BOOLEAN is_router;
BOOLEAN is_unreachable;
} flags;
USHORT phys_addr_len;
UINT unk;
};
struct nsi_ipv4_forward_key
{
UINT unk;
IN_ADDR prefix;
BYTE prefix_len;
BYTE unk2[3];
UINT unk3[3];
NET_LUID luid;
NET_LUID luid2;
IN_ADDR next_hop;
UINT pad;
};
struct nsi_ipv6_forward_key
{
UINT unk;
IN6_ADDR prefix;
BYTE prefix_len;
BYTE unk2[3];
UINT unk3[3];
UINT pad;
NET_LUID luid;
NET_LUID luid2;
IN6_ADDR next_hop;
};
struct nsi_ip_forward_rw
{
UINT site_prefix_len;
UINT valid_lifetime;
UINT preferred_lifetime;
UINT metric;
UINT protocol;
BYTE loopback;
BYTE autoconf;
BYTE publish;
BYTE immortal;
BYTE unk[4];
UINT unk2;
};
struct nsi_ipv4_forward_dynamic
{
UINT age;
UINT unk[3];
IN_ADDR addr2; /* often a repeat of prefix */
};
struct nsi_ipv6_forward_dynamic
{
UINT age;
UINT unk[3];
IN6_ADDR addr2; /* often a repeat of prefix */
};
struct nsi_ip_forward_static
{
UINT origin;
UINT if_index;
};
/* Undocumented NSI TCP tables */
#define NSI_TCP_STATS_TABLE 0
#define NSI_TCP_ALL_TABLE 3
#define NSI_TCP_ESTAB_TABLE 4
#define NSI_TCP_LISTEN_TABLE 5
struct nsi_tcp_stats_dynamic
{
UINT active_opens;
UINT passive_opens;
UINT attempt_fails;
UINT est_rsts;
UINT cur_est;
UINT pad; /* ? */
ULONGLONG in_segs;
ULONGLONG out_segs;
UINT retrans_segs;
UINT out_rsts;
UINT in_errs;
UINT num_conns;
UINT unk[12];
};
struct nsi_tcp_stats_static
{
UINT rto_algo;
UINT rto_min;
UINT rto_max;
UINT max_conns;
UINT unk;
};
struct nsi_tcp_conn_key
{
SOCKADDR_INET local;
SOCKADDR_INET remote;
};
struct nsi_tcp_conn_dynamic
{
UINT state;
UINT unk[3];
};
struct nsi_tcp_conn_static
{
UINT unk[3];
UINT pid;
ULONGLONG create_time;
ULONGLONG mod_info;
};
/* Undocumented NSI UDP tables */
#define NSI_UDP_STATS_TABLE 0
#define NSI_UDP_ENDPOINT_TABLE 1
struct nsi_udp_stats_dynamic
{
ULONGLONG in_dgrams;
UINT no_ports;
UINT in_errs;
ULONGLONG out_dgrams;
UINT num_addrs;
UINT unk[5];
};
struct nsi_udp_endpoint_key
{
SOCKADDR_INET local;
};
struct nsi_udp_endpoint_static
{
UINT pid;
UINT unk;
ULONGLONG create_time;
UINT flags;
UINT unk2;
ULONGLONG mod_info;
};
/* Wine specific ioctl interface */
#define IOCTL_NSIPROXY_WINE_ENUMERATE_ALL CTL_CODE(FILE_DEVICE_NETWORK, 0x400, METHOD_BUFFERED, 0)
#define IOCTL_NSIPROXY_WINE_GET_ALL_PARAMETERS CTL_CODE(FILE_DEVICE_NETWORK, 0x401, METHOD_BUFFERED, 0)
#define IOCTL_NSIPROXY_WINE_GET_PARAMETER CTL_CODE(FILE_DEVICE_NETWORK, 0x402, METHOD_BUFFERED, 0)
#define IOCTL_NSIPROXY_WINE_ICMP_ECHO CTL_CODE(FILE_DEVICE_NETWORK, 0x403, METHOD_BUFFERED, 0)
/* input for IOCTL_NSIPROXY_WINE_ENUMERATE_ALL */
struct nsiproxy_enumerate_all
{
NPI_MODULEID module;
UINT first_arg;
UINT second_arg;
UINT table;
UINT key_size;
UINT rw_size;
UINT dynamic_size;
UINT static_size;
UINT count;
};
/* input for IOCTL_NSIPROXY_WINE_GET_ALL_PARAMETERS */
struct nsiproxy_get_all_parameters
{
NPI_MODULEID module;
UINT first_arg;
UINT table;
UINT key_size;
UINT rw_size;
UINT dynamic_size;
UINT static_size;
BYTE key[1]; /* key_size */
};
/* input for IOCTL_NSIPROXY_WINE_GET_PARAMETER */
struct nsiproxy_get_parameter
{
NPI_MODULEID module;
UINT first_arg;
UINT table;
UINT key_size;
UINT param_type;
UINT data_offset;
BYTE key[1]; /* key_size */
};
/* input for IOCTL_NSIPROXY_WINE_ICMP_ECHO */
struct nsiproxy_icmp_echo
{
SOCKADDR_INET src;
SOCKADDR_INET dst;
ULONGLONG user_reply_ptr;
BYTE bits;
BYTE ttl;
BYTE tos;
BYTE flags;
UINT opt_size;
UINT req_size;
UINT timeout;
BYTE data[1]; /* ((opt_size + 3) & ~3) + req_size */
};
/* Undocumented Nsi api */
#define NSI_PARAM_TYPE_RW 0
#define NSI_PARAM_TYPE_DYNAMIC 1
#define NSI_PARAM_TYPE_STATIC 2
struct nsi_enumerate_all_ex
{
void *unknown[2];
const NPI_MODULEID *module;
UINT_PTR table;
UINT first_arg;
UINT second_arg;
void *key_data;
UINT key_size;
void *rw_data;
UINT rw_size;
void *dynamic_data;
UINT dynamic_size;
void *static_data;
UINT static_size;
UINT_PTR count;
};
struct nsi_get_all_parameters_ex
{
void *unknown[2];
const NPI_MODULEID *module;
UINT_PTR table;
UINT first_arg;
UINT unknown2;
const void *key;
UINT key_size;
void *rw_data;
UINT rw_size;
void *dynamic_data;
UINT dynamic_size;
void *static_data;
UINT static_size;
};
struct nsi_get_parameter_ex
{
void *unknown[2];
const NPI_MODULEID *module;
UINT_PTR table;
UINT first_arg;
UINT unknown2;
const void *key;
UINT key_size;
UINT_PTR param_type;
void *data;
UINT data_size;
UINT data_offset;
};
DWORD WINAPI NsiAllocateAndGetTable( DWORD unk, const NPI_MODULEID *module, DWORD table, void **key_data, DWORD key_size,
void **rw_data, DWORD rw_size, void **dynamic_data, DWORD dynamic_size,
void **static_data, DWORD static_size, DWORD *count, DWORD unk2 );
DWORD WINAPI NsiEnumerateObjectsAllParameters( DWORD unk, DWORD unk2, const NPI_MODULEID *module, DWORD table,
void *key_data, DWORD key_size, void *rw_data, DWORD rw_size,
void *dynamic_data, DWORD dynamic_size, void *static_data, DWORD static_size,
DWORD *count );
DWORD WINAPI NsiEnumerateObjectsAllParametersEx( struct nsi_enumerate_all_ex *params );
void WINAPI NsiFreeTable( void *key_data, void *rw_data, void *dynamic_data, void *static_data );
DWORD WINAPI NsiGetAllParameters( DWORD unk, const NPI_MODULEID *module, DWORD table, const void *key, DWORD key_size,
void *rw_data, DWORD rw_size, void *dynamic_data, DWORD dynamic_size,
void *static_data, DWORD static_size );
DWORD WINAPI NsiGetAllParametersEx( struct nsi_get_all_parameters_ex *params );
DWORD WINAPI NsiGetParameter( DWORD unk, const NPI_MODULEID *module, DWORD table, const void *key, DWORD key_size,
DWORD param_type, void *data, DWORD data_size, DWORD data_offset );
DWORD WINAPI NsiGetParameterEx( struct nsi_get_parameter_ex *params );
#endif /* __WINE_NSI_H */