Author: cgutman Date: Tue Sep 4 03:01:15 2012 New Revision: 57233
URL: http://svn.reactos.org/svn/reactos?rev=57233&view=rev Log: [AFD] - Fix handling of IRP_MJ_READ and IRP_MJ_WRITE to allow passing sockets as parameters to NtReadFile and NtWriteFile
Modified: trunk/reactos/drivers/network/afd/afd/bind.c trunk/reactos/drivers/network/afd/afd/connect.c trunk/reactos/drivers/network/afd/afd/context.c trunk/reactos/drivers/network/afd/afd/info.c trunk/reactos/drivers/network/afd/afd/listen.c trunk/reactos/drivers/network/afd/afd/lock.c trunk/reactos/drivers/network/afd/afd/main.c trunk/reactos/drivers/network/afd/afd/read.c trunk/reactos/drivers/network/afd/afd/select.c trunk/reactos/drivers/network/afd/afd/write.c trunk/reactos/drivers/network/afd/include/afd.h
Modified: trunk/reactos/drivers/network/afd/afd/bind.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/bin... ============================================================================== --- trunk/reactos/drivers/network/afd/afd/bind.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/afd/afd/bind.c [iso-8859-1] Tue Sep 4 03:01:15 2012 @@ -81,7 +81,7 @@ 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 );
Modified: trunk/reactos/drivers/network/afd/afd/connect.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/con... ============================================================================== --- trunk/reactos/drivers/network/afd/afd/connect.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/afd/afd/connect.c [iso-8859-1] Tue Sep 4 03:01:15 2012 @@ -44,7 +44,7 @@ { 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 @@ { 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 @@ { 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 @@ { 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 @@ 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 );
Modified: trunk/reactos/drivers/network/afd/afd/context.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/con... ============================================================================== --- trunk/reactos/drivers/network/afd/afd/context.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/afd/afd/context.c [iso-8859-1] Tue Sep 4 03:01:15 2012 @@ -60,7 +60,7 @@ 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 );
Modified: trunk/reactos/drivers/network/afd/afd/info.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/inf... ============================================================================== --- trunk/reactos/drivers/network/afd/afd/info.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/afd/afd/info.c [iso-8859-1] Tue Sep 4 03:01:15 2012 @@ -13,7 +13,7 @@ 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 @@ 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;
Modified: trunk/reactos/drivers/network/afd/afd/listen.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/lis... ============================================================================== --- trunk/reactos/drivers/network/afd/afd/listen.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/afd/afd/listen.c [iso-8859-1] Tue Sep 4 03:01:15 2012 @@ -217,7 +217,7 @@
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 );
Modified: trunk/reactos/drivers/network/afd/afd/lock.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/loc... ============================================================================== --- trunk/reactos/drivers/network/afd/afd/lock.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/afd/afd/lock.c [iso-8859-1] Tue Sep 4 03:01:15 2012 @@ -18,7 +18,10 @@ }
/* 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 @@ 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 @@ FALSE, NULL ); if( Irp->MdlAddress ) { + PAFD_RECV_INFO AfdInfo; + _SEH2_TRY { MmProbeAndLockPages( Irp->MdlAddress, Irp->RequestorMode, IoModifyAccess ); } _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) { @@ -77,44 +121,49 @@ 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: ASSERT(FALSE); 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 @@
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 @@ 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;
Modified: trunk/reactos/drivers/network/afd/afd/main.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/mai... ============================================================================== --- trunk/reactos/drivers/network/afd/afd/main.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/afd/afd/main.c [iso-8859-1] Tue Sep 4 03:01:15 2012 @@ -72,7 +72,7 @@ { 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 @@ { 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 @@ { 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 @@ { 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 @@ { 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 @@
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 );
Modified: trunk/reactos/drivers/network/afd/afd/read.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/rea... ============================================================================== --- trunk/reactos/drivers/network/afd/afd/read.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/afd/afd/read.c [iso-8859-1] Tue Sep 4 03:01:15 2012 @@ -431,6 +431,7 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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);
Modified: trunk/reactos/drivers/network/afd/afd/select.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/sel... ============================================================================== --- trunk/reactos/drivers/network/afd/afd/select.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/afd/afd/select.c [iso-8859-1] Tue Sep 4 03:01:15 2012 @@ -259,7 +259,7 @@ 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 @@ 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;
Modified: trunk/reactos/drivers/network/afd/afd/write.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/afd/wri... ============================================================================== --- trunk/reactos/drivers/network/afd/afd/write.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/afd/afd/write.c [iso-8859-1] Tue Sep 4 03:01:15 2012 @@ -327,6 +327,7 @@ 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 @@ 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 @@ 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 @@ 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 @@ 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 @@ SendReq->BufferArray = LockBuffers( SendReq->BufferArray, SendReq->BufferCount, NULL, NULL, - FALSE, FALSE ); + FALSE, FALSE, LockMode );
if( !SendReq->BufferArray ) return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION,
Modified: trunk/reactos/drivers/network/afd/include/afd.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/afd/include... ============================================================================== --- trunk/reactos/drivers/network/afd/include/afd.h [iso-8859-1] (original) +++ trunk/reactos/drivers/network/afd/include/afd.h [iso-8859-1] Tue Sep 4 03:01:15 2012 @@ -298,7 +298,8 @@
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 @@ 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 );