Kill only selects involving a named file descriptor when clearing exclusive selects. This makes ASECHO32 work perfectly. Modified: trunk/reactos/drivers/net/afd/afd/main.c Modified: trunk/reactos/drivers/net/afd/afd/select.c Modified: trunk/reactos/drivers/net/afd/include/afd.h _____
Modified: trunk/reactos/drivers/net/afd/afd/main.c --- trunk/reactos/drivers/net/afd/afd/main.c 2005-02-06 00:01:21 UTC (rev 13429) +++ trunk/reactos/drivers/net/afd/afd/main.c 2005-02-06 07:56:45 UTC (rev 13430) @@ -225,7 +225,7 @@
FCB->PollState |= AFD_EVENT_CLOSE; PollReeval( FCB->DeviceExt, FileObject ); - KillSelectsForFCB( FCB->DeviceExt, FileObject ); + KillSelectsForFCB( FCB->DeviceExt, FileObject, FALSE );
if( FCB->EventSelect ) ObDereferenceObject( FCB->EventSelect );
_____
Modified: trunk/reactos/drivers/net/afd/afd/select.c --- trunk/reactos/drivers/net/afd/afd/select.c 2005-02-06 00:01:21 UTC (rev 13429) +++ trunk/reactos/drivers/net/afd/afd/select.c 2005-02-06 07:56:45 UTC (rev 13430) @@ -12,6 +12,25 @@
#include "tdiconn.h" #include "debug.h"
+VOID PrintEvents( ULONG Events ) { + char *events_list[] = { "AFD_EVENT_RECEIVE", + "AFD_EVENT_OOB_RECEIVE", + "AFD_EVENT_SEND", + "AFD_EVENT_DISCONNECT", + "AFD_EVENT_ABORT", + "AFD_EVENT_CLOSE", + "AFD_EVENT_CONNECT", + "AFD_EVENT_ACCEPT", + "AFD_EVENT_CONNECT_FAIL", + "AFD_EVENT_QOS", + "AFD_EVENT_GROUP_QOS", + NULL }; + int i; + + for( i = 0; events_list[i]; i++ ) + if( Events & (1 << i) ) DbgPrint("%s ", events_list[i] ); +} + VOID CopyBackStatus( PAFD_HANDLE HandleArray, UINT HandleCount ) { UINT i; @@ -94,7 +113,8 @@ }
VOID KillSelectsForFCB( PAFD_DEVICE_EXTENSION DeviceExt, - PFILE_OBJECT FileObject ) { + PFILE_OBJECT FileObject, + BOOLEAN OnlyExclusive ) { KIRQL OldIrql; PLIST_ENTRY ListEntry; PAFD_ACTIVE_POLL Poll; @@ -116,42 +136,19 @@ for( i = 0; i < PollReq->HandleCount; i++ ) { AFD_DbgPrint(MAX_TRACE,("Req: %x, This %x\n", PollReq->Handles[i].Handle, FileObject)); - if( (PVOID)PollReq->Handles[i].Handle == FileObject ) { + if( (PVOID)PollReq->Handles[i].Handle == FileObject && + (!OnlyExclusive || (OnlyExclusive && Poll->Exclusive)) ) { ZeroEvents( PollReq->Handles, PollReq->HandleCount ); SignalSocket( Poll, PollReq, STATUS_SUCCESS ); } } } - + KeReleaseSpinLock( &DeviceExt->Lock, OldIrql ); - + AFD_DbgPrint(MID_TRACE,("Done\n")); }
-VOID KillExclusiveSelects( PAFD_DEVICE_EXTENSION DeviceExt ) { - KIRQL OldIrql; - PLIST_ENTRY ListEntry; - PAFD_ACTIVE_POLL Poll; - PIRP Irp; - PAFD_POLL_INFO PollReq; - - KeAcquireSpinLock( &DeviceExt->Lock, &OldIrql ); - - ListEntry = DeviceExt->Polls.Flink; - while ( ListEntry != &DeviceExt->Polls ) { - Poll = CONTAINING_RECORD(ListEntry, AFD_ACTIVE_POLL, ListEntry); - ListEntry = ListEntry->Flink; - if( Poll->Exclusive ) { - Irp = Poll->Irp; - PollReq = Irp->AssociatedIrp.SystemBuffer; - ZeroEvents( PollReq->Handles, PollReq->HandleCount ); - SignalSocket( Poll, PollReq, STATUS_CANCELLED ); - } - } - - KeReleaseSpinLock( &DeviceExt->Lock, OldIrql ); -} - NTSTATUS STDCALL AfdSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp ) { @@ -175,9 +172,6 @@ SET_AFD_HANDLES(PollReq, LockHandles( PollReq->Handles, PollReq->HandleCount ));
- if( Exclusive ) KillExclusiveSelects( DeviceExt ); - - if( !AFD_HANDLES(PollReq) ) { Irp->IoStatus.Status = STATUS_NO_MEMORY; Irp->IoStatus.Information = 0; @@ -185,6 +179,16 @@ return Irp->IoStatus.Status; }
+ if( Exclusive ) { + for( i = 0; i < PollReq->HandleCount; i++ ) { + if( !AFD_HANDLES(PollReq)[i].Handle ) continue; + + KillSelectsForFCB( DeviceExt, + (PFILE_OBJECT)AFD_HANDLES(PollReq)[i].Handle, + TRUE ); + } + } + ZeroEvents( PollReq->Handles, PollReq->HandleCount );
@@ -218,6 +222,12 @@ PollReq->Handles[i].Status = AFD_EVENT_CLOSE; Signalled++; } else { +#ifdef DBG + DbgPrint("AFD: Select Events: "); + PrintEvents( PollReq->Handles[i].Events ); + DbgPrint("\n"); +#endif + PollReq->Handles[i].Status = PollReq->Handles[i].Events & FCB->PollState; if( PollReq->Handles[i].Status ) { _____
Modified: trunk/reactos/drivers/net/afd/include/afd.h --- trunk/reactos/drivers/net/afd/include/afd.h 2005-02-06 00:01:21 UTC (rev 13429) +++ trunk/reactos/drivers/net/afd/include/afd.h 2005-02-06 07:56:45 UTC (rev 13430) @@ -263,7 +263,7 @@
PIO_STACK_LOCATION IrpSp ); VOID PollReeval( PAFD_DEVICE_EXTENSION DeviceObject, PFILE_OBJECT FileObject ); VOID KillSelectsForFCB( PAFD_DEVICE_EXTENSION DeviceExt, - PFILE_OBJECT FileObject ); + PFILE_OBJECT FileObject, BOOLEAN ExclusiveOnly );
/* tdi.c */