mirror of
https://github.com/reactos/reactos.git
synced 2025-05-08 03:07:05 +00:00
[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
This commit is contained in:
parent
7a2e4c733b
commit
136c0d4296
11 changed files with 122 additions and 67 deletions
|
@ -81,7 +81,7 @@ AfdBindSocket(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
AFD_DbgPrint(MID_TRACE,("Called\n"));
|
AFD_DbgPrint(MID_TRACE,("Called\n"));
|
||||||
|
|
||||||
if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
|
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,
|
return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY,
|
||||||
Irp, 0 );
|
Irp, 0 );
|
||||||
|
|
||||||
|
|
|
@ -44,7 +44,7 @@ AfdSetConnectOptions(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
{
|
{
|
||||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
PAFD_FCB FCB = FileObject->FsContext;
|
PAFD_FCB FCB = FileObject->FsContext;
|
||||||
PVOID ConnectOptions = LockRequest(Irp, IrpSp, FALSE);
|
PVOID ConnectOptions = LockRequest(Irp, IrpSp, FALSE, NULL);
|
||||||
UINT ConnectOptionsSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
|
UINT ConnectOptionsSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
|
||||||
|
|
||||||
if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
|
if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
|
||||||
|
@ -80,7 +80,7 @@ AfdSetConnectOptionsSize(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
{
|
{
|
||||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
PAFD_FCB FCB = FileObject->FsContext;
|
PAFD_FCB FCB = FileObject->FsContext;
|
||||||
PUINT ConnectOptionsSize = LockRequest(Irp, IrpSp, FALSE);
|
PUINT ConnectOptionsSize = LockRequest(Irp, IrpSp, FALSE, NULL);
|
||||||
UINT BufferSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
|
UINT BufferSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
|
||||||
|
|
||||||
if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
|
if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
|
||||||
|
@ -144,7 +144,7 @@ AfdSetConnectData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
{
|
{
|
||||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
PAFD_FCB FCB = FileObject->FsContext;
|
PAFD_FCB FCB = FileObject->FsContext;
|
||||||
PVOID ConnectData = LockRequest(Irp, IrpSp, FALSE);
|
PVOID ConnectData = LockRequest(Irp, IrpSp, FALSE, NULL);
|
||||||
UINT ConnectDataSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
|
UINT ConnectDataSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
|
||||||
|
|
||||||
if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
|
if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
|
||||||
|
@ -179,7 +179,7 @@ AfdSetConnectDataSize(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
{
|
{
|
||||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
PAFD_FCB FCB = FileObject->FsContext;
|
PAFD_FCB FCB = FileObject->FsContext;
|
||||||
PUINT ConnectDataSize = LockRequest(Irp, IrpSp, FALSE);
|
PUINT ConnectDataSize = LockRequest(Irp, IrpSp, FALSE, NULL);
|
||||||
UINT BufferSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
|
UINT BufferSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
|
||||||
|
|
||||||
if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
|
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));
|
AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB));
|
||||||
|
|
||||||
if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
|
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,
|
return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp,
|
||||||
0 );
|
0 );
|
||||||
|
|
||||||
|
|
|
@ -60,7 +60,7 @@ AfdSetContext( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
PIO_STACK_LOCATION IrpSp ) {
|
PIO_STACK_LOCATION IrpSp ) {
|
||||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
PAFD_FCB FCB = FileObject->FsContext;
|
PAFD_FCB FCB = FileObject->FsContext;
|
||||||
PVOID Context = LockRequest(Irp, IrpSp, FALSE);
|
PVOID Context = LockRequest(Irp, IrpSp, FALSE, NULL);
|
||||||
|
|
||||||
if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
|
if( !SocketAcquireStateLock( FCB ) ) return LostSocket( Irp );
|
||||||
|
|
||||||
|
|
|
@ -13,7 +13,7 @@ NTSTATUS NTAPI
|
||||||
AfdGetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
AfdGetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
PIO_STACK_LOCATION IrpSp ) {
|
PIO_STACK_LOCATION IrpSp ) {
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
PAFD_INFO InfoReq = LockRequest(Irp, IrpSp, TRUE);
|
PAFD_INFO InfoReq = LockRequest(Irp, IrpSp, TRUE, NULL);
|
||||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
PAFD_FCB FCB = FileObject->FsContext;
|
PAFD_FCB FCB = FileObject->FsContext;
|
||||||
PLIST_ENTRY CurrentEntry;
|
PLIST_ENTRY CurrentEntry;
|
||||||
|
@ -99,7 +99,7 @@ NTSTATUS NTAPI
|
||||||
AfdSetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
AfdSetInfo( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
PIO_STACK_LOCATION IrpSp ) {
|
PIO_STACK_LOCATION IrpSp ) {
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
PAFD_INFO InfoReq = LockRequest(Irp, IrpSp, FALSE);
|
PAFD_INFO InfoReq = LockRequest(Irp, IrpSp, FALSE, NULL);
|
||||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
PAFD_FCB FCB = FileObject->FsContext;
|
PAFD_FCB FCB = FileObject->FsContext;
|
||||||
PCHAR NewBuffer;
|
PCHAR NewBuffer;
|
||||||
|
|
|
@ -217,7 +217,7 @@ NTSTATUS AfdListenSocket( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
if( !SocketAcquireStateLock( FCB ) ) return LostSocket( 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,
|
return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp,
|
||||||
0 );
|
0 );
|
||||||
|
|
||||||
|
|
|
@ -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 */
|
/* 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;
|
BOOLEAN LockFailed = FALSE;
|
||||||
|
|
||||||
ASSERT(!Irp->MdlAddress);
|
ASSERT(!Irp->MdlAddress);
|
||||||
|
@ -50,7 +53,46 @@ PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN Output ) {
|
||||||
Irp->MdlAddress = NULL;
|
Irp->MdlAddress = NULL;
|
||||||
return 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;
|
break;
|
||||||
|
|
||||||
case IRP_MJ_READ:
|
case IRP_MJ_READ:
|
||||||
|
@ -65,6 +107,8 @@ PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN Output ) {
|
||||||
FALSE,
|
FALSE,
|
||||||
NULL );
|
NULL );
|
||||||
if( Irp->MdlAddress ) {
|
if( Irp->MdlAddress ) {
|
||||||
|
PAFD_RECV_INFO AfdInfo;
|
||||||
|
|
||||||
_SEH2_TRY {
|
_SEH2_TRY {
|
||||||
MmProbeAndLockPages( Irp->MdlAddress, Irp->RequestorMode, IoModifyAccess );
|
MmProbeAndLockPages( Irp->MdlAddress, Irp->RequestorMode, IoModifyAccess );
|
||||||
} _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) {
|
} _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) {
|
||||||
|
@ -77,7 +121,44 @@ PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN Output ) {
|
||||||
Irp->MdlAddress = NULL;
|
Irp->MdlAddress = NULL;
|
||||||
return 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;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -85,38 +166,6 @@ PVOID LockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp, BOOLEAN Output ) {
|
||||||
return NULL;
|
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);
|
return GetLockedData(Irp, IrpSp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -145,7 +194,8 @@ VOID UnlockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp )
|
||||||
|
|
||||||
PAFD_WSABUF LockBuffers( PAFD_WSABUF Buf, UINT Count,
|
PAFD_WSABUF LockBuffers( PAFD_WSABUF Buf, UINT Count,
|
||||||
PVOID AddressBuf, PINT AddressLen,
|
PVOID AddressBuf, PINT AddressLen,
|
||||||
BOOLEAN Write, BOOLEAN LockAddress ) {
|
BOOLEAN Write, BOOLEAN LockAddress,
|
||||||
|
KPROCESSOR_MODE LockMode) {
|
||||||
UINT i;
|
UINT i;
|
||||||
/* Copy the buffer array so we don't lose it */
|
/* Copy the buffer array so we don't lose it */
|
||||||
UINT Lock = LockAddress ? 2 : 0;
|
UINT Lock = LockAddress ? 2 : 0;
|
||||||
|
@ -200,7 +250,7 @@ PAFD_WSABUF LockBuffers( PAFD_WSABUF Buf, UINT Count,
|
||||||
if( MapBuf[i].Mdl ) {
|
if( MapBuf[i].Mdl ) {
|
||||||
AFD_DbgPrint(MID_TRACE,("Probe and lock pages\n"));
|
AFD_DbgPrint(MID_TRACE,("Probe and lock pages\n"));
|
||||||
_SEH2_TRY {
|
_SEH2_TRY {
|
||||||
MmProbeAndLockPages( MapBuf[i].Mdl, UserMode,
|
MmProbeAndLockPages( MapBuf[i].Mdl, LockMode,
|
||||||
Write ? IoModifyAccess : IoReadAccess );
|
Write ? IoModifyAccess : IoReadAccess );
|
||||||
} _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) {
|
} _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) {
|
||||||
LockFailed = TRUE;
|
LockFailed = TRUE;
|
||||||
|
|
|
@ -72,7 +72,7 @@ AfdSetDisconnectOptions(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
{
|
{
|
||||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
PAFD_FCB FCB = FileObject->FsContext;
|
PAFD_FCB FCB = FileObject->FsContext;
|
||||||
PVOID DisconnectOptions = LockRequest(Irp, IrpSp, FALSE);
|
PVOID DisconnectOptions = LockRequest(Irp, IrpSp, FALSE, NULL);
|
||||||
UINT DisconnectOptionsSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
|
UINT DisconnectOptionsSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
|
||||||
|
|
||||||
if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
|
if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
|
||||||
|
@ -108,7 +108,7 @@ AfdSetDisconnectOptionsSize(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
{
|
{
|
||||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
PAFD_FCB FCB = FileObject->FsContext;
|
PAFD_FCB FCB = FileObject->FsContext;
|
||||||
PUINT DisconnectOptionsSize = LockRequest(Irp, IrpSp, FALSE);
|
PUINT DisconnectOptionsSize = LockRequest(Irp, IrpSp, FALSE, NULL);
|
||||||
UINT BufferSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
|
UINT BufferSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
|
||||||
|
|
||||||
if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
|
if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
|
||||||
|
@ -172,7 +172,7 @@ AfdSetDisconnectData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
{
|
{
|
||||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
PAFD_FCB FCB = FileObject->FsContext;
|
PAFD_FCB FCB = FileObject->FsContext;
|
||||||
PVOID DisconnectData = LockRequest(Irp, IrpSp, FALSE);
|
PVOID DisconnectData = LockRequest(Irp, IrpSp, FALSE, NULL);
|
||||||
UINT DisconnectDataSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
|
UINT DisconnectDataSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
|
||||||
|
|
||||||
if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
|
if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
|
||||||
|
@ -208,7 +208,7 @@ AfdSetDisconnectDataSize(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
{
|
{
|
||||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
PAFD_FCB FCB = FileObject->FsContext;
|
PAFD_FCB FCB = FileObject->FsContext;
|
||||||
PUINT DisconnectDataSize = LockRequest(Irp, IrpSp, FALSE);
|
PUINT DisconnectDataSize = LockRequest(Irp, IrpSp, FALSE, NULL);
|
||||||
UINT BufferSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
|
UINT BufferSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength;
|
||||||
|
|
||||||
if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
|
if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
|
||||||
|
@ -244,7 +244,7 @@ AfdGetTdiHandles(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
{
|
{
|
||||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
PAFD_FCB FCB = FileObject->FsContext;
|
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;
|
PAFD_TDI_HANDLE_DATA HandleData = Irp->UserBuffer;
|
||||||
|
|
||||||
if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
|
if (!SocketAcquireStateLock(FCB)) return LostSocket(Irp);
|
||||||
|
@ -680,7 +680,7 @@ AfdDisconnect(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
if (!SocketAcquireStateLock(FCB)) return LostSocket(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,
|
return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY,
|
||||||
Irp, 0 );
|
Irp, 0 );
|
||||||
|
|
||||||
|
|
|
@ -431,6 +431,7 @@ AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
UINT TotalBytesCopied = 0;
|
UINT TotalBytesCopied = 0;
|
||||||
PAFD_STORED_DATAGRAM DatagramRecv;
|
PAFD_STORED_DATAGRAM DatagramRecv;
|
||||||
PLIST_ENTRY ListEntry;
|
PLIST_ENTRY ListEntry;
|
||||||
|
KPROCESSOR_MODE LockMode;
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB));
|
AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB));
|
||||||
|
|
||||||
|
@ -447,7 +448,7 @@ AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
Irp, 0 );
|
Irp, 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !(RecvReq = LockRequest( Irp, IrpSp, FALSE )) )
|
if( !(RecvReq = LockRequest( Irp, IrpSp, FALSE, &LockMode )) )
|
||||||
return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY,
|
return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY,
|
||||||
Irp, 0 );
|
Irp, 0 );
|
||||||
|
|
||||||
|
@ -456,7 +457,7 @@ AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
RecvReq->BufferArray = LockBuffers( RecvReq->BufferArray,
|
RecvReq->BufferArray = LockBuffers( RecvReq->BufferArray,
|
||||||
RecvReq->BufferCount,
|
RecvReq->BufferCount,
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
TRUE, FALSE );
|
TRUE, FALSE, LockMode );
|
||||||
|
|
||||||
if( !RecvReq->BufferArray ) {
|
if( !RecvReq->BufferArray ) {
|
||||||
return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION,
|
return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION,
|
||||||
|
@ -699,6 +700,7 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
PAFD_RECV_INFO_UDP RecvReq;
|
PAFD_RECV_INFO_UDP RecvReq;
|
||||||
PLIST_ENTRY ListEntry;
|
PLIST_ENTRY ListEntry;
|
||||||
PAFD_STORED_DATAGRAM DatagramRecv;
|
PAFD_STORED_DATAGRAM DatagramRecv;
|
||||||
|
KPROCESSOR_MODE LockMode;
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB));
|
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);
|
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);
|
return UnlockAndMaybeComplete(FCB, STATUS_NO_MEMORY, Irp, 0);
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Recv flags %x\n", RecvReq->AfdFlags));
|
AFD_DbgPrint(MID_TRACE,("Recv flags %x\n", RecvReq->AfdFlags));
|
||||||
|
@ -728,7 +730,7 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
RecvReq->BufferCount,
|
RecvReq->BufferCount,
|
||||||
RecvReq->Address,
|
RecvReq->Address,
|
||||||
RecvReq->AddressLength,
|
RecvReq->AddressLength,
|
||||||
TRUE, TRUE );
|
TRUE, TRUE, LockMode );
|
||||||
|
|
||||||
if( !RecvReq->BufferArray ) { /* access violation in userspace */
|
if( !RecvReq->BufferArray ) { /* access violation in userspace */
|
||||||
return UnlockAndMaybeComplete(FCB, STATUS_ACCESS_VIOLATION, Irp, 0);
|
return UnlockAndMaybeComplete(FCB, STATUS_ACCESS_VIOLATION, Irp, 0);
|
||||||
|
|
|
@ -259,7 +259,7 @@ AfdEventSelect( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
NTSTATUS Status = STATUS_NO_MEMORY;
|
NTSTATUS Status = STATUS_NO_MEMORY;
|
||||||
PAFD_EVENT_SELECT_INFO EventSelectInfo =
|
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;
|
PAFD_FCB FCB = FileObject->FsContext;
|
||||||
|
|
||||||
if( !SocketAcquireStateLock( FCB ) ) {
|
if( !SocketAcquireStateLock( FCB ) ) {
|
||||||
|
@ -319,7 +319,7 @@ AfdEnumEvents( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
PIO_STACK_LOCATION IrpSp ) {
|
PIO_STACK_LOCATION IrpSp ) {
|
||||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
PAFD_ENUM_NETWORK_EVENTS_INFO EnumReq =
|
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;
|
PAFD_FCB FCB = FileObject->FsContext;
|
||||||
PKEVENT UserEvent;
|
PKEVENT UserEvent;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
|
|
|
@ -327,6 +327,7 @@ AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
PAFD_FCB FCB = FileObject->FsContext;
|
PAFD_FCB FCB = FileObject->FsContext;
|
||||||
PAFD_SEND_INFO SendReq;
|
PAFD_SEND_INFO SendReq;
|
||||||
UINT TotalBytesCopied = 0, i, SpaceAvail = 0, BytesCopied, SendLength;
|
UINT TotalBytesCopied = 0, i, SpaceAvail = 0, BytesCopied, SendLength;
|
||||||
|
KPROCESSOR_MODE LockMode;
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB));
|
AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB));
|
||||||
|
|
||||||
|
@ -347,14 +348,14 @@ AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
0 );
|
0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !(SendReq = LockRequest( Irp, IrpSp, FALSE )) )
|
if( !(SendReq = LockRequest( Irp, IrpSp, FALSE, &LockMode )) )
|
||||||
return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp, 0 );
|
return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY, Irp, 0 );
|
||||||
|
|
||||||
/* Must lock buffers before handing off user data */
|
/* Must lock buffers before handing off user data */
|
||||||
SendReq->BufferArray = LockBuffers( SendReq->BufferArray,
|
SendReq->BufferArray = LockBuffers( SendReq->BufferArray,
|
||||||
SendReq->BufferCount,
|
SendReq->BufferCount,
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
FALSE, FALSE );
|
FALSE, FALSE, LockMode );
|
||||||
|
|
||||||
if( !SendReq->BufferArray ) {
|
if( !SendReq->BufferArray ) {
|
||||||
return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION,
|
return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION,
|
||||||
|
@ -416,14 +417,14 @@ AfdConnectedSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
return UnlockAndMaybeComplete(FCB, STATUS_FILE_CLOSED, Irp, 0);
|
return UnlockAndMaybeComplete(FCB, STATUS_FILE_CLOSED, Irp, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !(SendReq = LockRequest( Irp, IrpSp, FALSE )) )
|
if( !(SendReq = LockRequest( Irp, IrpSp, FALSE, &LockMode )) )
|
||||||
return UnlockAndMaybeComplete
|
return UnlockAndMaybeComplete
|
||||||
( FCB, STATUS_NO_MEMORY, Irp, 0 );
|
( FCB, STATUS_NO_MEMORY, Irp, 0 );
|
||||||
|
|
||||||
SendReq->BufferArray = LockBuffers( SendReq->BufferArray,
|
SendReq->BufferArray = LockBuffers( SendReq->BufferArray,
|
||||||
SendReq->BufferCount,
|
SendReq->BufferCount,
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
FALSE, FALSE );
|
FALSE, FALSE, LockMode );
|
||||||
|
|
||||||
if( !SendReq->BufferArray ) {
|
if( !SendReq->BufferArray ) {
|
||||||
return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION,
|
return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION,
|
||||||
|
@ -556,6 +557,7 @@ AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
PAFD_FCB FCB = FileObject->FsContext;
|
PAFD_FCB FCB = FileObject->FsContext;
|
||||||
PAFD_SEND_INFO_UDP SendReq;
|
PAFD_SEND_INFO_UDP SendReq;
|
||||||
|
KPROCESSOR_MODE LockMode;
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Called on %x\n", FCB));
|
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);
|
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);
|
return UnlockAndMaybeComplete(FCB, STATUS_NO_MEMORY, Irp, 0);
|
||||||
|
|
||||||
if (FCB->State == SOCKET_STATE_CREATED)
|
if (FCB->State == SOCKET_STATE_CREATED)
|
||||||
|
@ -602,7 +604,7 @@ AfdPacketSocketWriteData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
SendReq->BufferArray = LockBuffers( SendReq->BufferArray,
|
SendReq->BufferArray = LockBuffers( SendReq->BufferArray,
|
||||||
SendReq->BufferCount,
|
SendReq->BufferCount,
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
FALSE, FALSE );
|
FALSE, FALSE, LockMode );
|
||||||
|
|
||||||
if( !SendReq->BufferArray )
|
if( !SendReq->BufferArray )
|
||||||
return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION,
|
return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION,
|
||||||
|
|
|
@ -298,7 +298,8 @@ NTSTATUS AfdAccept( PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
PAFD_WSABUF LockBuffers( PAFD_WSABUF Buf, UINT Count,
|
PAFD_WSABUF LockBuffers( PAFD_WSABUF Buf, UINT Count,
|
||||||
PVOID AddressBuf, PINT AddressLen,
|
PVOID AddressBuf, PINT AddressLen,
|
||||||
BOOLEAN Write, BOOLEAN LockAddress );
|
BOOLEAN Write, BOOLEAN LockAddress,
|
||||||
|
KPROCESSOR_MODE LockMode );
|
||||||
VOID UnlockBuffers( PAFD_WSABUF Buf, UINT Count, BOOL Address );
|
VOID UnlockBuffers( PAFD_WSABUF Buf, UINT Count, BOOL Address );
|
||||||
BOOLEAN SocketAcquireStateLock( PAFD_FCB FCB );
|
BOOLEAN SocketAcquireStateLock( PAFD_FCB FCB );
|
||||||
NTSTATUS NTAPI UnlockAndMaybeComplete
|
NTSTATUS NTAPI UnlockAndMaybeComplete
|
||||||
|
@ -308,7 +309,7 @@ VOID SocketStateUnlock( PAFD_FCB FCB );
|
||||||
NTSTATUS LostSocket( PIRP Irp );
|
NTSTATUS LostSocket( PIRP Irp );
|
||||||
PAFD_HANDLE LockHandles( PAFD_HANDLE HandleArray, UINT HandleCount );
|
PAFD_HANDLE LockHandles( PAFD_HANDLE HandleArray, UINT HandleCount );
|
||||||
VOID UnlockHandles( 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 );
|
VOID UnlockRequest( PIRP Irp, PIO_STACK_LOCATION IrpSp );
|
||||||
PVOID GetLockedData( PIRP Irp, PIO_STACK_LOCATION IrpSp );
|
PVOID GetLockedData( PIRP Irp, PIO_STACK_LOCATION IrpSp );
|
||||||
NTSTATUS LeaveIrpUntilLater( PAFD_FCB FCB, PIRP Irp, UINT Function );
|
NTSTATUS LeaveIrpUntilLater( PAFD_FCB FCB, PIRP Irp, UINT Function );
|
||||||
|
|
Loading…
Reference in a new issue