mirror of
https://github.com/reactos/reactos.git
synced 2025-02-24 17:34:57 +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:
parent
667a3ce15c
commit
eeec778bb2
1 changed files with 22 additions and 1 deletions
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue