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/bi…
==============================================================================
--- 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/co…
==============================================================================
--- 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/co…
==============================================================================
--- 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/in…
==============================================================================
--- 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/li…
==============================================================================
--- 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/lo…
==============================================================================
--- 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/ma…
==============================================================================
--- 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/re…
==============================================================================
--- 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/se…
==============================================================================
--- 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/wr…
==============================================================================
--- 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/includ…
==============================================================================
--- 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 );