UINT HandleCount ) {
UINT i;
- for( i = 0; i < HandleCount; i++ )
+ for( i = 0; i < HandleCount; i++ ) {
HandleArray[i].Status = 0;
+ HandleArray[i].Events = 0;
+ }
}
PollReq->Handles[i].Status));
}
UnlockHandles( AFD_HANDLES(PollReq), PollReq->HandleCount );
+ if( Irp->MdlAddress ) UnlockRequest( Irp, IoGetCurrentIrpStackLocation( Irp ) );
AFD_DbgPrint(MID_TRACE,("Completing\n"));
IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
AFD_DbgPrint(MID_TRACE,("Done\n"));
if( (PVOID)HandleArray[i].Handle == FileObject &&
(!OnlyExclusive || (OnlyExclusive && Poll->Exclusive)) ) {
ZeroEvents( PollReq->Handles, PollReq->HandleCount );
- SignalSocket( Poll, NULL, PollReq, STATUS_SUCCESS );
+ SignalSocket( Poll, NULL, PollReq, STATUS_CANCELLED );
}
}
}
AFD_DbgPrint(MID_TRACE,("Done\n"));
}
-NTSTATUS STDCALL
+NTSTATUS NTAPI
AfdSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp ) {
NTSTATUS Status = STATUS_NO_MEMORY;
Irp->IoStatus.Status = STATUS_NO_MEMORY;
Irp->IoStatus.Information = 0;
IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
- return Irp->IoStatus.Status;
+ return STATUS_NO_MEMORY;
}
if( Exclusive ) {
}
}
- ZeroEvents( PollReq->Handles,
- PollReq->HandleCount );
-
KeAcquireSpinLock( &DeviceExt->Lock, &OldIrql );
for( i = 0; i < PollReq->HandleCount; i++ ) {
FileObject = (PFILE_OBJECT)AFD_HANDLES(PollReq)[i].Handle;
FCB = FileObject->FsContext;
- if( (FCB->PollState & AFD_EVENT_CLOSE) ||
- (PollReq->Handles[i].Status & AFD_EVENT_CLOSE) ) {
- AFD_HANDLES(PollReq)[i].Handle = 0;
- PollReq->Handles[i].Events = 0;
- PollReq->Handles[i].Status = AFD_EVENT_CLOSE;
- Signalled++;
- } else {
- AFD_DbgPrint(MID_TRACE, ("AFD: Select Events: "));
- PrintEvents( PollReq->Handles[i].Events );
- AFD_DbgPrint(MID_TRACE,("\n"));
-
- PollReq->Handles[i].Status =
+ AFD_DbgPrint(MID_TRACE, ("AFD: Select Events: "));
+ PrintEvents( PollReq->Handles[i].Events );
+ AFD_DbgPrint(MID_TRACE,("\n"));
+
+ PollReq->Handles[i].Status =
PollReq->Handles[i].Events & FCB->PollState;
- if( PollReq->Handles[i].Status ) {
+ if( PollReq->Handles[i].Status ) {
AFD_DbgPrint(MID_TRACE,("Signalling %x with %x\n",
FCB, FCB->PollState));
Signalled++;
- }
}
}
return Status;
}
-NTSTATUS STDCALL
+NTSTATUS NTAPI
AfdEventSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp ) {
PFILE_OBJECT FileObject = IrpSp->FileObject;
(PAFD_EVENT_SELECT_INFO)LockRequest( Irp, IrpSp );
PAFD_FCB FCB = FileObject->FsContext;
+ if( !SocketAcquireStateLock( FCB ) ) {
+ return LostSocket( Irp );
+ }
+
if ( !EventSelectInfo ) {
return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp,
- 0, NULL );
+ 0 );
}
AFD_DbgPrint(MID_TRACE,("Called (Event %x Triggers %x)\n",
EventSelectInfo->EventObject,
EventSelectInfo->Events));
- if( !SocketAcquireStateLock( FCB ) ) {
- return LostSocket( Irp );
- }
-
- FCB->EventSelectTriggers = FCB->EventsFired = 0;
if( FCB->EventSelect ) ObDereferenceObject( FCB->EventSelect );
FCB->EventSelect = NULL;
FCB->EventSelect = NULL;
else
FCB->EventSelectTriggers = EventSelectInfo->Events;
- } else /* Work done, cancelling select */
- Status = STATUS_SUCCESS;
+ } else
+ Status = STATUS_INVALID_PARAMETER;
AFD_DbgPrint(MID_TRACE,("Returning %x\n", Status));
- return UnlockAndMaybeComplete( FCB, STATUS_SUCCESS, Irp,
- 0, NULL );
+ return UnlockAndMaybeComplete( FCB, Status, Irp,
+ 0 );
}
-NTSTATUS STDCALL
+NTSTATUS NTAPI
AfdEnumEvents( PDEVICE_OBJECT DeviceObject, PIRP Irp,
PIO_STACK_LOCATION IrpSp ) {
PFILE_OBJECT FileObject = IrpSp->FileObject;
AFD_DbgPrint(MID_TRACE,("Called (FCB %x)\n", FCB));
- if ( !EnumReq ) {
- return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp,
- 0, NULL );
- }
-
if( !SocketAcquireStateLock( FCB ) ) {
return LostSocket( Irp );
}
+ if ( !EnumReq ) {
+ return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp,
+ 0 );
+ }
+
EnumReq->PollEvents = FCB->PollState;
RtlZeroMemory( EnumReq->EventStatus, sizeof(EnumReq->EventStatus) );
return UnlockAndMaybeComplete( FCB, STATUS_SUCCESS, Irp,
- 0, NULL );
+ 0 );
}
/* * * NOTE ALWAYS CALLED AT DISPATCH_LEVEL * * */
FileObject = (PFILE_OBJECT)AFD_HANDLES(PollReq)[i].Handle;
FCB = FileObject->FsContext;
- if( (FCB->PollState & AFD_EVENT_CLOSE) ||
- (PollReq->Handles[i].Status & AFD_EVENT_CLOSE) ) {
- AFD_HANDLES(PollReq)[i].Handle = 0;
- PollReq->Handles[i].Events = 0;
- PollReq->Handles[i].Status = AFD_EVENT_CLOSE;
- Signalled++;
- } else {
- PollReq->Handles[i].Status =
- PollReq->Handles[i].Events & FCB->PollState;
- if( PollReq->Handles[i].Status ) {
- AFD_DbgPrint(MID_TRACE,("Signalling %x with %x\n",
+ PollReq->Handles[i].Status = PollReq->Handles[i].Events & FCB->PollState;
+ if( PollReq->Handles[i].Status ) {
+ AFD_DbgPrint(MID_TRACE,("Signalling %x with %x\n",
FCB, FCB->PollState));
- Signalled++;
- }
+ Signalled++;
}
}
PAFD_FCB FCB;
KIRQL OldIrql;
PAFD_POLL_INFO PollReq;
- PKEVENT EventSelect = NULL;
AFD_DbgPrint(MID_TRACE,("Called: DeviceExt %x FileObject %x\n",
DeviceExt, FileObject));
/* Take care of any event select signalling */
FCB = (PAFD_FCB)FileObject->FsContext;
- /* Not sure if i can do this at DISPATCH_LEVEL ... try it at passive */
- AFD_DbgPrint(MID_TRACE,("Current State: %x, Events Fired: %x, "
- "Select Triggers %x\n",
- FCB->PollState, FCB->EventsFired,
- FCB->EventSelectTriggers));
- if( FCB->PollState & ~FCB->EventsFired & FCB->EventSelectTriggers ) {
- FCB->EventsFired |= FCB->PollState;
- EventSelect = FCB->EventSelect;
- }
-
if( !FCB ) {
KeReleaseSpinLock( &DeviceExt->Lock, OldIrql );
return;
KeReleaseSpinLock( &DeviceExt->Lock, OldIrql );
- AFD_DbgPrint(MID_TRACE,("Setting event %x\n", EventSelect));
- if( EventSelect ) KeSetEvent( EventSelect, IO_NETWORK_INCREMENT, FALSE );
+ if( FCB->EventSelect && (FCB->PollState & FCB->EventSelectTriggers) ) {
+ AFD_DbgPrint(MID_TRACE,("Setting event %x\n", FCB->EventSelect));
+ KeSetEvent( FCB->EventSelect, IO_NETWORK_INCREMENT, FALSE );
+ }
AFD_DbgPrint(MID_TRACE,("Leaving\n"));
}