mirror of
https://github.com/reactos/reactos.git
synced 2025-08-03 17:56:00 +00:00
- Add cancellation support for IOCTL_AFD_SELECT
- Fix release build svn path=/trunk/; revision=43275
This commit is contained in:
parent
5920b78ec2
commit
6ad0121a58
3 changed files with 43 additions and 3 deletions
|
@ -517,6 +517,10 @@ AfdCancelHandler(PDEVICE_OBJECT DeviceObject,
|
||||||
PAFD_SEND_INFO SendReq;
|
PAFD_SEND_INFO SendReq;
|
||||||
PLIST_ENTRY CurrentEntry;
|
PLIST_ENTRY CurrentEntry;
|
||||||
PIRP CurrentIrp;
|
PIRP CurrentIrp;
|
||||||
|
PAFD_DEVICE_EXTENSION DeviceExt = DeviceObject->DeviceExtension;
|
||||||
|
KIRQL OldIrql;
|
||||||
|
PAFD_ACTIVE_POLL Poll;
|
||||||
|
PAFD_POLL_INFO PollReq;
|
||||||
|
|
||||||
IoReleaseCancelSpinLock(Irp->CancelIrql);
|
IoReleaseCancelSpinLock(Irp->CancelIrql);
|
||||||
|
|
||||||
|
@ -553,9 +557,38 @@ AfdCancelHandler(PDEVICE_OBJECT DeviceObject,
|
||||||
Function = FUNCTION_PREACCEPT;
|
Function = FUNCTION_PREACCEPT;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case IOCTL_AFD_SELECT:
|
||||||
|
KeAcquireSpinLock(&DeviceExt->Lock, &OldIrql);
|
||||||
|
|
||||||
|
CurrentEntry = DeviceExt->Polls.Flink;
|
||||||
|
while (CurrentEntry != &DeviceExt->Polls)
|
||||||
|
{
|
||||||
|
Poll = CONTAINING_RECORD(CurrentEntry, AFD_ACTIVE_POLL, ListEntry);
|
||||||
|
CurrentIrp = Poll->Irp;
|
||||||
|
PollReq = CurrentIrp->AssociatedIrp.SystemBuffer;
|
||||||
|
|
||||||
|
if (CurrentIrp == Irp)
|
||||||
|
{
|
||||||
|
ZeroEvents(PollReq->Handles, PollReq->HandleCount);
|
||||||
|
SignalSocket(Poll, NULL, PollReq, STATUS_CANCELLED);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CurrentEntry = CurrentEntry->Flink;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
KeReleaseSpinLock(&DeviceExt->Lock, OldIrql);
|
||||||
|
|
||||||
|
/* IRP already completed by SignalSocket */
|
||||||
|
SocketStateUnlock(FCB);
|
||||||
|
return;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
ASSERT(FALSE);
|
ASSERT(FALSE);
|
||||||
break;
|
UnlockAndMaybeComplete(FCB, STATUS_CANCELLED, Irp, 0);
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CurrentEntry = FCB->PendingIrpList[Function].Flink;
|
CurrentEntry = FCB->PendingIrpList[Function].Flink;
|
||||||
|
|
|
@ -43,7 +43,7 @@ static VOID CopyBackStatus( PAFD_HANDLE HandleArray,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static VOID ZeroEvents( PAFD_HANDLE HandleArray,
|
VOID ZeroEvents( PAFD_HANDLE HandleArray,
|
||||||
UINT HandleCount ) {
|
UINT HandleCount ) {
|
||||||
UINT i;
|
UINT i;
|
||||||
|
|
||||||
|
@ -55,7 +55,7 @@ static VOID ZeroEvents( PAFD_HANDLE HandleArray,
|
||||||
|
|
||||||
|
|
||||||
/* you must pass either Poll OR Irp */
|
/* you must pass either Poll OR Irp */
|
||||||
static VOID SignalSocket(
|
VOID SignalSocket(
|
||||||
PAFD_ACTIVE_POLL Poll OPTIONAL,
|
PAFD_ACTIVE_POLL Poll OPTIONAL,
|
||||||
PIRP _Irp OPTIONAL,
|
PIRP _Irp OPTIONAL,
|
||||||
PAFD_POLL_INFO PollReq,
|
PAFD_POLL_INFO PollReq,
|
||||||
|
@ -89,6 +89,7 @@ static VOID SignalSocket(
|
||||||
UnlockHandles( AFD_HANDLES(PollReq), PollReq->HandleCount );
|
UnlockHandles( AFD_HANDLES(PollReq), PollReq->HandleCount );
|
||||||
if( Irp->MdlAddress ) UnlockRequest( Irp, IoGetCurrentIrpStackLocation( Irp ) );
|
if( Irp->MdlAddress ) UnlockRequest( Irp, IoGetCurrentIrpStackLocation( Irp ) );
|
||||||
AFD_DbgPrint(MID_TRACE,("Completing\n"));
|
AFD_DbgPrint(MID_TRACE,("Completing\n"));
|
||||||
|
(void)IoSetCancelRoutine(Irp, NULL);
|
||||||
IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
|
IoCompleteRequest( Irp, IO_NETWORK_INCREMENT );
|
||||||
AFD_DbgPrint(MID_TRACE,("Done\n"));
|
AFD_DbgPrint(MID_TRACE,("Done\n"));
|
||||||
}
|
}
|
||||||
|
@ -244,6 +245,7 @@ AfdSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
Status = STATUS_PENDING;
|
Status = STATUS_PENDING;
|
||||||
IoMarkIrpPending( Irp );
|
IoMarkIrpPending( Irp );
|
||||||
|
(void)IoSetCancelRoutine(Irp, AfdCancelHandler);
|
||||||
} else {
|
} else {
|
||||||
AFD_DbgPrint(MAX_TRACE, ("FIXME: do something with the IRP!\n"));
|
AFD_DbgPrint(MAX_TRACE, ("FIXME: do something with the IRP!\n"));
|
||||||
Status = STATUS_NO_MEMORY;
|
Status = STATUS_NO_MEMORY;
|
||||||
|
|
|
@ -315,6 +315,11 @@ AfdEnumEvents( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
VOID PollReeval( PAFD_DEVICE_EXTENSION DeviceObject, PFILE_OBJECT FileObject );
|
VOID PollReeval( PAFD_DEVICE_EXTENSION DeviceObject, PFILE_OBJECT FileObject );
|
||||||
VOID KillSelectsForFCB( PAFD_DEVICE_EXTENSION DeviceExt,
|
VOID KillSelectsForFCB( PAFD_DEVICE_EXTENSION DeviceExt,
|
||||||
PFILE_OBJECT FileObject, BOOLEAN ExclusiveOnly );
|
PFILE_OBJECT FileObject, BOOLEAN ExclusiveOnly );
|
||||||
|
VOID ZeroEvents( PAFD_HANDLE HandleArray,
|
||||||
|
UINT HandleCount );
|
||||||
|
VOID SignalSocket(
|
||||||
|
PAFD_ACTIVE_POLL Poll OPTIONAL, PIRP _Irp OPTIONAL,
|
||||||
|
PAFD_POLL_INFO PollReq, NTSTATUS Status);
|
||||||
|
|
||||||
/* tdi.c */
|
/* tdi.c */
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue