mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-08-29 12:23:30 +00:00
[TCPIP]
DispTdiQueryIpHwAddress(): use the correct function to get the interface associated with an IP address. Also, because local links aren't in the ARP table (obviously), handle them without the mechanism described previously This fixes arpinging oneself. svn path=/trunk/; revision=70277
This commit is contained in:
@@ -1681,6 +1681,27 @@ NTSTATUS DispTdiQueryIpHwAddress( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STA
|
||||
AddrInitIPv4(&Remote, IPs[0]);
|
||||
AddrInitIPv4(&Local, IPs[1]);
|
||||
|
||||
if (AddrIsUnspecified(&Remote)) {
|
||||
Status = STATUS_UNSUCCESSFUL;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
Interface = AddrLocateInterface(&Remote);
|
||||
if (Interface) {
|
||||
PVOID OutputBuffer;
|
||||
|
||||
if (Interface->AddressLength > IrpSp->Parameters.DeviceIoControl.OutputBufferLength) {
|
||||
Status = STATUS_INVALID_BUFFER_SIZE;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
OutputBuffer = Irp->AssociatedIrp.SystemBuffer;
|
||||
RtlCopyMemory(OutputBuffer, Interface->Address, Interface->AddressLength);
|
||||
Irp->IoStatus.Information = Interface->AddressLength;
|
||||
Status = STATUS_SUCCESS;
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
if (AddrIsUnspecified(&Local)) {
|
||||
NCE = RouteGetRouteToDestination(&Remote);
|
||||
if (NCE == NULL) {
|
||||
@@ -1691,7 +1712,7 @@ NTSTATUS DispTdiQueryIpHwAddress( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STA
|
||||
Interface = NCE->Interface;
|
||||
}
|
||||
else {
|
||||
Interface = FindOnLinkInterface(&Local);
|
||||
Interface = AddrLocateInterface(&Local);
|
||||
if (Interface == NULL) {
|
||||
Status = STATUS_NETWORK_UNREACHABLE;
|
||||
goto Exit;
|
||||
|
||||
Reference in New Issue
Block a user