Index: dll/win32/msafd/misc/dllmain.c =================================================================== --- dll/win32/msafd/misc/dllmain.c (revision 68122) +++ dll/win32/msafd/misc/dllmain.c (working copy) @@ -341,6 +341,9 @@ return WSAENOBUFS; case STATUS_INVALID_CONNECTION: + return WSAENOTCONN; + + case STATUS_PROTOCOL_NOT_SUPPORTED: return WSAEAFNOSUPPORT; case STATUS_INVALID_ADDRESS: @@ -1375,7 +1378,7 @@ { NtClose(SockEvent); WSPCloseSocket( AcceptSocket, lpErrno ); - MsafdReturnWithErrno( STATUS_INVALID_CONNECTION, lpErrno, 0, NULL ); + MsafdReturnWithErrno( STATUS_PROTOCOL_NOT_SUPPORTED, lpErrno, 0, NULL ); return INVALID_SOCKET; } Index: drivers/network/afd/afd/tdi.c =================================================================== --- drivers/network/afd/afd/tdi.c (revision 68122) +++ drivers/network/afd/afd/tdi.c (working copy) @@ -1174,6 +1174,12 @@ AFD_DbgPrint(MIN_TRACE, ("Bad device object.\n")); return STATUS_INVALID_PARAMETER; } + + if (BufferLength == 0) + { + AFD_DbgPrint(MIN_TRACE, ("Succeeding send with length 0.\n")); + return STATUS_SUCCESS; + } *Irp = TdiBuildInternalDeviceControlIrp(TDI_SEND_DATAGRAM, /* Sub function */ DeviceObject, /* Device object */ Index: drivers/network/afd/afd/write.c =================================================================== --- drivers/network/afd/afd/write.c (revision 68122) +++ drivers/network/afd/afd/write.c (working copy) @@ -379,13 +379,23 @@ Status = QueueUserModeIrp(FCB, Irp, FUNCTION_SEND); if (Status == STATUS_PENDING) { - TdiSendDatagram(&FCB->SendIrp.InFlightRequest, - FCB->AddressFile.Object, - SendReq->BufferArray[0].buf, - SendReq->BufferArray[0].len, - TargetAddress, - PacketSocketSendComplete, - FCB); + Status = TdiSendDatagram(&FCB->SendIrp.InFlightRequest, + FCB->AddressFile.Object, + SendReq->BufferArray[0].buf, + SendReq->BufferArray[0].len, + TargetAddress, + PacketSocketSendComplete, + FCB); + if (Status != STATUS_PENDING) + { + NT_VERIFY(RemoveHeadList(&FCB->PendingIrpList[FUNCTION_SEND]) == &Irp->Tail.Overlay.ListEntry); + Irp->IoStatus.Status = Status; + Irp->IoStatus.Information = 0; + (void)IoSetCancelRoutine(Irp, NULL); + UnlockBuffers(SendReq->BufferArray, SendReq->BufferCount, FALSE); + UnlockRequest(Irp, IoGetCurrentIrpStackLocation(Irp)); + IoCompleteRequest(Irp, IO_NETWORK_INCREMENT); + } } ExFreePool( TargetAddress ); @@ -442,15 +452,9 @@ AFD_DbgPrint(MID_TRACE,("Socket state %u\n", FCB->State)); if( FCB->State != SOCKET_STATE_CONNECTED ) { - if (!(SendReq->AfdFlags & AFD_OVERLAPPED) && - ((SendReq->AfdFlags & AFD_IMMEDIATE) || (FCB->NonBlocking))) { - AFD_DbgPrint(MID_TRACE,("Nonblocking\n")); - UnlockBuffers( SendReq->BufferArray, SendReq->BufferCount, FALSE ); - return UnlockAndMaybeComplete( FCB, STATUS_CANT_WAIT, Irp, 0 ); - } else { - AFD_DbgPrint(MID_TRACE,("Queuing request\n")); - return LeaveIrpUntilLater( FCB, Irp, FUNCTION_SEND ); - } + AFD_DbgPrint(MID_TRACE,("Socket not connected\n")); + UnlockBuffers( SendReq->BufferArray, SendReq->BufferCount, FALSE ); + return UnlockAndMaybeComplete( FCB, STATUS_INVALID_CONNECTION, Irp, 0 ); } AFD_DbgPrint(MID_TRACE,("FCB->Send.BytesUsed = %u\n", @@ -637,13 +641,23 @@ Status = QueueUserModeIrp(FCB, Irp, FUNCTION_SEND); if (Status == STATUS_PENDING) { - TdiSendDatagram(&FCB->SendIrp.InFlightRequest, - FCB->AddressFile.Object, - SendReq->BufferArray[0].buf, - SendReq->BufferArray[0].len, - TargetAddress, - PacketSocketSendComplete, - FCB); + Status = TdiSendDatagram(&FCB->SendIrp.InFlightRequest, + FCB->AddressFile.Object, + SendReq->BufferArray[0].buf, + SendReq->BufferArray[0].len, + TargetAddress, + PacketSocketSendComplete, + FCB); + if (Status != STATUS_PENDING) + { + NT_VERIFY(RemoveHeadList(&FCB->PendingIrpList[FUNCTION_SEND]) == &Irp->Tail.Overlay.ListEntry); + Irp->IoStatus.Status = Status; + Irp->IoStatus.Information = 0; + (void)IoSetCancelRoutine(Irp, NULL); + UnlockBuffers(SendReq->BufferArray, SendReq->BufferCount, FALSE); + UnlockRequest(Irp, IoGetCurrentIrpStackLocation(Irp)); + IoCompleteRequest(Irp, IO_NETWORK_INCREMENT); + } } ExFreePool(TargetAddress); Index: include/psdk/ntstatus.h =================================================================== --- include/psdk/ntstatus.h (revision 68122) +++ include/psdk/ntstatus.h (working copy) @@ -942,6 +942,12 @@ #define STATUS_ASSERTION_FAILURE ((NTSTATUS)0xC0000420L) #define STATUS_CALLBACK_POP_STACK ((NTSTATUS)0xC0000423) #define STATUS_WOW_ASSERTION ((NTSTATUS)0xC0009898) +#define STATUS_INVALID_SIGNATURE ((NTSTATUS)0xC000A000) +#define STATUS_HMAC_NOT_SUPPORTED ((NTSTATUS)0xC000A001) +#define STATUS_IPSEC_QUEUE_OVERFLOW ((NTSTATUS)0xC000A010) +#define STATUS_ND_QUEUE_OVERFLOW ((NTSTATUS)0xC000A011) +#define STATUS_HOPLIMIT_EXCEEDED ((NTSTATUS)0xC000A012) +#define STATUS_PROTOCOL_NOT_SUPPORTED ((NTSTATUS)0xC000A013) #define RPC_NT_INVALID_STRING_BINDING ((NTSTATUS)0xC0020001) #define RPC_NT_WRONG_KIND_OF_BINDING ((NTSTATUS)0xC0020002)