From 136c0d42965f1de7ca45e5b21dffcd6a2ca8b713 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Tue, 4 Sep 2012 03:01:15 +0000 Subject: [PATCH] [AFD] - Fix handling of IRP_MJ_READ and IRP_MJ_WRITE to allow passing sockets as parameters to NtReadFile and NtWriteFile svn path=/trunk/; revision=57233 --- reactos/drivers/network/afd/afd/bind.c | 2 +- reactos/drivers/network/afd/afd/connect.c | 10 +- reactos/drivers/network/afd/afd/context.c | 2 +- reactos/drivers/network/afd/afd/info.c | 4 +- reactos/drivers/network/afd/afd/listen.c | 2 +- reactos/drivers/network/afd/afd/lock.c | 124 +++++++++++++++------- reactos/drivers/network/afd/afd/main.c | 12 +-- reactos/drivers/network/afd/afd/read.c | 10 +- reactos/drivers/network/afd/afd/select.c | 4 +- reactos/drivers/network/afd/afd/write.c | 14 +-- reactos/drivers/network/afd/include/afd.h | 5 +- 11 files changed, 122 insertions(+), 67 deletions(-) diff --git a/reactos/drivers/network/afd/afd/bind.c b/reactos/drivers/network/afd/afd/bind.c index 89ab22f776f..c3e2c149569 100644 --- a/reactos/drivers/network/afd/afd/bind.c +++ b/reactos/drivers/network/afd/afd/bind.c @@ -81,7 +81,7 @@ AfdBindSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp, AFD_DbgPrint(MID_TRACE,("Called\n")); if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp ); - if( !(BindReq = LockRequest( Irp, IrpSp, FALSE )) ) + if( !(BindReq = LockRequest( Irp, IrpSp, FALSE, NULL )) ) return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp, 0 ); diff --git a/reactos/drivers/network/afd/afd/connect.c b/reactos/drivers/network/afd/afd/connect.c index 31c21a9f130..86ce48f1253 100644 --- a/reactos/drivers/network/afd/afd/connect.c +++ b/reactos/drivers/network/afd/afd/connect.c @@ -44,7 +44,7 @@ AfdSetConnectOptions(PDEVICE_OBJECT DeviceObject, PIRP Irp, { PFILE_OBJECT FileObject = IrpSp->FileObject; PAFD_FCB FCB = FileObject->FsContext; - PVOID ConnectOptions = LockRequest(Irp, IrpSp, FALSE); + PVOID ConnectOptions = LockRequest(Irp, IrpSp, FALSE, NULL); UINT ConnectOptionsSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength; if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp); @@ -80,7 +80,7 @@ AfdSetConnectOptionsSize(PDEVICE_OBJECT DeviceObject, PIRP Irp, { PFILE_OBJECT FileObject = IrpSp->FileObject; PAFD_FCB FCB = FileObject->FsContext; - PUINT ConnectOptionsSize = LockRequest(Irp, IrpSp, FALSE); + PUINT ConnectOptionsSize = LockRequest(Irp, IrpSp, FALSE, NULL); UINT BufferSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength; if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp); @@ -144,7 +144,7 @@ AfdSetConnectData(PDEVICE_OBJECT DeviceObject, PIRP Irp, { PFILE_OBJECT FileObject = IrpSp->FileObject; PAFD_FCB FCB = FileObject->FsContext; - PVOID ConnectData = LockRequest(Irp, IrpSp, FALSE); + PVOID ConnectData = LockRequest(Irp, IrpSp, FALSE, NULL); UINT ConnectDataSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength; if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp); @@ -179,7 +179,7 @@ AfdSetConnectDataSize(PDEVICE_OBJECT DeviceObject, PIRP Irp, { PFILE_OBJECT FileObject = IrpSp->FileObject; PAFD_FCB FCB = FileObject->FsContext; - PUINT ConnectDataSize = LockRequest(Irp, IrpSp, FALSE); + PUINT ConnectDataSize = LockRequest(Irp, IrpSp, FALSE, NULL); UINT BufferSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength; if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp); @@ -406,7 +406,7 @@ AfdStreamSocketConnect(PDEVICE_OBJECT DeviceObject, PIRP Irp, AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB)); if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp ); - if( !(ConnectReq = LockRequest( Irp, IrpSp, FALSE )) ) + if( !(ConnectReq = LockRequest( Irp, IrpSp, FALSE, NULL )) ) return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp, 0 ); diff --git a/reactos/drivers/network/afd/afd/context.c b/reactos/drivers/network/afd/afd/context.c index ff5c2700dc6..ce2d9e1e3bd 100644 --- a/reactos/drivers/network/afd/afd/context.c +++ b/reactos/drivers/network/afd/afd/context.c @@ -60,7 +60,7 @@ AfdSetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp ) { PFILE_OBJECT FileObject = IrpSp->FileObject; PAFD_FCB FCB = FileObject->FsContext; - PVOID Context = LockRequest(Irp, IrpSp, FALSE); + PVOID Context = LockRequest(Irp, IrpSp, FALSE, NULL); if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp ); diff --git a/reactos/drivers/network/afd/afd/info.c b/reactos/drivers/network/afd/afd/info.c index a1f33bb705a..b1e771e2c5e 100644 --- a/reactos/drivers/network/afd/afd/info.c +++ b/reactos/drivers/network/afd/afd/info.c @@ -13,7 +13,7 @@ NTSTATUS NTAPI AfdGetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp ) { NTSTATUS Status = STATUS_SUCCESS; - PAFD_INFO InfoReq = LockRequest(Irp, IrpSp, TRUE); + PAFD_INFO InfoReq = LockRequest(Irp, IrpSp, TRUE, NULL); PFILE_OBJECT FileObject = IrpSp->FileObject; PAFD_FCB FCB = FileObject->FsContext; PLIST_ENTRY CurrentEntry; @@ -99,7 +99,7 @@ NTSTATUS NTAPI AfdSetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp ) { NTSTATUS Status = STATUS_SUCCESS; - PAFD_INFO InfoReq = LockRequest(Irp, IrpSp, FALSE); + PAFD_INFO InfoReq = LockRequest(Irp, IrpSp, FALSE, NULL); PFILE_OBJECT FileObject = IrpSp->FileObject; PAFD_FCB FCB = FileObject->FsContext; PCHAR NewBuffer; diff --git a/reactos/drivers/network/afd/afd/listen.c b/reactos/drivers/network/afd/afd/listen.c index 026a4df229f..c47bad971c0 100644 --- a/reactos/drivers/network/afd/afd/listen.c +++ b/reactos/drivers/network/afd/afd/listen.c @@ -217,7 +217,7 @@ NTSTATUS AfdListenSocket( PDEVICE_OBJECT DeviceObject, PIRP Irp, if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp ); - if( !(ListenReq = LockRequest( Irp, IrpSp, FALSE )) ) + if( !(ListenReq = LockRequest( Irp, IrpSp, FALSE, NULL )) ) return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp, 0 ); diff --git a/reactos/drivers/network/afd/afd/lock.c b/reactos/drivers/network/afd/afd/lock.c index 2a6ad44dbe1..77acb60c295 100644 --- a/reactos/drivers/network/afd/afd/lock.c +++ b/reactos/drivers/network/afd/afd/lock.c @@ -18,7 +18,10 @@ PVOID GetLockedData(PIRP Irp, PIO_STACK_LOCATION IrpSp) } /* Lock a method_neither request so it'll be available from DISPATCH_LEVEL */ -PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN Output ) { +PVOID LockRequest( PIRP Irp, + PIO_STACK_LOCATION IrpSp, + BOOLEAN Output, + KPROCESSOR_MODE *LockMode) { BOOLEAN LockFailed = FALSE; ASSERT(!Irp->MdlAddress); @@ -50,7 +53,46 @@ PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN Output ) { Irp->MdlAddress = NULL; return NULL; } - } else return NULL; + + /* The mapped address goes in index 1 */ + Irp->Tail.Overlay.DriverContext[1] = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority); + if (!Irp->Tail.Overlay.DriverContext[1]) + { + AFD_DbgPrint(MIN_TRACE,("Failed to get mapped address\n")); + MmUnlockPages(Irp->MdlAddress); + IoFreeMdl( Irp->MdlAddress ); + Irp->MdlAddress = NULL; + return NULL; + } + + /* The allocated address goes in index 0 */ + Irp->Tail.Overlay.DriverContext[0] = ExAllocatePool(NonPagedPool, MmGetMdlByteCount(Irp->MdlAddress)); + if (!Irp->Tail.Overlay.DriverContext[0]) + { + AFD_DbgPrint(MIN_TRACE,("Failed to allocate memory\n")); + MmUnlockPages(Irp->MdlAddress); + IoFreeMdl( Irp->MdlAddress ); + Irp->MdlAddress = NULL; + return NULL; + } + + RtlCopyMemory(Irp->Tail.Overlay.DriverContext[0], + Irp->Tail.Overlay.DriverContext[1], + MmGetMdlByteCount(Irp->MdlAddress)); + + /* If we don't want a copy back, we zero the mapped address pointer */ + if (!Output) + { + Irp->Tail.Overlay.DriverContext[1] = NULL; + } + + /* We're using a user-mode buffer directly */ + if (LockMode != NULL) + { + *LockMode = UserMode; + } + } + else return NULL; break; case IRP_MJ_READ: @@ -65,6 +107,8 @@ PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN Output ) { FALSE, NULL ); if( Irp->MdlAddress ) { + PAFD_RECV_INFO AfdInfo; + _SEH2_TRY { MmProbeAndLockPages( Irp->MdlAddress, Irp->RequestorMode, IoModifyAccess ); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { @@ -77,7 +121,44 @@ PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN Output ) { Irp->MdlAddress = NULL; return NULL; } - } else return NULL; + + /* We need to create the info struct that AFD expects for all send/recv requests */ + C_ASSERT(sizeof(AFD_RECV_INFO) == sizeof(AFD_SEND_INFO)); + AfdInfo = ExAllocatePool(NonPagedPool, sizeof(AFD_RECV_INFO) + sizeof(AFD_WSABUF)); + if (!AfdInfo) + { + AFD_DbgPrint(MIN_TRACE,("Failed to allocate memory\n")); + MmUnlockPages(Irp->MdlAddress); + IoFreeMdl( Irp->MdlAddress ); + Irp->MdlAddress = NULL; + return NULL; + } + + /* We'll append the buffer array to this struct */ + AfdInfo->BufferArray = (PAFD_WSABUF)(AfdInfo + 1); + AfdInfo->BufferCount = 1; + + /* Setup the default flags values */ + AfdInfo->AfdFlags = 0; + AfdInfo->TdiFlags = 0; + + /* Now build the buffer array */ + AfdInfo->BufferArray[0].buf = MmGetSystemAddressForMdl(Irp->MdlAddress); + AfdInfo->BufferArray[0].len = MmGetMdlByteCount(Irp->MdlAddress); + + /* Store the struct where AFD expects */ + Irp->Tail.Overlay.DriverContext[0] = AfdInfo; + + /* Don't copy anything out */ + Irp->Tail.Overlay.DriverContext[1] = NULL; + + /* We're using a placeholder buffer that we allocated */ + if (LockMode != NULL) + { + *LockMode = KernelMode; + } + } + else return NULL; break; default: @@ -85,38 +166,6 @@ PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN Output ) { return NULL; } - /* The mapped address goes in index 1 */ - Irp->Tail.Overlay.DriverContext[1] = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority); - if (!Irp->Tail.Overlay.DriverContext[1]) - { - AFD_DbgPrint(MIN_TRACE,("Failed to get mapped address\n")); - MmUnlockPages(Irp->MdlAddress); - IoFreeMdl( Irp->MdlAddress ); - Irp->MdlAddress = NULL; - return NULL; - } - - /* The allocated address goes in index 0 */ - Irp->Tail.Overlay.DriverContext[0] = ExAllocatePool(NonPagedPool, MmGetMdlByteCount(Irp->MdlAddress)); - if (!Irp->Tail.Overlay.DriverContext[0]) - { - AFD_DbgPrint(MIN_TRACE,("Failed to allocate memory\n")); - MmUnlockPages(Irp->MdlAddress); - IoFreeMdl( Irp->MdlAddress ); - Irp->MdlAddress = NULL; - return NULL; - } - - RtlCopyMemory(Irp->Tail.Overlay.DriverContext[0], - Irp->Tail.Overlay.DriverContext[1], - MmGetMdlByteCount(Irp->MdlAddress)); - - /* If we don't want a copy back, we zero the mapped address pointer */ - if (!Output) - { - Irp->Tail.Overlay.DriverContext[1] = NULL; - } - return GetLockedData(Irp, IrpSp); } @@ -145,7 +194,8 @@ VOID UnlockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp ) PAFD_WSABUF LockBuffers( PAFD_WSABUF Buf, UINT Count, PVOID AddressBuf, PINT AddressLen, - BOOLEAN Write, BOOLEAN LockAddress ) { + BOOLEAN Write, BOOLEAN LockAddress, + KPROCESSOR_MODE LockMode) { UINT i; /* Copy the buffer array so we don't lose it */ UINT Lock = LockAddress ? 2 : 0; @@ -200,7 +250,7 @@ PAFD_WSABUF LockBuffers( PAFD_WSABUF Buf, UINT Count, if( MapBuf[i].Mdl ) { AFD_DbgPrint(MID_TRACE,("Probe and lock pages\n")); _SEH2_TRY { - MmProbeAndLockPages( MapBuf[i].Mdl, UserMode, + MmProbeAndLockPages( MapBuf[i].Mdl, LockMode, Write ? IoModifyAccess : IoReadAccess ); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { LockFailed = TRUE; diff --git a/reactos/drivers/network/afd/afd/main.c b/reactos/drivers/network/afd/afd/main.c index e7efc6d31b2..41c8b7b7393 100644 --- a/reactos/drivers/network/afd/afd/main.c +++ b/reactos/drivers/network/afd/afd/main.c @@ -72,7 +72,7 @@ AfdSetDisconnectOptions(PDEVICE_OBJECT DeviceObject, PIRP Irp, { PFILE_OBJECT FileObject = IrpSp->FileObject; PAFD_FCB FCB = FileObject->FsContext; - PVOID DisconnectOptions = LockRequest(Irp, IrpSp, FALSE); + PVOID DisconnectOptions = LockRequest(Irp, IrpSp, FALSE, NULL); UINT DisconnectOptionsSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength; if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp); @@ -108,7 +108,7 @@ AfdSetDisconnectOptionsSize(PDEVICE_OBJECT DeviceObject, PIRP Irp, { PFILE_OBJECT FileObject = IrpSp->FileObject; PAFD_FCB FCB = FileObject->FsContext; - PUINT DisconnectOptionsSize = LockRequest(Irp, IrpSp, FALSE); + PUINT DisconnectOptionsSize = LockRequest(Irp, IrpSp, FALSE, NULL); UINT BufferSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength; if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp); @@ -172,7 +172,7 @@ AfdSetDisconnectData(PDEVICE_OBJECT DeviceObject, PIRP Irp, { PFILE_OBJECT FileObject = IrpSp->FileObject; PAFD_FCB FCB = FileObject->FsContext; - PVOID DisconnectData = LockRequest(Irp, IrpSp, FALSE); + PVOID DisconnectData = LockRequest(Irp, IrpSp, FALSE, NULL); UINT DisconnectDataSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength; if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp); @@ -208,7 +208,7 @@ AfdSetDisconnectDataSize(PDEVICE_OBJECT DeviceObject, PIRP Irp, { PFILE_OBJECT FileObject = IrpSp->FileObject; PAFD_FCB FCB = FileObject->FsContext; - PUINT DisconnectDataSize = LockRequest(Irp, IrpSp, FALSE); + PUINT DisconnectDataSize = LockRequest(Irp, IrpSp, FALSE, NULL); UINT BufferSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength; if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp); @@ -244,7 +244,7 @@ AfdGetTdiHandles(PDEVICE_OBJECT DeviceObject, PIRP Irp, { PFILE_OBJECT FileObject = IrpSp->FileObject; PAFD_FCB FCB = FileObject->FsContext; - PULONG HandleFlags = LockRequest(Irp, IrpSp, TRUE); + PULONG HandleFlags = LockRequest(Irp, IrpSp, TRUE, NULL); PAFD_TDI_HANDLE_DATA HandleData = Irp->UserBuffer; if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp); @@ -680,7 +680,7 @@ AfdDisconnect(PDEVICE_OBJECT DeviceObject, PIRP Irp, if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp); - if (!(DisReq = LockRequest(Irp, IrpSp, FALSE))) + if (!(DisReq = LockRequest(Irp, IrpSp, FALSE, NULL))) return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp, 0 ); diff --git a/reactos/drivers/network/afd/afd/read.c b/reactos/drivers/network/afd/afd/read.c index b956c25cd14..68ae10d63ae 100644 --- a/reactos/drivers/network/afd/afd/read.c +++ b/reactos/drivers/network/afd/afd/read.c @@ -431,6 +431,7 @@ AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp, UINT TotalBytesCopied = 0; PAFD_STORED_DATAGRAM DatagramRecv; PLIST_ENTRY ListEntry; + KPROCESSOR_MODE LockMode; AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB)); @@ -447,7 +448,7 @@ AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp, Irp, 0 ); } - if( !(RecvReq = LockRequest( Irp, IrpSp, FALSE )) ) + if( !(RecvReq = LockRequest( Irp, IrpSp, FALSE, &LockMode )) ) return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp, 0 ); @@ -456,7 +457,7 @@ AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp, RecvReq->BufferArray = LockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, NULL, NULL, - TRUE, FALSE ); + TRUE, FALSE, LockMode ); if( !RecvReq->BufferArray ) { return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION, @@ -699,6 +700,7 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp, PAFD_RECV_INFO_UDP RecvReq; PLIST_ENTRY ListEntry; PAFD_STORED_DATAGRAM DatagramRecv; + KPROCESSOR_MODE LockMode; AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB)); @@ -719,7 +721,7 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp, return UnlockAndMaybeComplete(FCB, STATUS_FILE_CLOSED, Irp, 0); } - if( !(RecvReq = LockRequest( Irp, IrpSp, FALSE )) ) + if( !(RecvReq = LockRequest( Irp, IrpSp, FALSE, &LockMode )) ) return UnlockAndMaybeComplete(FCB, STATUS_NO_MEMORY, Irp, 0); AFD_DbgPrint(MID_TRACE,("Recv flags %x\n", RecvReq->AfdFlags)); @@ -728,7 +730,7 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp, RecvReq->BufferCount, RecvReq->Address, RecvReq->AddressLength, - TRUE, TRUE ); + TRUE, TRUE, LockMode ); if( !RecvReq->BufferArray ) { /* access violation in userspace */ return UnlockAndMaybeComplete(FCB, STATUS_ACCESS_VIOLATION, Irp, 0); diff --git a/reactos/drivers/network/afd/afd/select.c b/reactos/drivers/network/afd/afd/select.c index a063eb461da..ceda022ed49 100644 --- a/reactos/drivers/network/afd/afd/select.c +++ b/reactos/drivers/network/afd/afd/select.c @@ -259,7 +259,7 @@ AfdEventSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp, PFILE_OBJECT FileObject = IrpSp->FileObject; NTSTATUS Status = STATUS_NO_MEMORY; PAFD_EVENT_SELECT_INFO EventSelectInfo = - (PAFD_EVENT_SELECT_INFO)LockRequest( Irp, IrpSp, FALSE ); + (PAFD_EVENT_SELECT_INFO)LockRequest( Irp, IrpSp, FALSE, NULL ); PAFD_FCB FCB = FileObject->FsContext; if( !SocketAcquireStateLock( FCB ) ) { @@ -319,7 +319,7 @@ AfdEnumEvents( PDEVICE_OBJECT DeviceObject, PIRP Irp, PIO_STACK_LOCATION IrpSp ) { PFILE_OBJECT FileObject = IrpSp->FileObject; PAFD_ENUM_NETWORK_EVENTS_INFO EnumReq = - (PAFD_ENUM_NETWORK_EVENTS_INFO)LockRequest( Irp, IrpSp, TRUE ); + (PAFD_ENUM_NETWORK_EVENTS_INFO)LockRequest( Irp, IrpSp, TRUE, NULL ); PAFD_FCB FCB = FileObject->FsContext; PKEVENT UserEvent; NTSTATUS Status; diff --git a/reactos/drivers/network/afd/afd/write.c b/reactos/drivers/network/afd/afd/write.c index 604c4609d1f..a9afed08b32 100644 --- a/reactos/drivers/network/afd/afd/write.c +++ b/reactos/drivers/network/afd/afd/write.c @@ -327,6 +327,7 @@ AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp, PAFD_FCB FCB = FileObject->FsContext; PAFD_SEND_INFO SendReq; UINT TotalBytesCopied = 0, i, SpaceAvail = 0, BytesCopied, SendLength; + KPROCESSOR_MODE LockMode; AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB)); @@ -347,14 +348,14 @@ AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp, 0 ); } - if( !(SendReq = LockRequest( Irp, IrpSp, FALSE )) ) + if( !(SendReq = LockRequest( Irp, IrpSp, FALSE, &LockMode )) ) return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp, 0 ); /* Must lock buffers before handing off user data */ SendReq->BufferArray = LockBuffers( SendReq->BufferArray, SendReq->BufferCount, NULL, NULL, - FALSE, FALSE ); + FALSE, FALSE, LockMode ); if( !SendReq->BufferArray ) { return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION, @@ -416,14 +417,14 @@ AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp, return UnlockAndMaybeComplete(FCB, STATUS_FILE_CLOSED, Irp, 0); } - if( !(SendReq = LockRequest( Irp, IrpSp, FALSE )) ) + if( !(SendReq = LockRequest( Irp, IrpSp, FALSE, &LockMode )) ) return UnlockAndMaybeComplete ( FCB, STATUS_NO_MEMORY, Irp, 0 ); SendReq->BufferArray = LockBuffers( SendReq->BufferArray, SendReq->BufferCount, NULL, NULL, - FALSE, FALSE ); + FALSE, FALSE, LockMode ); if( !SendReq->BufferArray ) { return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION, @@ -556,6 +557,7 @@ AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp, PFILE_OBJECT FileObject = IrpSp->FileObject; PAFD_FCB FCB = FileObject->FsContext; PAFD_SEND_INFO_UDP SendReq; + KPROCESSOR_MODE LockMode; AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB)); @@ -577,7 +579,7 @@ AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp, return UnlockAndMaybeComplete(FCB, STATUS_FILE_CLOSED, Irp, 0); } - if( !(SendReq = LockRequest( Irp, IrpSp, FALSE )) ) + if( !(SendReq = LockRequest( Irp, IrpSp, FALSE, &LockMode )) ) return UnlockAndMaybeComplete(FCB, STATUS_NO_MEMORY, Irp, 0); if (FCB->State == SOCKET_STATE_CREATED) @@ -602,7 +604,7 @@ AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp, SendReq->BufferArray = LockBuffers( SendReq->BufferArray, SendReq->BufferCount, NULL, NULL, - FALSE, FALSE ); + FALSE, FALSE, LockMode ); if( !SendReq->BufferArray ) return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION, diff --git a/reactos/drivers/network/afd/include/afd.h b/reactos/drivers/network/afd/include/afd.h index f8208002f6c..d77fbf280d8 100644 --- a/reactos/drivers/network/afd/include/afd.h +++ b/reactos/drivers/network/afd/include/afd.h @@ -298,7 +298,8 @@ NTSTATUS AfdAccept( PDEVICE_OBJECT DeviceObject, PIRP Irp, PAFD_WSABUF LockBuffers( PAFD_WSABUF Buf, UINT Count, PVOID AddressBuf, PINT AddressLen, - BOOLEAN Write, BOOLEAN LockAddress ); + BOOLEAN Write, BOOLEAN LockAddress, + KPROCESSOR_MODE LockMode ); VOID UnlockBuffers( PAFD_WSABUF Buf, UINT Count, BOOL Address ); BOOLEAN SocketAcquireStateLock( PAFD_FCB FCB ); NTSTATUS NTAPI UnlockAndMaybeComplete @@ -308,7 +309,7 @@ VOID SocketStateUnlock( PAFD_FCB FCB ); NTSTATUS LostSocket( PIRP Irp ); PAFD_HANDLE LockHandles( PAFD_HANDLE HandleArray, UINT HandleCount ); VOID UnlockHandles( PAFD_HANDLE HandleArray, UINT HandleCount ); -PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN Output ); +PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN Output, KPROCESSOR_MODE *LockMode ); 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 );