diff --git a/reactos/drivers/net/afd/afd/afd.c b/reactos/drivers/net/afd/afd/afd.c index c2595a7e223..7b5aba9e639 100644 --- a/reactos/drivers/net/afd/afd/afd.c +++ b/reactos/drivers/net/afd/afd/afd.c @@ -60,7 +60,7 @@ AfdDispatch( AFD_DbgPrint(MAX_TRACE, ("Called. DeviceObject is at (0x%X), IRP is at (0x%X), IrpSp->FileObject (0x%X).\n", DeviceObject, Irp, IrpSp->FileObject)); - Irp->IoStatus.Information = 0; + Irp->IoStatus.Information = IrpSp->Parameters.DeviceIoControl.OutputBufferLength; switch (IrpSp->Parameters.DeviceIoControl.IoControlCode) { case IOCTL_AFD_BIND: @@ -103,7 +103,12 @@ AfdDispatch( Status = AfdDispConnect(Irp, IrpSp); break; + case IOCTL_AFD_GETNAME: + Status = AfdDispGetName(Irp, IrpSp); + break; + default: + Irp->IoStatus.Information = 0; AFD_DbgPrint(MIN_TRACE, ("Unknown IOCTL (0x%X).\n", IrpSp->Parameters.DeviceIoControl.IoControlCode)); Status = STATUS_NOT_IMPLEMENTED; @@ -121,7 +126,7 @@ AfdDispatch( } -VOID AfdUnload( +VOID STDCALL AfdUnload( PDRIVER_OBJECT DriverObject) /* * FUNCTION: Unloads the driver @@ -169,15 +174,15 @@ DriverEntry( KeInitializeSpinLock(&DeviceExt->FCBListLock); InitializeListHead(&DeviceExt->FCBListHead); - DriverObject->MajorFunction[IRP_MJ_CREATE] = (PDRIVER_DISPATCH)AfdCreate; - DriverObject->MajorFunction[IRP_MJ_CLOSE] = (PDRIVER_DISPATCH)AfdClose; - DriverObject->MajorFunction[IRP_MJ_READ] = (PDRIVER_DISPATCH)AfdRead; - DriverObject->MajorFunction[IRP_MJ_WRITE] = (PDRIVER_DISPATCH)AfdWrite; - DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = (PDRIVER_DISPATCH)AfdFileSystemControl; - DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = (PDRIVER_DISPATCH)AfdDispatch; - DriverObject->MajorFunction[IRP_MJ_CLEANUP] = (PDRIVER_DISPATCH)AfdClose; + DriverObject->MajorFunction[IRP_MJ_CREATE] = AfdCreate; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = AfdClose; + DriverObject->MajorFunction[IRP_MJ_READ] = AfdRead; + DriverObject->MajorFunction[IRP_MJ_WRITE] = AfdWrite; + DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL] = AfdFileSystemControl; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = AfdDispatch; + DriverObject->MajorFunction[IRP_MJ_CLEANUP] = AfdClose; - DriverObject->DriverUnload = (PDRIVER_UNLOAD)AfdUnload; + DriverObject->DriverUnload = AfdUnload; /* ExInitializeNPagedLookasideList( &BufferLookasideList, diff --git a/reactos/drivers/net/afd/afd/dispatch.c b/reactos/drivers/net/afd/afd/dispatch.c index bd8b98b99bc..d7cfdc2e708 100644 --- a/reactos/drivers/net/afd/afd/dispatch.c +++ b/reactos/drivers/net/afd/afd/dispatch.c @@ -921,4 +921,61 @@ NTSTATUS AfdDispConnect( return Status; } + +NTSTATUS AfdDispGetName( + PIRP Irp, + PIO_STACK_LOCATION IrpSp) +/* + * FUNCTION: Get socket name + * ARGUMENTS: + * Irp = Pointer to I/O request packet + * IrpSp = Pointer to current stack location of Irp + * RETURNS: + * Status of operation + */ +{ + NTSTATUS Status; + UINT InputBufferLength; + UINT OutputBufferLength; + PFILE_REQUEST_GETNAME Request; + PFILE_REPLY_GETNAME Reply; + PAFDFCB FCB; + PFILE_OBJECT FileObject; + + AFD_DbgPrint(MIN_TRACE, ("\n")); + + InputBufferLength = IrpSp->Parameters.DeviceIoControl.InputBufferLength; + OutputBufferLength = IrpSp->Parameters.DeviceIoControl.OutputBufferLength; + + /* Validate parameters */ + Status = STATUS_INVALID_PARAMETER; + if ((InputBufferLength >= sizeof(FILE_REQUEST_GETNAME)) && + (OutputBufferLength >= sizeof(FILE_REPLY_GETNAME))) { + FCB = IrpSp->FileObject->FsContext; + + Request = (PFILE_REQUEST_GETNAME)Irp->AssociatedIrp.SystemBuffer; + Reply = (PFILE_REPLY_GETNAME)Irp->AssociatedIrp.SystemBuffer; + + AFD_DbgPrint(MIN_TRACE, ("\n")); + + if (Request->Peer) { + if (FCB->State != SOCKET_STATE_CONNECTED) { + Reply->Status = WSAENOTCONN; + return STATUS_UNSUCCESSFUL; + } + FileObject = FCB->TdiConnectionObject; + } else { + FileObject = FCB->TdiAddressObject; + } + + /* FIXME: Implement */ + /* Make a TDI_QUERY_INFORMATION call to underlying TDI transport driver */ + Status = STATUS_UNSUCCESSFUL; + } + + AFD_DbgPrint(MAX_TRACE, ("Status (0x%X).\n", Status)); + + return Status; +} + /* EOF */ diff --git a/reactos/drivers/net/afd/afd/tdi.c b/reactos/drivers/net/afd/afd/tdi.c index ad7a5471a59..6b69bf9a6a2 100644 --- a/reactos/drivers/net/afd/afd/tdi.c +++ b/reactos/drivers/net/afd/afd/tdi.c @@ -322,8 +322,7 @@ NTSTATUS TdiConnect( DeviceObject = IoGetRelatedDeviceObject(ConnectionObject); - Status = TdiBuildConnectionInfo - (&RequestConnectionInfo, RemoteAddress); + Status = TdiBuildConnectionInfo(&RequestConnectionInfo, RemoteAddress); if (!NT_SUCCESS(Status)) return Status; diff --git a/reactos/drivers/net/afd/include/afd.h b/reactos/drivers/net/afd/include/afd.h index 7ddde65d380..32e61b82b41 100644 --- a/reactos/drivers/net/afd/include/afd.h +++ b/reactos/drivers/net/afd/include/afd.h @@ -258,6 +258,10 @@ NTSTATUS AfdDispConnect( PIRP Irp, PIO_STACK_LOCATION IrpSp); +NTSTATUS AfdDispGetName( + PIRP Irp, + PIO_STACK_LOCATION IrpSp); + /* Prototypes from event.c */ NTSTATUS AfdRegisterEventHandlers( diff --git a/reactos/drivers/net/tcpip/tcpip/main.c b/reactos/drivers/net/tcpip/tcpip/main.c index 6f9b55c53c8..7c9d2e2b59a 100644 --- a/reactos/drivers/net/tcpip/tcpip/main.c +++ b/reactos/drivers/net/tcpip/tcpip/main.c @@ -390,10 +390,7 @@ NTSTATUS TiCleanupFileObject( } -NTSTATUS -#ifndef _MSC_VER -STDCALL_FUNC -#endif +NTSTATUS STDCALL TiDispatchOpenClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) @@ -625,7 +622,7 @@ TiDispatch( } -VOID TiUnload( +VOID STDCALL TiUnload( PDRIVER_OBJECT DriverObject) /* * FUNCTION: Unloads the driver @@ -835,13 +832,13 @@ DriverEntry( TCPDeviceObject->Flags |= DO_DIRECT_IO; /* Initialize the driver object with this driver's entry points */ - DriverObject->MajorFunction[IRP_MJ_CREATE] = (PDRIVER_DISPATCH)TiDispatchOpenClose; - DriverObject->MajorFunction[IRP_MJ_CLOSE] = (PDRIVER_DISPATCH)TiDispatchOpenClose; - DriverObject->MajorFunction[IRP_MJ_CLEANUP] = (PDRIVER_DISPATCH)TiDispatchOpenClose; - DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = (PDRIVER_DISPATCH)TiDispatchInternal; - DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = (PDRIVER_DISPATCH)TiDispatch; + DriverObject->MajorFunction[IRP_MJ_CREATE] = TiDispatchOpenClose; + DriverObject->MajorFunction[IRP_MJ_CLOSE] = TiDispatchOpenClose; + DriverObject->MajorFunction[IRP_MJ_CLEANUP] = TiDispatchOpenClose; + DriverObject->MajorFunction[IRP_MJ_INTERNAL_DEVICE_CONTROL] = TiDispatchInternal; + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = TiDispatch; - DriverObject->DriverUnload = (PDRIVER_UNLOAD)TiUnload; + DriverObject->DriverUnload = TiUnload; return STATUS_SUCCESS; } diff --git a/reactos/drivers/net/tcpip/transport/tcp/tcp.c b/reactos/drivers/net/tcpip/transport/tcp/tcp.c index 7df8b737919..deacb35368b 100644 --- a/reactos/drivers/net/tcpip/transport/tcp/tcp.c +++ b/reactos/drivers/net/tcpip/transport/tcp/tcp.c @@ -408,12 +408,10 @@ NTSTATUS TCPConnect( return Status; } - /* Free the NDIS buffer */ - NdisFreeBuffer(NdisBuffer); - ExFreePool(DataBuffer); - KeReleaseSpinLock(&Connection->Lock, OldIrql); + Status = STATUS_PENDING; + TI_DbgPrint(MAX_TRACE, ("Leaving. Status (0x%X)\n", Status)); return Status; diff --git a/reactos/lib/msafd/misc/dllmain.c b/reactos/lib/msafd/misc/dllmain.c index 7c66dad326b..9f23b9291fd 100644 --- a/reactos/lib/msafd/misc/dllmain.c +++ b/reactos/lib/msafd/misc/dllmain.c @@ -632,6 +632,102 @@ WSPConnect( } +INT +WSPAPI +WSPGetSockName( + IN SOCKET s, + OUT LPSOCKADDR name, + IN OUT LPINT namelen, + OUT LPINT lpErrno) +{ + FILE_REQUEST_GETNAME Request; + FILE_REPLY_GETNAME Reply; + IO_STATUS_BLOCK Iosb; + NTSTATUS Status; + + AFD_DbgPrint(MAX_TRACE, ("s (0x%X).\n", s)); + + Request.Peer = FALSE; + + Status = NtDeviceIoControlFile( + (HANDLE)s, + NULL, + NULL, + NULL, + &Iosb, + IOCTL_AFD_GETNAME, + &Request, + sizeof(FILE_REQUEST_GETNAME), + &Reply, + sizeof(FILE_REPLY_GETNAME)); + if (Status == STATUS_PENDING) { + AFD_DbgPrint(MAX_TRACE, ("Waiting on transport.\n")); + /* FIXME: Wait only for blocking sockets */ + Status = NtWaitForSingleObject((HANDLE)s, FALSE, NULL); + } + + if (!NT_SUCCESS(Status)) { + *lpErrno = Reply.Status; + return INVALID_SOCKET; + } + else + { + *namelen = min(*namelen, Reply.NameSize); + RtlCopyMemory(name, &Reply.Name, *namelen); + } + + return 0; +} + + +INT +WSPAPI +WSPGetPeerName( + IN SOCKET s, + OUT LPSOCKADDR name, + IN OUT LPINT namelen, + OUT LPINT lpErrno) +{ + FILE_REQUEST_GETNAME Request; + FILE_REPLY_GETNAME Reply; + IO_STATUS_BLOCK Iosb; + NTSTATUS Status; + + AFD_DbgPrint(MAX_TRACE, ("s (0x%X).\n", s)); + + Request.Peer = TRUE; + + Status = NtDeviceIoControlFile( + (HANDLE)s, + NULL, + NULL, + NULL, + &Iosb, + IOCTL_AFD_GETNAME, + &Request, + sizeof(FILE_REQUEST_GETNAME), + &Reply, + sizeof(FILE_REPLY_GETNAME)); + if (Status == STATUS_PENDING) { + AFD_DbgPrint(MAX_TRACE, ("Waiting on transport.\n")); + /* FIXME: Wait only for blocking sockets */ + Status = NtWaitForSingleObject((HANDLE)s, FALSE, NULL); + } + + if (!NT_SUCCESS(Status)) { + *lpErrno = Reply.Status; + return INVALID_SOCKET; + } + else + { + *namelen = min(*namelen, Reply.NameSize); + RtlCopyMemory(name, &Reply.Name, *namelen); + } + + return 0; +} + + NTSTATUS OpenCommandChannel( VOID) /* diff --git a/reactos/lib/msafd/misc/stubs.c b/reactos/lib/msafd/misc/stubs.c index 003ff4d68b6..9f32e79e7f9 100644 --- a/reactos/lib/msafd/misc/stubs.c +++ b/reactos/lib/msafd/misc/stubs.c @@ -67,20 +67,6 @@ WSPGetOverlappedResult( } -INT -WSPAPI -WSPGetPeerName( - IN SOCKET s, - OUT LPSOCKADDR name, - IN OUT LPINT namelen, - OUT LPINT lpErrno) -{ - UNIMPLEMENTED - - return 0; -} - - BOOL WSPAPI WSPGetQOSByName( @@ -95,20 +81,6 @@ WSPGetQOSByName( } -INT -WSPAPI -WSPGetSockName( - IN SOCKET s, - OUT LPSOCKADDR name, - IN OUT LPINT namelen, - OUT LPINT lpErrno) -{ - UNIMPLEMENTED - - return 0; -} - - INT WSPAPI WSPGetSockOpt(