From e99d1fe3f9dd27a236ae4e0bfa8a5eeb4081a26b Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 9 Jul 2009 16:47:11 +0000 Subject: [PATCH] - Implement IOCTL_AFD_SET_INFO - We currently disregard the value of BlockingMode so this causes no behavior change svn path=/trunk/; revision=41833 --- reactos/drivers/network/afd/afd/info.c | 29 +++++++++++++++++++++++ reactos/drivers/network/afd/afd/main.c | 7 +++--- reactos/drivers/network/afd/include/afd.h | 6 ++++- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/reactos/drivers/network/afd/afd/info.c b/reactos/drivers/network/afd/afd/info.c index 561235634d3..4af2d8595e3 100644 --- a/reactos/drivers/network/afd/afd/info.c +++ b/reactos/drivers/network/afd/afd/info.c @@ -69,6 +69,35 @@ AfdGetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp, return UnlockAndMaybeComplete( FCB, Status, Irp, 0 ); } +NTSTATUS NTAPI +AfdSetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp, + PIO_STACK_LOCATION IrpSp ) { + NTSTATUS Status = STATUS_SUCCESS; + PAFD_INFO InfoReq = IrpSp->Parameters.DeviceIoControl.Type3InputBuffer; + PFILE_OBJECT FileObject = IrpSp->FileObject; + PAFD_FCB FCB = FileObject->FsContext; + + if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp); + + _SEH2_TRY { + switch (InfoReq->InformationClass) { + case AFD_INFO_BLOCKING_MODE: + AFD_DbgPrint(MID_TRACE,("Blocking mode set to %d\n", InfoReq->Information.Ulong)); + FCB->BlockingMode = InfoReq->Information.Ulong; + break; + default: + AFD_DbgPrint(MIN_TRACE,("Unknown request %d\n", InfoReq->InformationClass)); + break; + } + } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { + Status = STATUS_INVALID_PARAMETER; + } _SEH2_END; + + AFD_DbgPrint(MID_TRACE,("Returning %x\n", Status)); + + return UnlockAndMaybeComplete(FCB, Status, Irp, 0); +} + NTSTATUS NTAPI AfdGetSockName( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp ) { diff --git a/reactos/drivers/network/afd/afd/main.c b/reactos/drivers/network/afd/afd/main.c index 65ca7ecea2a..099e1586995 100644 --- a/reactos/drivers/network/afd/afd/main.c +++ b/reactos/drivers/network/afd/afd/main.c @@ -422,6 +422,9 @@ AfdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp) case IOCTL_AFD_GET_INFO: return AfdGetInfo( DeviceObject, Irp, IrpSp ); + case IOCTL_AFD_SET_INFO: + return AfdSetInfo( DeviceObject, Irp, IrpSp ); + case IOCTL_AFD_GET_CONTEXT: return AfdGetContext( DeviceObject, Irp, IrpSp ); @@ -447,10 +450,6 @@ AfdDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp) AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_GET_TDI_HANDLES\n")); break; - case IOCTL_AFD_SET_INFO: - AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_INFO\n")); - break; - case IOCTL_AFD_SET_CONNECT_DATA: AFD_DbgPrint(MIN_TRACE, ("IOCTL_AFD_SET_CONNECT_DATA\n")); break; diff --git a/reactos/drivers/network/afd/include/afd.h b/reactos/drivers/network/afd/include/afd.h index f0f806d2811..fd707b9ce26 100644 --- a/reactos/drivers/network/afd/include/afd.h +++ b/reactos/drivers/network/afd/include/afd.h @@ -178,7 +178,7 @@ typedef struct _AFD_STORED_DATAGRAM { typedef struct _AFD_FCB { BOOLEAN Locked, Critical, Overread; - UINT State, Flags; + UINT State, Flags, BlockingMode; KIRQL OldIrql; UINT LockCount; PVOID CurrentThread; @@ -236,6 +236,10 @@ NTSTATUS NTAPI AfdGetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp ); +NTSTATUS NTAPI +AfdSetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp, + PIO_STACK_LOCATION IrpSp ); + NTSTATUS NTAPI AfdGetSockName( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp );