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:
Pierre Schweitzer 2015-12-05 18:29:57 +00:00
parent 667a3ce15c
commit eeec778bb2

View file

@ -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;