Author: cgutman Date: Fri Mar 13 00:14:03 2009 New Revision: 39988
URL: http://svn.reactos.org/svn/reactos?rev=39988&view=rev Log: - Separate AfdGetSockOrPeerName into AfdGetSockName and AfdGetPeerName - Rewrite AfdGetPeerName - I will change SEH to SEH2 before merging
Modified: branches/aicom-network-fixes/drivers/network/afd/afd/info.c branches/aicom-network-fixes/drivers/network/afd/afd/main.c branches/aicom-network-fixes/drivers/network/afd/include/afd.h
Modified: branches/aicom-network-fixes/drivers/network/afd/afd/info.c URL: http://svn.reactos.org/svn/reactos/branches/aicom-network-fixes/drivers/netw... ============================================================================== --- branches/aicom-network-fixes/drivers/network/afd/afd/info.c [iso-8859-1] (original) +++ branches/aicom-network-fixes/drivers/network/afd/afd/info.c [iso-8859-1] Fri Mar 13 00:14:03 2009 @@ -13,7 +13,7 @@ #include "debug.h" #include "pseh/pseh.h"
-NTSTATUS STDCALL +NTSTATUS NTAPI AfdGetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp ) { NTSTATUS Status = STATUS_SUCCESS; @@ -69,19 +69,20 @@ return UnlockAndMaybeComplete( FCB, Status, Irp, 0, NULL ); }
-NTSTATUS STDCALL -AfdGetSockOrPeerName( PDEVICE_OBJECT DeviceObject, PIRP Irp, - PIO_STACK_LOCATION IrpSp, BOOLEAN Local ) { +NTSTATUS NTAPI +AfdGetSockName( PDEVICE_OBJECT DeviceObject, PIRP Irp, + PIO_STACK_LOCATION IrpSp ) { NTSTATUS Status = STATUS_SUCCESS; PFILE_OBJECT FileObject = IrpSp->FileObject; PAFD_FCB FCB = FileObject->FsContext; - PMDL Mdl = NULL, SysMdl = NULL; - PTDI_CONNECTION_INFORMATION ConnInfo = NULL; - PTRANSPORT_ADDRESS TransAddr = NULL; - - AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB)); + PMDL Mdl = NULL;
if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp ); + + if( FCB->AddressFile.Object == NULL && FCB->Connection.Object == NULL ) { + return UnlockAndMaybeComplete( FCB, STATUS_INVALID_PARAMETER, Irp, 0, + NULL ); + }
Mdl = IoAllocateMdl ( Irp->UserBuffer, @@ -99,75 +100,69 @@ } _SEH_END;
if( NT_SUCCESS(Status) ) { - if( Local ) { - if( FCB->AddressFile.Object == NULL ) { - return UnlockAndMaybeComplete( FCB, STATUS_INVALID_PARAMETER, Irp, 0, - NULL ); - } - Status = TdiQueryInformation - ( FCB->AddressFile.Object, + ( FCB->Connection.Object ? FCB->Connection.Object : FCB->AddressFile.Object, TDI_QUERY_ADDRESS_INFO, Mdl ); - } else { - if( FCB->Connection.Object == NULL || (FCB->State != SOCKET_STATE_BOUND && FCB->State != SOCKET_STATE_CONNECTED) ) { - return UnlockAndMaybeComplete( FCB, STATUS_INVALID_PARAMETER, Irp, 0, - NULL ); - } - - if( NT_SUCCESS - ( Status = TdiBuildNullConnectionInfo - ( &ConnInfo, - FCB->LocalAddress->Address[0].AddressType ) ) ) { - SysMdl = IoAllocateMdl - ( ConnInfo, - sizeof( TDI_CONNECTION_INFORMATION ) + - TaLengthOfTransportAddress - ( ConnInfo->RemoteAddress ), - FALSE, - FALSE, - NULL ); - } - - if( SysMdl ) { - _SEH_TRY { - MmProbeAndLockPages( SysMdl, Irp->RequestorMode, IoModifyAccess ); - } _SEH_HANDLE { - AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n")); - Status = _SEH_GetExceptionCode(); - } _SEH_END; - } else Status = STATUS_NO_MEMORY; - - if( NT_SUCCESS(Status) ) { - Status = TdiQueryInformation - ( FCB->Connection.Object, - TDI_QUERY_CONNECTION_INFO, - SysMdl ); - } - - if( NT_SUCCESS(Status) ) { - TransAddr = - (PTRANSPORT_ADDRESS)MmGetSystemAddressForMdlSafe( Mdl, NormalPagePriority ); - - if( TransAddr ) - RtlCopyMemory( TransAddr, ConnInfo->RemoteAddress, - TaLengthOfTransportAddress - ( ConnInfo->RemoteAddress ) ); - else Status = STATUS_INSUFFICIENT_RESOURCES; - } - - if( ConnInfo ) ExFreePool( ConnInfo ); - if( SysMdl ) IoFreeMdl( SysMdl ); - if( TransAddr ) MmUnmapLockedPages( TransAddr, Mdl ); - MmUnlockPages( Mdl ); - IoFreeMdl( Mdl ); - } - } - } else { - Status = STATUS_INSUFFICIENT_RESOURCES; - } - - AFD_DbgPrint(MID_TRACE,("Returning %x\n", Status)); + } + } else + Status = STATUS_INSUFFICIENT_RESOURCES;
return UnlockAndMaybeComplete( FCB, Status, Irp, 0, NULL ); } + +NTSTATUS NTAPI +AfdGetPeerName( PDEVICE_OBJECT DeviceObject, PIRP Irp, + PIO_STACK_LOCATION IrpSp ) { + NTSTATUS Status = STATUS_SUCCESS; + PFILE_OBJECT FileObject = IrpSp->FileObject; + PAFD_FCB FCB = FileObject->FsContext; + PMDL Mdl = NULL; + PTDI_CONNECTION_INFORMATION ConnInfo = NULL; + + + if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp ); + + if (FCB->RemoteAddress == NULL) { + return UnlockAndMaybeComplete( FCB, STATUS_INVALID_PARAMETER, Irp, 0, NULL ); + } + + if(NT_SUCCESS(Status = TdiBuildNullConnectionInfo + (&ConnInfo, + FCB->RemoteAddress->Address[0].AddressType))) + { + Mdl = IoAllocateMdl(ConnInfo, + sizeof(TDI_CONNECTION_INFORMATION) + + TaLengthOfTransportAddress(ConnInfo->RemoteAddress), + FALSE, + FALSE, + NULL); + + if (Mdl) + { + _SEH_TRY { + MmProbeAndLockPages(Mdl, Irp->RequestorMode, IoModifyAccess); + } _SEH_HANDLE { + AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n")); + Status = _SEH_GetExceptionCode(); + } _SEH_END; + + if (NT_SUCCESS(Status)) + { + Status = TdiQueryInformation(FCB->Connection.Object, + TDI_QUERY_CONNECTION_INFO, + Mdl); + + if (NT_SUCCESS(Status)) + { + RtlCopyMemory(Irp->UserBuffer, ConnInfo->RemoteAddress, TaLengthOfTransportAddress + (ConnInfo->RemoteAddress)); + } + } + } + + ExFreePool(ConnInfo); + } + + return UnlockAndMaybeComplete( FCB, Status, Irp, 0, NULL ); +}
Modified: branches/aicom-network-fixes/drivers/network/afd/afd/main.c URL: http://svn.reactos.org/svn/reactos/branches/aicom-network-fixes/drivers/netw... ============================================================================== --- branches/aicom-network-fixes/drivers/network/afd/afd/main.c [iso-8859-1] (original) +++ branches/aicom-network-fixes/drivers/network/afd/afd/main.c [iso-8859-1] Fri Mar 13 00:14:03 2009 @@ -402,10 +402,10 @@ return AfdDisconnect( DeviceObject, Irp, IrpSp );
case IOCTL_AFD_GET_SOCK_NAME: - return AfdGetSockOrPeerName( DeviceObject, Irp, IrpSp, TRUE ); + return AfdGetSockName( DeviceObject, Irp, IrpSp );
case IOCTL_AFD_GET_PEER_NAME: - return AfdGetSockOrPeerName( DeviceObject, Irp, IrpSp, FALSE ); + return AfdGetPeerName( DeviceObject, Irp, IrpSp );
case IOCTL_AFD_GET_TDI_HANDLES: AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_GET_TDI_HANDLES\n"));
Modified: branches/aicom-network-fixes/drivers/network/afd/include/afd.h URL: http://svn.reactos.org/svn/reactos/branches/aicom-network-fixes/drivers/netw... ============================================================================== --- branches/aicom-network-fixes/drivers/network/afd/include/afd.h [iso-8859-1] (original) +++ branches/aicom-network-fixes/drivers/network/afd/include/afd.h [iso-8859-1] Fri Mar 13 00:14:03 2009 @@ -232,8 +232,12 @@ PIO_STACK_LOCATION IrpSp );
NTSTATUS STDCALL -AfdGetSockOrPeerName( PDEVICE_OBJECT DeviceObject, PIRP Irp, - PIO_STACK_LOCATION IrpSp, BOOLEAN Local ); +AfdGetSockName( PDEVICE_OBJECT DeviceObject, PIRP Irp, + PIO_STACK_LOCATION IrpSp ); + +NTSTATUS STDCALL +AfdGetPeerName( PDEVICE_OBJECT DeviceObject, PIRP Irp, + PIO_STACK_LOCATION IrpSp );
/* listen.c */ NTSTATUS AfdWaitForListen( PDEVICE_OBJECT DeviceObject, PIRP Irp,