diff --git a/reactos/dll/win32/msafd/misc/dllmain.c b/reactos/dll/win32/msafd/misc/dllmain.c index 15f91af02e5..3b4e65a51e2 100644 --- a/reactos/dll/win32/msafd/misc/dllmain.c +++ b/reactos/dll/win32/msafd/misc/dllmain.c @@ -2140,6 +2140,12 @@ WSPGetSockOpt(IN SOCKET Handle, BufferSize = sizeof(BOOL); break; + case SO_EXCLUSIVEADDRUSE: + BoolBuffer = (Socket->SharedData.ExclusiveAddressUse != 0); + Buffer = &BoolBuffer; + BufferSize = sizeof(BOOL); + break; + case SO_ERROR: /* HACK: This needs to be properly tracked */ IntBuffer = 0; @@ -2230,6 +2236,24 @@ WSPSetSockOpt( Socket->SharedData.LingerData.l_onoff = (*optval != 0) ? 0 : 1; return 0; + case SO_REUSEADDR: + if (optlen < sizeof(BOOL)) + { + *lpErrno = WSAEFAULT; + return SOCKET_ERROR; + } + Socket->SharedData.ReuseAddresses = (*optval != 0) ? 1 : 0; + return 0; + + case SO_EXCLUSIVEADDRUSE: + if (optlen < sizeof(BOOL)) + { + *lpErrno = WSAEFAULT; + return SOCKET_ERROR; + } + Socket->SharedData.ExclusiveAddressUse = (*optval != 0) ? 1 : 0; + return 0; + case SO_LINGER: if (optlen < sizeof(struct linger)) { diff --git a/reactos/drivers/network/afd/afd/bind.c b/reactos/drivers/network/afd/afd/bind.c index 700165883d5..bafba1a624e 100644 --- a/reactos/drivers/network/afd/afd/bind.c +++ b/reactos/drivers/network/afd/afd/bind.c @@ -10,7 +10,7 @@ #include "afd.h" -NTSTATUS WarmSocketForBind( PAFD_FCB FCB ) { +NTSTATUS WarmSocketForBind( PAFD_FCB FCB, ULONG ShareType ) { NTSTATUS Status; AFD_DbgPrint(MID_TRACE,("Called (AF %d)\n", @@ -27,6 +27,7 @@ NTSTATUS WarmSocketForBind( PAFD_FCB FCB ) { Status = TdiOpenAddressFile(&FCB->TdiDeviceName, FCB->LocalAddress, + ShareType, &FCB->AddressFile.Handle, &FCB->AddressFile.Object ); if (!NT_SUCCESS(Status)) @@ -92,7 +93,7 @@ AfdBindSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp, FCB->LocalAddress ); if( NT_SUCCESS(Status) ) - Status = WarmSocketForBind( FCB ); + Status = WarmSocketForBind( FCB, BindReq->ShareType ); AFD_DbgPrint(MID_TRACE,("FCB->Flags %x\n", FCB->Flags)); if (NT_SUCCESS(Status)) diff --git a/reactos/drivers/network/afd/afd/connect.c b/reactos/drivers/network/afd/afd/connect.c index 3a586729af2..f25c769e8cc 100644 --- a/reactos/drivers/network/afd/afd/connect.c +++ b/reactos/drivers/network/afd/afd/connect.c @@ -445,7 +445,7 @@ AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp, TaBuildNullTransportAddress( ConnectReq->RemoteAddress.Address[0].AddressType ); if( FCB->LocalAddress ) { - Status = WarmSocketForBind( FCB ); + Status = WarmSocketForBind( FCB, AFD_SHARE_WILDCARD ); if( NT_SUCCESS(Status) ) FCB->State = SOCKET_STATE_BOUND; diff --git a/reactos/drivers/network/afd/afd/tdi.c b/reactos/drivers/network/afd/afd/tdi.c index bbc80096dc8..f99186a861b 100644 --- a/reactos/drivers/network/afd/afd/tdi.c +++ b/reactos/drivers/network/afd/afd/tdi.c @@ -89,6 +89,7 @@ static NTSTATUS TdiOpenDevice( PUNICODE_STRING DeviceName, ULONG EaLength, PFILE_FULL_EA_INFORMATION EaInfo, + ULONG ShareType, PHANDLE Handle, PFILE_OBJECT *Object) /* @@ -106,8 +107,21 @@ static NTSTATUS TdiOpenDevice( OBJECT_ATTRIBUTES Attr; IO_STATUS_BLOCK Iosb; NTSTATUS Status; + ULONG ShareAccess; - AFD_DbgPrint(MAX_TRACE, ("Called. DeviceName (%wZ)\n", DeviceName)); + AFD_DbgPrint(MAX_TRACE, ("Called. DeviceName (%wZ, %d)\n", DeviceName, ShareType)); + + /* Determine the share access */ + if (ShareType != AFD_SHARE_REUSE) + { + /* Exclusive access */ + ShareAccess = 0; + } + else + { + /* Shared access */ + ShareAccess = FILE_SHARE_READ | FILE_SHARE_WRITE; + } InitializeObjectAttributes(&Attr, /* Attribute buffer */ DeviceName, /* Device name */ @@ -122,7 +136,7 @@ static NTSTATUS TdiOpenDevice( &Iosb, /* IO status */ 0, /* Initial allocation size */ FILE_ATTRIBUTE_NORMAL, /* File attributes */ - 0, /* Share access */ + ShareAccess, /* Share access */ FILE_OPEN_IF, /* Create disposition */ 0, /* Create options */ EaInfo, /* EA buffer */ @@ -156,6 +170,7 @@ static NTSTATUS TdiOpenDevice( NTSTATUS TdiOpenAddressFile( PUNICODE_STRING DeviceName, PTRANSPORT_ADDRESS Name, + ULONG ShareType, PHANDLE AddressHandle, PFILE_OBJECT *AddressObject) /* @@ -199,6 +214,7 @@ NTSTATUS TdiOpenAddressFile( Status = TdiOpenDevice(DeviceName, EaLength, EaInfo, + ShareType, AddressHandle, AddressObject); ExFreePool(EaInfo); @@ -300,6 +316,7 @@ NTSTATUS TdiOpenConnectionEndpointFile( Status = TdiOpenDevice(DeviceName, EaLength, EaInfo, + AFD_SHARE_UNIQUE, ConnectionHandle, ConnectionObject); ExFreePool(EaInfo); diff --git a/reactos/drivers/network/afd/afd/write.c b/reactos/drivers/network/afd/afd/write.c index 6a1a322544c..15738bd057c 100644 --- a/reactos/drivers/network/afd/afd/write.c +++ b/reactos/drivers/network/afd/afd/write.c @@ -527,7 +527,7 @@ AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp, Address[0].AddressType ); if( FCB->LocalAddress ) { - Status = WarmSocketForBind( FCB ); + Status = WarmSocketForBind( FCB, AFD_SHARE_WILDCARD ); if( NT_SUCCESS(Status) ) FCB->State = SOCKET_STATE_BOUND; diff --git a/reactos/drivers/network/afd/include/afd.h b/reactos/drivers/network/afd/include/afd.h index 04464ffff26..e55fffe2281 100644 --- a/reactos/drivers/network/afd/include/afd.h +++ b/reactos/drivers/network/afd/include/afd.h @@ -223,7 +223,7 @@ typedef struct _AFD_FCB { /* bind.c */ -NTSTATUS WarmSocketForBind( PAFD_FCB FCB ); +NTSTATUS WarmSocketForBind( PAFD_FCB FCB, ULONG ShareType ); NTSTATUS NTAPI AfdBindSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp); @@ -367,6 +367,7 @@ VOID SignalSocket( NTSTATUS TdiOpenAddressFile( PUNICODE_STRING DeviceName, PTRANSPORT_ADDRESS Name, + ULONG ShareType, PHANDLE AddressHandle, PFILE_OBJECT *AddressObject);