Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156/* * iphlpapi dll implementation -- Setting and storing route information * * These are stubs for functions that set routing information on the target * operating system. They are grouped here because their implementation will * vary widely by operating system. * * Copyright (C) 2004 Art Yerkes * 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 Street, Fifth Floor, Boston, MA 02110-1301 USA */
#include <config.h>#include "iphlpapi_private.h"
#define IP_FORWARD_ADD 3#define IP_FORWARD_DEL 2
WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi);
DWORD createIpForwardEntry( PMIB_IPFORWARDROW pRoute ) { HANDLE tcpFile; NTSTATUS status = openTcpFile( &tcpFile, FILE_READ_DATA | FILE_WRITE_DATA ); TCP_REQUEST_SET_INFORMATION_EX_ROUTE_ENTRY req = TCP_REQUEST_SET_INFORMATION_INIT; IPRouteEntry *rte; TDIEntityID id; DWORD returnSize = 0;
TRACE("Called.\n");
if( NT_SUCCESS(status) ) { status = getNthIpEntity( tcpFile, pRoute->dwForwardIfIndex, &id );
if( NT_SUCCESS(status) ) { req.Req.ID.toi_class = INFO_CLASS_PROTOCOL; req.Req.ID.toi_type = INFO_TYPE_PROVIDER; req.Req.ID.toi_id = IP_MIB_ARPTABLE_ENTRY_ID; req.Req.ID.toi_entity.tei_instance = id.tei_instance; req.Req.ID.toi_entity.tei_entity = CL_NL_ENTITY; req.Req.BufferSize = sizeof(*rte); rte = (IPRouteEntry *)&req.Req.Buffer[0];
// dwForwardPolicy // dwForwardNextHopAS rte->ire_dest = pRoute->dwForwardDest; rte->ire_mask = pRoute->dwForwardMask; rte->ire_gw = pRoute->dwForwardNextHop; rte->ire_index = pRoute->dwForwardIfIndex; rte->ire_type = IP_FORWARD_ADD; rte->ire_proto = pRoute->dwForwardProto; rte->ire_age = pRoute->dwForwardAge; rte->ire_metric1 = pRoute->dwForwardMetric1; rte->ire_metric2 = pRoute->dwForwardMetric2; rte->ire_metric3 = pRoute->dwForwardMetric3; rte->ire_metric4 = pRoute->dwForwardMetric4; rte->ire_metric5 = pRoute->dwForwardMetric5;
status = DeviceIoControl( tcpFile, IOCTL_TCP_SET_INFORMATION_EX, &req, sizeof(req), NULL, 0, &returnSize, NULL ); }
closeTcpFile( tcpFile ); }
TRACE("Returning: %08x (IOCTL was %08x)\n", status, IOCTL_TCP_SET_INFORMATION_EX);
if( NT_SUCCESS(status) ) return NO_ERROR; else return status;}
DWORD setIpForwardEntry( PMIB_IPFORWARDROW pRoute ) { FIXME(":stub\n"); return (DWORD) 0;}
DWORD deleteIpForwardEntry( PMIB_IPFORWARDROW pRoute ) { HANDLE tcpFile; NTSTATUS status = openTcpFile( &tcpFile, FILE_READ_DATA | FILE_WRITE_DATA ); TCP_REQUEST_SET_INFORMATION_EX_ROUTE_ENTRY req = TCP_REQUEST_SET_INFORMATION_INIT; IPRouteEntry *rte; TDIEntityID id; DWORD returnSize = 0;
TRACE("Called.\n");
if( NT_SUCCESS(status) ) { status = getNthIpEntity( tcpFile, pRoute->dwForwardIfIndex, &id );
if( NT_SUCCESS(status) ) { req.Req.ID.toi_class = INFO_CLASS_PROTOCOL; req.Req.ID.toi_type = INFO_TYPE_PROVIDER; req.Req.ID.toi_id = IP_MIB_ARPTABLE_ENTRY_ID; req.Req.ID.toi_entity.tei_instance = id.tei_instance; req.Req.ID.toi_entity.tei_entity = CL_NL_ENTITY; req.Req.BufferSize = sizeof(*rte); rte = (IPRouteEntry *)&req.Req.Buffer[0];
// dwForwardPolicy // dwForwardNextHopAS rte->ire_dest = pRoute->dwForwardDest; rte->ire_mask = INADDR_NONE; rte->ire_gw = pRoute->dwForwardNextHop; rte->ire_index = pRoute->dwForwardIfIndex; rte->ire_type = IP_FORWARD_DEL; rte->ire_proto = pRoute->dwForwardProto; rte->ire_age = pRoute->dwForwardAge; rte->ire_metric1 = pRoute->dwForwardMetric1; rte->ire_metric2 = INADDR_NONE; rte->ire_metric3 = INADDR_NONE; rte->ire_metric4 = INADDR_NONE; rte->ire_metric5 = INADDR_NONE;
status = DeviceIoControl( tcpFile, IOCTL_TCP_SET_INFORMATION_EX, &req, sizeof(req), NULL, 0, &returnSize, NULL ); }
closeTcpFile( tcpFile ); }
TRACE("Returning: %08x (IOCTL was %08x)\n", status, IOCTL_TCP_SET_INFORMATION_EX);
if( NT_SUCCESS(status) ) return NO_ERROR; else return status;}