mirror of
https://github.com/reactos/reactos.git
synced 2024-07-04 19:54:58 +00:00
- Implement SetIpNetEntry in iphlpapi and InfoTdiSetArptableMIB in tcpip
- Added buffer size checks for InfoTdiSetRoute - "arp -s" works now svn path=/trunk/; revision=43723
This commit is contained in:
parent
ff318c3207
commit
ebaa2b818d
|
@ -2087,15 +2087,54 @@ DWORD WINAPI SetIpForwardEntry(PMIB_IPFORWARDROW pRoute)
|
||||||
* RETURNS
|
* RETURNS
|
||||||
* Success: NO_ERROR
|
* Success: NO_ERROR
|
||||||
* Failure: error code from winerror.h
|
* Failure: error code from winerror.h
|
||||||
*
|
|
||||||
* FIXME
|
|
||||||
* Stub, returns NO_ERROR.
|
|
||||||
*/
|
*/
|
||||||
DWORD WINAPI SetIpNetEntry(PMIB_IPNETROW pArpEntry)
|
DWORD WINAPI SetIpNetEntry(PMIB_IPNETROW pArpEntry)
|
||||||
{
|
{
|
||||||
FIXME("(pArpEntry %p): stub\n", pArpEntry);
|
HANDLE tcpFile;
|
||||||
/* same as CreateIpNetEntry here, could use SIOCSARP, not sure I want to */
|
NTSTATUS status;
|
||||||
return 0;
|
TCP_REQUEST_SET_INFORMATION_EX_ARP_ENTRY req =
|
||||||
|
TCP_REQUEST_SET_INFORMATION_INIT;
|
||||||
|
TDIEntityID id;
|
||||||
|
DWORD returnSize;
|
||||||
|
PMIB_IPNETROW arpBuff;
|
||||||
|
|
||||||
|
if (!pArpEntry)
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(openTcpFile( &tcpFile )))
|
||||||
|
return ERROR_NOT_SUPPORTED;
|
||||||
|
|
||||||
|
if (!NT_SUCCESS(getNthIpEntity( tcpFile, pArpEntry->dwIndex, &id )))
|
||||||
|
{
|
||||||
|
closeTcpFile(tcpFile);
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
|
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 = AT_ENTITY;
|
||||||
|
req.Req.BufferSize = sizeof(MIB_IPNETROW);
|
||||||
|
arpBuff = (PMIB_IPNETROW)&req.Req.Buffer[0];
|
||||||
|
|
||||||
|
RtlCopyMemory(arpBuff, pArpEntry, sizeof(MIB_IPNETROW));
|
||||||
|
|
||||||
|
status = DeviceIoControl( tcpFile,
|
||||||
|
IOCTL_TCP_SET_INFORMATION_EX,
|
||||||
|
&req,
|
||||||
|
sizeof(req),
|
||||||
|
NULL,
|
||||||
|
0,
|
||||||
|
&returnSize,
|
||||||
|
NULL );
|
||||||
|
|
||||||
|
closeTcpFile(tcpFile);
|
||||||
|
|
||||||
|
if (status)
|
||||||
|
return NO_ERROR;
|
||||||
|
else
|
||||||
|
return ERROR_INVALID_PARAMETER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -88,12 +88,19 @@ typedef union _IFEntrySafelySized {
|
||||||
IFEntry ent;
|
IFEntry ent;
|
||||||
} IFEntrySafelySized;
|
} IFEntrySafelySized;
|
||||||
|
|
||||||
typedef union _TCP_REQUEST_SET_INFORMATION_EX_SAFELY_SIZED {
|
typedef union _TCP_REQUEST_SET_INFORMATION_EX_ROUTE_ENTRY {
|
||||||
CHAR MaxSize[sizeof(TCP_REQUEST_SET_INFORMATION_EX) - 1 +
|
CHAR MaxSize[sizeof(TCP_REQUEST_SET_INFORMATION_EX) - 1 +
|
||||||
sizeof(IPRouteEntry)];
|
sizeof(IPRouteEntry)];
|
||||||
TCP_REQUEST_SET_INFORMATION_EX Req;
|
TCP_REQUEST_SET_INFORMATION_EX Req;
|
||||||
} TCP_REQUEST_SET_INFORMATION_EX_SAFELY_SIZED,
|
} TCP_REQUEST_SET_INFORMATION_EX_ROUTE_ENTRY,
|
||||||
*PTCP_REQUEST_SET_INFORMATION_EX_SAFELY_SIZED;
|
*PTCP_REQUEST_SET_INFORMATION_EX_ROUTE_ENTRY;
|
||||||
|
|
||||||
|
typedef union _TCP_REQUEST_SET_INFORMATION_EX_ARP_ENTRY {
|
||||||
|
CHAR MaxSize[sizeof(TCP_REQUEST_SET_INFORMATION_EX) - 1 +
|
||||||
|
sizeof(MIB_IPNETROW)];
|
||||||
|
TCP_REQUEST_SET_INFORMATION_EX Req;
|
||||||
|
} TCP_REQUEST_SET_INFORMATION_EX_ARP_ENTRY,
|
||||||
|
*PTCP_REQUEST_SET_INFORMATION_EX_ARP_ENTRY;
|
||||||
|
|
||||||
/* Encapsulates information about an interface */
|
/* Encapsulates information about an interface */
|
||||||
typedef struct _IFInfo {
|
typedef struct _IFInfo {
|
||||||
|
|
|
@ -55,7 +55,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(iphlpapi);
|
||||||
DWORD createIpForwardEntry( PMIB_IPFORWARDROW pRoute ) {
|
DWORD createIpForwardEntry( PMIB_IPFORWARDROW pRoute ) {
|
||||||
HANDLE tcpFile;
|
HANDLE tcpFile;
|
||||||
NTSTATUS status = openTcpFile( &tcpFile );
|
NTSTATUS status = openTcpFile( &tcpFile );
|
||||||
TCP_REQUEST_SET_INFORMATION_EX_SAFELY_SIZED req =
|
TCP_REQUEST_SET_INFORMATION_EX_ROUTE_ENTRY req =
|
||||||
TCP_REQUEST_SET_INFORMATION_INIT;
|
TCP_REQUEST_SET_INFORMATION_INIT;
|
||||||
IPRouteEntry *rte;
|
IPRouteEntry *rte;
|
||||||
TDIEntityID id;
|
TDIEntityID id;
|
||||||
|
@ -120,7 +120,7 @@ DWORD setIpForwardEntry( PMIB_IPFORWARDROW pRoute ) {
|
||||||
DWORD deleteIpForwardEntry( PMIB_IPFORWARDROW pRoute ) {
|
DWORD deleteIpForwardEntry( PMIB_IPFORWARDROW pRoute ) {
|
||||||
HANDLE tcpFile;
|
HANDLE tcpFile;
|
||||||
NTSTATUS status = openTcpFile( &tcpFile );
|
NTSTATUS status = openTcpFile( &tcpFile );
|
||||||
TCP_REQUEST_SET_INFORMATION_EX_SAFELY_SIZED req =
|
TCP_REQUEST_SET_INFORMATION_EX_ROUTE_ENTRY req =
|
||||||
TCP_REQUEST_SET_INFORMATION_INIT;
|
TCP_REQUEST_SET_INFORMATION_INIT;
|
||||||
IPRouteEntry *rte;
|
IPRouteEntry *rte;
|
||||||
TDIEntityID id;
|
TDIEntityID id;
|
||||||
|
|
|
@ -160,7 +160,13 @@ TDI_STATUS InfoTdiQueryGetRouteTable( PIP_INTERFACE IF,
|
||||||
PNDIS_BUFFER Buffer,
|
PNDIS_BUFFER Buffer,
|
||||||
PUINT BufferSize );
|
PUINT BufferSize );
|
||||||
|
|
||||||
TDI_STATUS InfoTdiSetRoute(PIP_INTERFACE IF, PIPROUTE_ENTRY Route);
|
TDI_STATUS InfoTdiSetRoute(PIP_INTERFACE IF,
|
||||||
|
PVOID Buffer,
|
||||||
|
UINT BufferSize);
|
||||||
|
|
||||||
|
TDI_STATUS InfoTdiSetArptableMIB(PIP_INTERFACE IF,
|
||||||
|
PVOID Buffer,
|
||||||
|
UINT BufferSize);
|
||||||
|
|
||||||
TDI_STATUS InfoTdiQueryGetArptableMIB(TDIEntityID ID,
|
TDI_STATUS InfoTdiQueryGetArptableMIB(TDIEntityID ID,
|
||||||
PIP_INTERFACE Interface,
|
PIP_INTERFACE Interface,
|
||||||
|
|
|
@ -134,6 +134,31 @@ TDI_STATUS InfoTdiQueryGetArptableMIB(TDIEntityID ID,
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TDI_STATUS InfoTdiSetArptableMIB(PIP_INTERFACE IF, PVOID Buffer, UINT BufferSize)
|
||||||
|
{
|
||||||
|
PIPARP_ENTRY ArpEntry = Buffer;
|
||||||
|
IP_ADDRESS Address;
|
||||||
|
PNEIGHBOR_CACHE_ENTRY NCE;
|
||||||
|
|
||||||
|
if (!Buffer || BufferSize < sizeof(IPARP_ENTRY))
|
||||||
|
return TDI_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
AddrInitIPv4(&Address, ArpEntry->LogAddr);
|
||||||
|
|
||||||
|
if ((NCE = NBLocateNeighbor(&Address)))
|
||||||
|
NBRemoveNeighbor(NCE);
|
||||||
|
|
||||||
|
if (NBAddNeighbor(IF,
|
||||||
|
&Address,
|
||||||
|
ArpEntry->PhysAddr,
|
||||||
|
ArpEntry->AddrSize,
|
||||||
|
NUD_PERMANENT,
|
||||||
|
0))
|
||||||
|
return TDI_SUCCESS;
|
||||||
|
else
|
||||||
|
return TDI_INVALID_PARAMETER;
|
||||||
|
}
|
||||||
|
|
||||||
VOID InsertTDIInterfaceEntity( PIP_INTERFACE Interface ) {
|
VOID InsertTDIInterfaceEntity( PIP_INTERFACE Interface ) {
|
||||||
KIRQL OldIrql;
|
KIRQL OldIrql;
|
||||||
UINT IFCount = 0, CLNLCount = 0, CLTLCount = 0, COTLCount = 0, ATCount = 0, ERCount = 0, i;
|
UINT IFCount = 0, CLNLCount = 0, CLTLCount = 0, COTLCount = 0, ATCount = 0, ERCount = 0, i;
|
||||||
|
|
|
@ -268,12 +268,18 @@ TDI_STATUS InfoTdiSetInformationEx
|
||||||
if (ID->toi_type != INFO_TYPE_PROVIDER)
|
if (ID->toi_type != INFO_TYPE_PROVIDER)
|
||||||
return TDI_INVALID_PARAMETER;
|
return TDI_INVALID_PARAMETER;
|
||||||
|
|
||||||
if (ID->toi_entity.tei_entity != CL_NL_ENTITY &&
|
if (ID->toi_entity.tei_entity == AT_ENTITY)
|
||||||
ID->toi_entity.tei_entity != CO_NL_ENTITY)
|
if ((EntityListContext = GetContext(ID->toi_entity)))
|
||||||
return TDI_INVALID_PARAMETER;
|
return InfoTdiSetArptableMIB(EntityListContext,
|
||||||
|
Buffer, BufferSize);
|
||||||
if ((EntityListContext = GetContext(ID->toi_entity)))
|
else
|
||||||
return InfoTdiSetRoute(EntityListContext, (PIPROUTE_ENTRY)Buffer);
|
return TDI_INVALID_PARAMETER;
|
||||||
|
else if (ID->toi_entity.tei_entity == CL_NL_ENTITY ||
|
||||||
|
ID->toi_entity.tei_entity == CO_NL_ENTITY)
|
||||||
|
if ((EntityListContext = GetContext(ID->toi_entity)))
|
||||||
|
return InfoTdiSetRoute(EntityListContext, Buffer, BufferSize);
|
||||||
|
else
|
||||||
|
return TDI_INVALID_PARAMETER;
|
||||||
else
|
else
|
||||||
return TDI_INVALID_PARAMETER;
|
return TDI_INVALID_PARAMETER;
|
||||||
|
|
||||||
|
|
|
@ -173,14 +173,18 @@ TDI_STATUS InfoTdiQueryGetIPSnmpInfo( TDIEntityID ID,
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
TDI_STATUS InfoTdiSetRoute(PIP_INTERFACE IF, PIPROUTE_ENTRY Route)
|
TDI_STATUS InfoTdiSetRoute(PIP_INTERFACE IF, PVOID Buffer, UINT BufferSize)
|
||||||
{
|
{
|
||||||
IP_ADDRESS Address, Netmask, Router;
|
IP_ADDRESS Address, Netmask, Router;
|
||||||
|
PIPROUTE_ENTRY Route = Buffer;
|
||||||
|
|
||||||
AddrInitIPv4( &Address, Route->Dest );
|
AddrInitIPv4( &Address, Route->Dest );
|
||||||
AddrInitIPv4( &Netmask, Route->Mask );
|
AddrInitIPv4( &Netmask, Route->Mask );
|
||||||
AddrInitIPv4( &Router, Route->Gw );
|
AddrInitIPv4( &Router, Route->Gw );
|
||||||
|
|
||||||
|
if (!Buffer || BufferSize < sizeof(IPROUTE_ENTRY))
|
||||||
|
return TDI_INVALID_PARAMETER;
|
||||||
|
|
||||||
if (IF == Loopback)
|
if (IF == Loopback)
|
||||||
{
|
{
|
||||||
DbgPrint("Failing attempt to add route to loopback adapter\n");
|
DbgPrint("Failing attempt to add route to loopback adapter\n");
|
||||||
|
|
Loading…
Reference in a new issue