mirror of
https://github.com/reactos/reactos.git
synced 2024-09-13 06:11:59 +00:00
[MSAFD]
- merge r52438 - Fail SIO_GET_EXTENSION_FUNCTION_POINTER - Fixes the crash during ws2_32_winetest sock [AFD] - merge r52441 - Queue the user-mode connect IRP before calling TdiConnect to avoid a race if the TDI_CONNECT IRP is completed before we get a chance to queue the user-mode IRP to accept the connection - Change the non-blocking TDI helper functions to always return STATUS_PENDING if the completion function will be called to avoid duplicate handling of IRPs svn path=/branches/GSoC_2011/TcpIpDriver/; revision=52443
This commit is contained in:
parent
b8daab7cfb
commit
3f6a8fa6c2
|
@ -1986,6 +1986,9 @@ WSPIoctl(IN SOCKET Handle,
|
|||
*lpcbBytesReturned = sizeof(ULONG);
|
||||
return NO_ERROR;
|
||||
}
|
||||
case SIO_GET_EXTENSION_FUNCTION_POINTER:
|
||||
*lpErrno = WSAEINVAL;
|
||||
return SOCKET_ERROR;
|
||||
default:
|
||||
*lpErrno = Socket->HelperData->WSHIoctl(Socket->HelperContext,
|
||||
Handle,
|
||||
|
|
|
@ -520,24 +520,32 @@ AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
|||
TargetAddress->Options = FCB->ConnectOptions;
|
||||
TargetAddress->OptionsLength = FCB->ConnectOptionsSize;
|
||||
|
||||
Status = TdiConnect( &FCB->ConnectIrp.InFlightRequest,
|
||||
FCB->Connection.Object,
|
||||
TargetAddress,
|
||||
FCB->ConnectInfo,
|
||||
&FCB->ConnectIrp.Iosb,
|
||||
StreamSocketConnectComplete,
|
||||
FCB );
|
||||
|
||||
ExFreePool(TargetAddress);
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("Queueing IRP %x\n", Irp));
|
||||
DbgPrint("[AFD, AfdStreamSocketConnect] Queueing IRP %x\n", Irp);
|
||||
|
||||
if (Status == STATUS_PENDING)
|
||||
|
||||
FCB->State = SOCKET_STATE_CONNECTING;
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("Queueing IRP %x\n", Irp));
|
||||
Status = QueueUserModeIrp( FCB, Irp, FUNCTION_CONNECT );
|
||||
if (Status == STATUS_PENDING)
|
||||
{
|
||||
FCB->State = SOCKET_STATE_CONNECTING;
|
||||
return LeaveIrpUntilLater(FCB, Irp, FUNCTION_CONNECT);
|
||||
Status = TdiConnect( &FCB->ConnectIrp.InFlightRequest,
|
||||
FCB->Connection.Object,
|
||||
TargetAddress,
|
||||
FCB->ConnectInfo,
|
||||
&FCB->ConnectIrp.Iosb,
|
||||
StreamSocketConnectComplete,
|
||||
FCB );
|
||||
}
|
||||
|
||||
if (Status != STATUS_PENDING)
|
||||
FCB->State = SOCKET_STATE_BOUND;
|
||||
|
||||
ExFreePool(TargetAddress);
|
||||
|
||||
SocketStateUnlock(FCB);
|
||||
|
||||
return Status;
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
|
@ -358,13 +358,13 @@ NTSTATUS LostSocket(PIRP Irp)
|
|||
return Status;
|
||||
}
|
||||
|
||||
NTSTATUS LeaveIrpUntilLater(PAFD_FCB FCB, PIRP Irp, UINT Function)
|
||||
NTSTATUS QueueUserModeIrp(PAFD_FCB FCB, PIRP Irp, UINT Function)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
|
||||
/* Add the IRP to the queue in all cases (so AfdCancelHandler will work properly) */
|
||||
InsertTailList( &FCB->PendingIrpList[Function],
|
||||
&Irp->Tail.Overlay.ListEntry );
|
||||
&Irp->Tail.Overlay.ListEntry );
|
||||
|
||||
/* Acquire the cancel spin lock and check the cancel bit */
|
||||
IoAcquireCancelSpinLock(&Irp->CancelIrql);
|
||||
|
@ -389,8 +389,17 @@ NTSTATUS LeaveIrpUntilLater(PAFD_FCB FCB, PIRP Irp, UINT Function)
|
|||
AfdCancelHandler(IoGetCurrentIrpStackLocation(Irp)->DeviceObject, Irp);
|
||||
Status = STATUS_CANCELLED;
|
||||
}
|
||||
|
||||
SocketStateUnlock(FCB);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
NTSTATUS LeaveIrpUntilLater(PAFD_FCB FCB, PIRP Irp, UINT Function)
|
||||
{
|
||||
NTSTATUS Status;
|
||||
|
||||
Status = QueueUserModeIrp(FCB, Irp, Function);
|
||||
|
||||
SocketStateUnlock( FCB );
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
|
|
@ -331,7 +331,6 @@ NTSTATUS TdiConnect(
|
|||
*/
|
||||
{
|
||||
PDEVICE_OBJECT DeviceObject;
|
||||
NTSTATUS Status;
|
||||
|
||||
AFD_DbgPrint(MAX_TRACE, ("Called\n"));
|
||||
|
||||
|
@ -368,9 +367,9 @@ NTSTATUS TdiConnect(
|
|||
ConnectionCallInfo, /* Request connection information */
|
||||
ConnectionReturnInfo); /* Return connection information */
|
||||
|
||||
Status = TdiCall(*Irp, DeviceObject, NULL, Iosb);
|
||||
TdiCall(*Irp, DeviceObject, NULL, Iosb);
|
||||
|
||||
return Status;
|
||||
return STATUS_PENDING;
|
||||
}
|
||||
|
||||
|
||||
|
@ -388,7 +387,6 @@ NTSTATUS TdiAssociateAddressFile(
|
|||
{
|
||||
PDEVICE_OBJECT DeviceObject;
|
||||
IO_STATUS_BLOCK Iosb;
|
||||
NTSTATUS Status;
|
||||
KEVENT Event;
|
||||
PIRP Irp;
|
||||
|
||||
|
@ -425,9 +423,7 @@ NTSTATUS TdiAssociateAddressFile(
|
|||
NULL,
|
||||
AddressHandle);
|
||||
|
||||
Status = TdiCall(Irp, DeviceObject, &Event, &Iosb);
|
||||
|
||||
return Status;
|
||||
return TdiCall(Irp, DeviceObject, &Event, &Iosb);
|
||||
}
|
||||
|
||||
NTSTATUS TdiDisassociateAddressFile(
|
||||
|
@ -442,7 +438,6 @@ NTSTATUS TdiDisassociateAddressFile(
|
|||
{
|
||||
PDEVICE_OBJECT DeviceObject;
|
||||
IO_STATUS_BLOCK Iosb;
|
||||
NTSTATUS Status;
|
||||
KEVENT Event;
|
||||
PIRP Irp;
|
||||
|
||||
|
@ -475,9 +470,7 @@ NTSTATUS TdiDisassociateAddressFile(
|
|||
NULL,
|
||||
NULL);
|
||||
|
||||
Status = TdiCall(Irp, DeviceObject, &Event, &Iosb);
|
||||
|
||||
return Status;
|
||||
return TdiCall(Irp, DeviceObject, &Event, &Iosb);
|
||||
}
|
||||
|
||||
NTSTATUS TdiListen
|
||||
|
@ -499,7 +492,6 @@ NTSTATUS TdiListen
|
|||
*/
|
||||
{
|
||||
PDEVICE_OBJECT DeviceObject;
|
||||
NTSTATUS Status;
|
||||
|
||||
AFD_DbgPrint(MAX_TRACE, ("[AFD, TDIListen] Called\n"));
|
||||
DbgPrint("[AFD, TDIListen] Called\n");
|
||||
|
@ -536,11 +528,9 @@ NTSTATUS TdiListen
|
|||
*RequestConnectionInfo, /* Request connection information */
|
||||
*ReturnConnectionInfo); /* Return connection information */
|
||||
|
||||
Status = TdiCall(*Irp, DeviceObject, NULL /* Don't wait for completion */, Iosb);
|
||||
TdiCall(*Irp, DeviceObject, NULL /* Don't wait for completion */, Iosb);
|
||||
|
||||
DbgPrint("[AFD, TDIListen] Done. Status = 0x%x\n", Status);
|
||||
|
||||
return Status;
|
||||
return STATUS_PENDING;
|
||||
}
|
||||
|
||||
|
||||
|
@ -564,7 +554,6 @@ NTSTATUS TdiSetEventHandler(
|
|||
{
|
||||
PDEVICE_OBJECT DeviceObject;
|
||||
IO_STATUS_BLOCK Iosb;
|
||||
NTSTATUS Status;
|
||||
KEVENT Event;
|
||||
PIRP Irp;
|
||||
|
||||
|
@ -602,9 +591,7 @@ NTSTATUS TdiSetEventHandler(
|
|||
Handler,
|
||||
Context);
|
||||
|
||||
Status = TdiCall(Irp, DeviceObject, &Event, &Iosb);
|
||||
|
||||
return Status;
|
||||
return TdiCall(Irp, DeviceObject, &Event, &Iosb);
|
||||
}
|
||||
|
||||
|
||||
|
@ -685,7 +672,6 @@ NTSTATUS TdiQueryInformation(
|
|||
{
|
||||
PDEVICE_OBJECT DeviceObject;
|
||||
IO_STATUS_BLOCK Iosb;
|
||||
NTSTATUS Status;
|
||||
KEVENT Event;
|
||||
PIRP Irp;
|
||||
|
||||
|
@ -720,9 +706,7 @@ NTSTATUS TdiQueryInformation(
|
|||
QueryType,
|
||||
MdlBuffer);
|
||||
|
||||
Status = TdiCall(Irp, DeviceObject, &Event, &Iosb);
|
||||
|
||||
return Status;
|
||||
return TdiCall(Irp, DeviceObject, &Event, &Iosb);
|
||||
}
|
||||
|
||||
NTSTATUS TdiQueryInformationEx(
|
||||
|
@ -912,7 +896,6 @@ NTSTATUS TdiSend
|
|||
PVOID CompletionContext )
|
||||
{
|
||||
PDEVICE_OBJECT DeviceObject;
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
PMDL Mdl;
|
||||
|
||||
ASSERT(*Irp == NULL);
|
||||
|
@ -975,11 +958,11 @@ NTSTATUS TdiSend
|
|||
Flags, /* Flags */
|
||||
BufferLength); /* Length of data */
|
||||
|
||||
Status = TdiCall(*Irp, DeviceObject, NULL, Iosb);
|
||||
TdiCall(*Irp, DeviceObject, NULL, Iosb);
|
||||
/* Does not block... The MDL is deleted in the receive completion
|
||||
routine. */
|
||||
|
||||
return Status;
|
||||
return STATUS_PENDING;
|
||||
}
|
||||
|
||||
NTSTATUS TdiReceive(
|
||||
|
@ -992,7 +975,6 @@ NTSTATUS TdiReceive(
|
|||
PIO_COMPLETION_ROUTINE CompletionRoutine,
|
||||
PVOID CompletionContext)
|
||||
{
|
||||
NTSTATUS Status = STATUS_SUCCESS;
|
||||
PDEVICE_OBJECT DeviceObject;
|
||||
PMDL Mdl;
|
||||
|
||||
|
@ -1043,7 +1025,7 @@ NTSTATUS TdiReceive(
|
|||
AFD_DbgPrint(MIN_TRACE, ("MmProbeAndLockPages() failed.\n"));
|
||||
IoFreeMdl(Mdl);
|
||||
IoCompleteRequest(*Irp, IO_NO_INCREMENT);
|
||||
*Irp = NULL;
|
||||
*Irp = NULL;
|
||||
_SEH2_YIELD(return STATUS_INSUFFICIENT_RESOURCES);
|
||||
} _SEH2_END;
|
||||
|
||||
|
@ -1059,14 +1041,11 @@ NTSTATUS TdiReceive(
|
|||
BufferLength); /* Length of data */
|
||||
|
||||
|
||||
Status = TdiCall(*Irp, DeviceObject, NULL, Iosb);
|
||||
TdiCall(*Irp, DeviceObject, NULL, Iosb);
|
||||
/* Does not block... The MDL is deleted in the receive completion
|
||||
routine. */
|
||||
|
||||
AFD_DbgPrint(MID_TRACE,("Status %x Information %d\n",
|
||||
Status, Iosb->Information));
|
||||
|
||||
return Status;
|
||||
return STATUS_PENDING;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1093,7 +1072,6 @@ NTSTATUS TdiReceiveDatagram(
|
|||
*/
|
||||
{
|
||||
PDEVICE_OBJECT DeviceObject;
|
||||
NTSTATUS Status;
|
||||
PMDL Mdl;
|
||||
|
||||
ASSERT(*Irp == NULL);
|
||||
|
@ -1159,11 +1137,11 @@ NTSTATUS TdiReceiveDatagram(
|
|||
Addr,
|
||||
Flags); /* Length of data */
|
||||
|
||||
Status = TdiCall(*Irp, DeviceObject, NULL, Iosb);
|
||||
TdiCall(*Irp, DeviceObject, NULL, Iosb);
|
||||
/* Does not block... The MDL is deleted in the receive completion
|
||||
routine. */
|
||||
|
||||
return Status;
|
||||
return STATUS_PENDING;
|
||||
}
|
||||
|
||||
|
||||
|
@ -1189,7 +1167,6 @@ NTSTATUS TdiSendDatagram(
|
|||
*/
|
||||
{
|
||||
PDEVICE_OBJECT DeviceObject;
|
||||
NTSTATUS Status;
|
||||
PMDL Mdl;
|
||||
|
||||
ASSERT(*Irp == NULL);
|
||||
|
@ -1256,11 +1233,11 @@ NTSTATUS TdiSendDatagram(
|
|||
BufferLength, /* Bytes to send */
|
||||
Addr); /* Address */
|
||||
|
||||
Status = TdiCall(*Irp, DeviceObject, NULL, Iosb);
|
||||
TdiCall(*Irp, DeviceObject, NULL, Iosb);
|
||||
/* Does not block... The MDL is deleted in the send completion
|
||||
routine. */
|
||||
|
||||
return Status;
|
||||
return STATUS_PENDING;
|
||||
}
|
||||
|
||||
NTSTATUS TdiDisconnect(
|
||||
|
@ -1273,7 +1250,6 @@ NTSTATUS TdiDisconnect(
|
|||
PTDI_CONNECTION_INFORMATION RequestConnectionInfo,
|
||||
PTDI_CONNECTION_INFORMATION ReturnConnectionInfo) {
|
||||
PDEVICE_OBJECT DeviceObject;
|
||||
NTSTATUS Status;
|
||||
KEVENT Event;
|
||||
PIRP Irp;
|
||||
|
||||
|
@ -1315,9 +1291,7 @@ NTSTATUS TdiDisconnect(
|
|||
RequestConnectionInfo, /* Indication of who to disconnect */
|
||||
ReturnConnectionInfo); /* Indication of who disconnected */
|
||||
|
||||
Status = TdiCall(Irp, DeviceObject, &Event, Iosb);
|
||||
|
||||
return Status;
|
||||
return TdiCall(Irp, DeviceObject, &Event, Iosb);
|
||||
}
|
||||
|
||||
/* EOF */
|
||||
|
|
|
@ -302,10 +302,14 @@ VOID UnlockHandles( PAFD_HANDLE HandleArray, UINT HandleCount );
|
|||
PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp );
|
||||
VOID UnlockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp );
|
||||
PVOID GetLockedData( PIRP Irp, PIO_STACK_LOCATION IrpSp );
|
||||
NTSTATUS LeaveIrpUntilLater( PAFD_FCB FCB, PIRP Irp, UINT Function );
|
||||
NTSTATUS QueueUserModeIrp(PAFD_FCB FCB, PIRP Irp, UINT Function);
|
||||
|
||||
NTSTATUS LeaveIrpUntilLater(PAFD_FCB FCB, PIRP Irp, UINT Function);
|
||||
NTSTATUS QueueUserModeIrp(PAFD_FCB FCB, PIRP Irp, UINT Function);
|
||||
|
||||
/* main.c */
|
||||
|
||||
NTSTATUS LeaveIrpUntilLater( PAFD_FCB FCB, PIRP Irp, UINT Function );
|
||||
VOID DestroySocket( PAFD_FCB FCB );
|
||||
VOID NTAPI AfdCancelHandler(PDEVICE_OBJECT DeviceObject,
|
||||
PIRP Irp);
|
||||
|
|
Loading…
Reference in a new issue