mirror of
https://github.com/reactos/reactos.git
synced 2025-04-25 08:00:24 +00:00
Formatting only, no change.
svn path=/trunk/; revision=40188
This commit is contained in:
parent
acc3c725d7
commit
d34ef92b8b
1 changed files with 242 additions and 243 deletions
|
@ -43,18 +43,18 @@ static VOID HandleEOFOnIrp( PAFD_FCB FCB, NTSTATUS Status, UINT Information ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static NTSTATUS TryToSatisfyRecvRequestFromBuffer( PAFD_FCB FCB,
|
static NTSTATUS TryToSatisfyRecvRequestFromBuffer( PAFD_FCB FCB,
|
||||||
PAFD_RECV_INFO RecvReq,
|
PAFD_RECV_INFO RecvReq,
|
||||||
PUINT TotalBytesCopied ) {
|
PUINT TotalBytesCopied ) {
|
||||||
UINT i, BytesToCopy = 0,
|
UINT i, BytesToCopy = 0,
|
||||||
BytesAvailable =
|
BytesAvailable =
|
||||||
FCB->Recv.Content - FCB->Recv.BytesUsed;
|
FCB->Recv.Content - FCB->Recv.BytesUsed;
|
||||||
PAFD_MAPBUF Map;
|
PAFD_MAPBUF Map;
|
||||||
NTSTATUS Status;
|
NTSTATUS Status;
|
||||||
*TotalBytesCopied = 0;
|
*TotalBytesCopied = 0;
|
||||||
|
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Called, BytesAvailable = %d\n",
|
AFD_DbgPrint(MID_TRACE,("Called, BytesAvailable = %d\n",
|
||||||
BytesAvailable));
|
BytesAvailable));
|
||||||
|
|
||||||
if( CantReadMore(FCB) ) return STATUS_SUCCESS;
|
if( CantReadMore(FCB) ) return STATUS_SUCCESS;
|
||||||
if( !BytesAvailable ) return STATUS_PENDING;
|
if( !BytesAvailable ) return STATUS_PENDING;
|
||||||
|
@ -62,29 +62,29 @@ static NTSTATUS TryToSatisfyRecvRequestFromBuffer( PAFD_FCB FCB,
|
||||||
Map = (PAFD_MAPBUF)(RecvReq->BufferArray + RecvReq->BufferCount);
|
Map = (PAFD_MAPBUF)(RecvReq->BufferArray + RecvReq->BufferCount);
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Buffer Count: %d @ %x\n",
|
AFD_DbgPrint(MID_TRACE,("Buffer Count: %d @ %x\n",
|
||||||
RecvReq->BufferCount,
|
RecvReq->BufferCount,
|
||||||
RecvReq->BufferArray));
|
RecvReq->BufferArray));
|
||||||
for( i = 0;
|
for( i = 0;
|
||||||
RecvReq->BufferArray &&
|
RecvReq->BufferArray &&
|
||||||
BytesAvailable &&
|
BytesAvailable &&
|
||||||
i < RecvReq->BufferCount;
|
i < RecvReq->BufferCount;
|
||||||
i++ ) {
|
i++ ) {
|
||||||
BytesToCopy =
|
BytesToCopy =
|
||||||
MIN( RecvReq->BufferArray[i].len, BytesAvailable );
|
MIN( RecvReq->BufferArray[i].len, BytesAvailable );
|
||||||
|
|
||||||
if( Map[i].Mdl ) {
|
if( Map[i].Mdl ) {
|
||||||
Map[i].BufferAddress = MmMapLockedPages( Map[i].Mdl, KernelMode );
|
Map[i].BufferAddress = MmMapLockedPages( Map[i].Mdl, KernelMode );
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Buffer %d: %x:%d\n",
|
AFD_DbgPrint(MID_TRACE,("Buffer %d: %x:%d\n",
|
||||||
i,
|
i,
|
||||||
Map[i].BufferAddress,
|
Map[i].BufferAddress,
|
||||||
BytesToCopy));
|
BytesToCopy));
|
||||||
|
|
||||||
RtlCopyMemory( Map[i].BufferAddress,
|
RtlCopyMemory( Map[i].BufferAddress,
|
||||||
FCB->Recv.Window + FCB->Recv.BytesUsed,
|
FCB->Recv.Window + FCB->Recv.BytesUsed,
|
||||||
BytesToCopy );
|
BytesToCopy );
|
||||||
|
|
||||||
MmUnmapLockedPages( Map[i].BufferAddress, Map[i].Mdl );
|
MmUnmapLockedPages( Map[i].BufferAddress, Map[i].Mdl );
|
||||||
|
|
||||||
*TotalBytesCopied += BytesToCopy;
|
*TotalBytesCopied += BytesToCopy;
|
||||||
|
|
||||||
|
@ -92,31 +92,31 @@ static NTSTATUS TryToSatisfyRecvRequestFromBuffer( PAFD_FCB FCB,
|
||||||
FCB->Recv.BytesUsed += BytesToCopy;
|
FCB->Recv.BytesUsed += BytesToCopy;
|
||||||
BytesAvailable -= BytesToCopy;
|
BytesAvailable -= BytesToCopy;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If there's nothing left in our buffer start a new request */
|
/* If there's nothing left in our buffer start a new request */
|
||||||
if( FCB->Recv.BytesUsed == FCB->Recv.Content ) {
|
if( FCB->Recv.BytesUsed == FCB->Recv.Content ) {
|
||||||
FCB->Recv.BytesUsed = FCB->Recv.Content = 0;
|
FCB->Recv.BytesUsed = FCB->Recv.Content = 0;
|
||||||
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
||||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||||
|
|
||||||
if( !FCB->ReceiveIrp.InFlightRequest ) {
|
if( !FCB->ReceiveIrp.InFlightRequest ) {
|
||||||
AFD_DbgPrint(MID_TRACE,("Replenishing buffer\n"));
|
AFD_DbgPrint(MID_TRACE,("Replenishing buffer\n"));
|
||||||
|
|
||||||
Status = TdiReceive( &FCB->ReceiveIrp.InFlightRequest,
|
Status = TdiReceive( &FCB->ReceiveIrp.InFlightRequest,
|
||||||
FCB->Connection.Object,
|
FCB->Connection.Object,
|
||||||
TDI_RECEIVE_NORMAL,
|
TDI_RECEIVE_NORMAL,
|
||||||
FCB->Recv.Window,
|
FCB->Recv.Window,
|
||||||
FCB->Recv.Size,
|
FCB->Recv.Size,
|
||||||
&FCB->ReceiveIrp.Iosb,
|
&FCB->ReceiveIrp.Iosb,
|
||||||
ReceiveComplete,
|
ReceiveComplete,
|
||||||
FCB );
|
FCB );
|
||||||
|
|
||||||
if( Status == STATUS_SUCCESS )
|
if( Status == STATUS_SUCCESS )
|
||||||
FCB->Recv.Content = FCB->ReceiveIrp.Iosb.Information;
|
FCB->Recv.Content = FCB->ReceiveIrp.Iosb.Information;
|
||||||
HandleEOFOnIrp( FCB, Status, FCB->ReceiveIrp.Iosb.Information );
|
HandleEOFOnIrp( FCB, Status, FCB->ReceiveIrp.Iosb.Information );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return STATUS_SUCCESS;
|
return STATUS_SUCCESS;
|
||||||
|
@ -159,53 +159,53 @@ static NTSTATUS ReceiveActivity( PAFD_FCB FCB, PIRP Irp ) {
|
||||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
/* Kick the user that receive would be possible now */
|
/* Kick the user that receive would be possible now */
|
||||||
/* XXX Not implemented yet */
|
/* XXX Not implemented yet */
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("FCB %x Receive data waiting %d\n",
|
AFD_DbgPrint(MID_TRACE,("FCB %x Receive data waiting %d\n",
|
||||||
FCB, FCB->Recv.Content));
|
FCB, FCB->Recv.Content));
|
||||||
/*OskitDumpBuffer( FCB->Recv.Window, FCB->Recv.Content );*/
|
/*OskitDumpBuffer( FCB->Recv.Window, FCB->Recv.Content );*/
|
||||||
|
|
||||||
/* Try to clear some requests */
|
/* Try to clear some requests */
|
||||||
while( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_RECV] ) ) {
|
while( !IsListEmpty( &FCB->PendingIrpList[FUNCTION_RECV] ) ) {
|
||||||
NextIrpEntry =
|
NextIrpEntry =
|
||||||
RemoveHeadList(&FCB->PendingIrpList[FUNCTION_RECV]);
|
RemoveHeadList(&FCB->PendingIrpList[FUNCTION_RECV]);
|
||||||
NextIrp =
|
NextIrp =
|
||||||
CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
|
CONTAINING_RECORD(NextIrpEntry, IRP, Tail.Overlay.ListEntry);
|
||||||
NextIrpSp = IoGetCurrentIrpStackLocation( NextIrp );
|
NextIrpSp = IoGetCurrentIrpStackLocation( NextIrp );
|
||||||
RecvReq = NextIrpSp->Parameters.DeviceIoControl.Type3InputBuffer;
|
RecvReq = NextIrpSp->Parameters.DeviceIoControl.Type3InputBuffer;
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("RecvReq @ %x\n", RecvReq));
|
AFD_DbgPrint(MID_TRACE,("RecvReq @ %x\n", RecvReq));
|
||||||
|
|
||||||
Status = TryToSatisfyRecvRequestFromBuffer
|
Status = TryToSatisfyRecvRequestFromBuffer
|
||||||
( FCB, RecvReq, &TotalBytesCopied );
|
( FCB, RecvReq, &TotalBytesCopied );
|
||||||
|
|
||||||
if( Status == STATUS_PENDING ) {
|
if( Status == STATUS_PENDING ) {
|
||||||
AFD_DbgPrint(MID_TRACE,("Ran out of data for %x\n", NextIrp));
|
AFD_DbgPrint(MID_TRACE,("Ran out of data for %x\n", NextIrp));
|
||||||
InsertHeadList(&FCB->PendingIrpList[FUNCTION_RECV],
|
InsertHeadList(&FCB->PendingIrpList[FUNCTION_RECV],
|
||||||
&NextIrp->Tail.Overlay.ListEntry);
|
&NextIrp->Tail.Overlay.ListEntry);
|
||||||
break;
|
break;
|
||||||
} else {
|
} else {
|
||||||
AFD_DbgPrint(MID_TRACE,("Completing recv %x (%d)\n", NextIrp,
|
AFD_DbgPrint(MID_TRACE,("Completing recv %x (%d)\n", NextIrp,
|
||||||
TotalBytesCopied));
|
TotalBytesCopied));
|
||||||
UnlockBuffers( RecvReq->BufferArray,
|
UnlockBuffers( RecvReq->BufferArray,
|
||||||
RecvReq->BufferCount, FALSE );
|
RecvReq->BufferCount, FALSE );
|
||||||
NextIrp->IoStatus.Status = Status;
|
NextIrp->IoStatus.Status = Status;
|
||||||
NextIrp->IoStatus.Information = TotalBytesCopied;
|
NextIrp->IoStatus.Information = TotalBytesCopied;
|
||||||
if( NextIrp == Irp ) {
|
if( NextIrp == Irp ) {
|
||||||
RetStatus = Status;
|
RetStatus = Status;
|
||||||
RetBytesCopied = TotalBytesCopied;
|
RetBytesCopied = TotalBytesCopied;
|
||||||
|
}
|
||||||
|
if( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
|
||||||
|
IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
|
|
||||||
IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if( FCB->Recv.Content ) {
|
if( FCB->Recv.Content ) {
|
||||||
FCB->PollState |= AFD_EVENT_RECEIVE;
|
FCB->PollState |= AFD_EVENT_RECEIVE;
|
||||||
} else
|
} else
|
||||||
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
||||||
|
|
||||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||||
|
|
||||||
|
@ -242,7 +242,7 @@ NTSTATUS NTAPI ReceiveComplete
|
||||||
Irp->IoStatus.Status = STATUS_CANCELLED;
|
Irp->IoStatus.Status = STATUS_CANCELLED;
|
||||||
Irp->IoStatus.Information = 0;
|
Irp->IoStatus.Information = 0;
|
||||||
SocketStateUnlock( FCB );
|
SocketStateUnlock( FCB );
|
||||||
return STATUS_CANCELLED;
|
return STATUS_CANCELLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
FCB->Recv.Content = Irp->IoStatus.Information;
|
FCB->Recv.Content = Irp->IoStatus.Information;
|
||||||
|
@ -252,9 +252,9 @@ NTSTATUS NTAPI ReceiveComplete
|
||||||
AFD_DbgPrint(MIN_TRACE,("!!! CLOSED SOCK GOT A RECEIVE COMPLETE !!!\n"));
|
AFD_DbgPrint(MIN_TRACE,("!!! CLOSED SOCK GOT A RECEIVE COMPLETE !!!\n"));
|
||||||
Irp->IoStatus.Status = STATUS_FILE_CLOSED;
|
Irp->IoStatus.Status = STATUS_FILE_CLOSED;
|
||||||
Irp->IoStatus.Information = 0;
|
Irp->IoStatus.Information = 0;
|
||||||
SocketStateUnlock( FCB );
|
SocketStateUnlock( FCB );
|
||||||
DestroySocket( FCB );
|
DestroySocket( FCB );
|
||||||
return STATUS_FILE_CLOSED;
|
return STATUS_FILE_CLOSED;
|
||||||
} else if( FCB->State == SOCKET_STATE_LISTENING ) {
|
} else if( FCB->State == SOCKET_STATE_LISTENING ) {
|
||||||
AFD_DbgPrint(MIN_TRACE,("!!! LISTENER GOT A RECEIVE COMPLETE !!!\n"));
|
AFD_DbgPrint(MIN_TRACE,("!!! LISTENER GOT A RECEIVE COMPLETE !!!\n"));
|
||||||
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
|
Irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
|
||||||
|
@ -276,7 +276,7 @@ NTSTATUS NTAPI ReceiveComplete
|
||||||
|
|
||||||
NTSTATUS NTAPI
|
NTSTATUS NTAPI
|
||||||
AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
PIO_STACK_LOCATION IrpSp, BOOLEAN Short) {
|
PIO_STACK_LOCATION IrpSp, BOOLEAN Short) {
|
||||||
NTSTATUS Status = STATUS_INVALID_PARAMETER;
|
NTSTATUS Status = STATUS_INVALID_PARAMETER;
|
||||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
PAFD_FCB FCB = FileObject->FsContext;
|
PAFD_FCB FCB = FileObject->FsContext;
|
||||||
|
@ -292,29 +292,29 @@ AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
AFD_DbgPrint(MID_TRACE,("Called recv on wrong kind of socket (s%x)\n",
|
AFD_DbgPrint(MID_TRACE,("Called recv on wrong kind of socket (s%x)\n",
|
||||||
FCB->State));
|
FCB->State));
|
||||||
return UnlockAndMaybeComplete( FCB, STATUS_INVALID_PARAMETER,
|
return UnlockAndMaybeComplete( FCB, STATUS_INVALID_PARAMETER,
|
||||||
Irp, 0, NULL );
|
Irp, 0, NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( FCB->Flags & AFD_ENDPOINT_CONNECTIONLESS )
|
if( FCB->Flags & AFD_ENDPOINT_CONNECTIONLESS )
|
||||||
{
|
{
|
||||||
AFD_DbgPrint(MID_TRACE,("Receive on connection-less sockets not implemented\n"));
|
AFD_DbgPrint(MID_TRACE,("Receive on connection-less sockets not implemented\n"));
|
||||||
return UnlockAndMaybeComplete( FCB, STATUS_NOT_IMPLEMENTED,
|
return UnlockAndMaybeComplete( FCB, STATUS_NOT_IMPLEMENTED,
|
||||||
Irp, 0, NULL );
|
Irp, 0, NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
FCB->EventsFired &= ~AFD_EVENT_RECEIVE;
|
FCB->EventsFired &= ~AFD_EVENT_RECEIVE;
|
||||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||||
|
|
||||||
if( !(RecvReq = LockRequest( Irp, IrpSp )) )
|
if( !(RecvReq = LockRequest( Irp, IrpSp )) )
|
||||||
return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY,
|
return UnlockAndMaybeComplete( FCB, STATUS_NO_MEMORY,
|
||||||
Irp, 0, NULL );
|
Irp, 0, NULL );
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Recv flags %x\n", RecvReq->AfdFlags));
|
AFD_DbgPrint(MID_TRACE,("Recv flags %x\n", RecvReq->AfdFlags));
|
||||||
|
|
||||||
RecvReq->BufferArray = LockBuffers( RecvReq->BufferArray,
|
RecvReq->BufferArray = LockBuffers( RecvReq->BufferArray,
|
||||||
RecvReq->BufferCount,
|
RecvReq->BufferCount,
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
TRUE, FALSE );
|
TRUE, FALSE );
|
||||||
|
|
||||||
if( !RecvReq->BufferArray ) {
|
if( !RecvReq->BufferArray ) {
|
||||||
return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION,
|
return UnlockAndMaybeComplete( FCB, STATUS_ACCESS_VIOLATION,
|
||||||
|
@ -353,79 +353,79 @@ AfdConnectedSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
static NTSTATUS NTAPI
|
static NTSTATUS NTAPI
|
||||||
SatisfyPacketRecvRequest( PAFD_FCB FCB, PIRP Irp,
|
SatisfyPacketRecvRequest( PAFD_FCB FCB, PIRP Irp,
|
||||||
PAFD_STORED_DATAGRAM DatagramRecv,
|
PAFD_STORED_DATAGRAM DatagramRecv,
|
||||||
PUINT TotalBytesCopied ) {
|
PUINT TotalBytesCopied ) {
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation( Irp );
|
PIO_STACK_LOCATION IrpSp = IoGetCurrentIrpStackLocation( Irp );
|
||||||
PAFD_RECV_INFO RecvReq =
|
PAFD_RECV_INFO RecvReq =
|
||||||
IrpSp->Parameters.DeviceIoControl.Type3InputBuffer;
|
IrpSp->Parameters.DeviceIoControl.Type3InputBuffer;
|
||||||
UINT BytesToCopy = 0, BytesAvailable = DatagramRecv->Len, AddrLen = 0;
|
UINT BytesToCopy = 0, BytesAvailable = DatagramRecv->Len, AddrLen = 0;
|
||||||
PAFD_MAPBUF Map;
|
PAFD_MAPBUF Map;
|
||||||
|
|
||||||
Map = (PAFD_MAPBUF)(RecvReq->BufferArray +
|
Map = (PAFD_MAPBUF)(RecvReq->BufferArray +
|
||||||
RecvReq->BufferCount +
|
RecvReq->BufferCount +
|
||||||
EXTRA_LOCK_BUFFERS);
|
EXTRA_LOCK_BUFFERS);
|
||||||
|
|
||||||
BytesToCopy =
|
BytesToCopy =
|
||||||
MIN( RecvReq->BufferArray[0].len, BytesAvailable );
|
MIN( RecvReq->BufferArray[0].len, BytesAvailable );
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("BytesToCopy: %d len %d\n", BytesToCopy,
|
AFD_DbgPrint(MID_TRACE,("BytesToCopy: %d len %d\n", BytesToCopy,
|
||||||
RecvReq->BufferArray[0].len));
|
RecvReq->BufferArray[0].len));
|
||||||
|
|
||||||
if( Map[0].Mdl ) {
|
if( Map[0].Mdl ) {
|
||||||
/* Copy the address */
|
/* Copy the address */
|
||||||
if( Map[1].Mdl && Map[2].Mdl ) {
|
if( Map[1].Mdl && Map[2].Mdl ) {
|
||||||
AFD_DbgPrint(MID_TRACE,("Checking TAAddressCount\n"));
|
AFD_DbgPrint(MID_TRACE,("Checking TAAddressCount\n"));
|
||||||
|
|
||||||
if( DatagramRecv->Address->TAAddressCount != 1 ) {
|
if( DatagramRecv->Address->TAAddressCount != 1 ) {
|
||||||
AFD_DbgPrint
|
AFD_DbgPrint
|
||||||
(MID_TRACE,
|
(MID_TRACE,
|
||||||
("Wierd address count %d\n",
|
("Wierd address count %d\n",
|
||||||
DatagramRecv->Address->TAAddressCount));
|
DatagramRecv->Address->TAAddressCount));
|
||||||
}
|
}
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Computing addr len\n"));
|
AFD_DbgPrint(MID_TRACE,("Computing addr len\n"));
|
||||||
|
|
||||||
AddrLen = MIN(DatagramRecv->Address->Address->AddressLength +
|
AddrLen = MIN(DatagramRecv->Address->Address->AddressLength +
|
||||||
sizeof(USHORT),
|
sizeof(USHORT),
|
||||||
RecvReq->BufferArray[1].len);
|
RecvReq->BufferArray[1].len);
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Copying %d bytes of address\n", AddrLen));
|
AFD_DbgPrint(MID_TRACE,("Copying %d bytes of address\n", AddrLen));
|
||||||
|
|
||||||
Map[1].BufferAddress = MmMapLockedPages( Map[1].Mdl, KernelMode );
|
Map[1].BufferAddress = MmMapLockedPages( Map[1].Mdl, KernelMode );
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Done mapping, copying address\n"));
|
AFD_DbgPrint(MID_TRACE,("Done mapping, copying address\n"));
|
||||||
|
|
||||||
RtlCopyMemory( Map[1].BufferAddress,
|
RtlCopyMemory( Map[1].BufferAddress,
|
||||||
&DatagramRecv->Address->Address->AddressType,
|
&DatagramRecv->Address->Address->AddressType,
|
||||||
AddrLen );
|
AddrLen );
|
||||||
|
|
||||||
MmUnmapLockedPages( Map[1].BufferAddress, Map[1].Mdl );
|
MmUnmapLockedPages( Map[1].BufferAddress, Map[1].Mdl );
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Copying address len\n"));
|
AFD_DbgPrint(MID_TRACE,("Copying address len\n"));
|
||||||
|
|
||||||
Map[2].BufferAddress = MmMapLockedPages( Map[2].Mdl, KernelMode );
|
Map[2].BufferAddress = MmMapLockedPages( Map[2].Mdl, KernelMode );
|
||||||
*((PINT)Map[2].BufferAddress) = AddrLen;
|
*((PINT)Map[2].BufferAddress) = AddrLen;
|
||||||
MmUnmapLockedPages( Map[2].BufferAddress, Map[2].Mdl );
|
MmUnmapLockedPages( Map[2].BufferAddress, Map[2].Mdl );
|
||||||
}
|
}
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Mapping data buffer pages\n"));
|
AFD_DbgPrint(MID_TRACE,("Mapping data buffer pages\n"));
|
||||||
|
|
||||||
Map[0].BufferAddress = MmMapLockedPages( Map[0].Mdl, KernelMode );
|
Map[0].BufferAddress = MmMapLockedPages( Map[0].Mdl, KernelMode );
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Buffer %d: %x:%d\n",
|
AFD_DbgPrint(MID_TRACE,("Buffer %d: %x:%d\n",
|
||||||
0,
|
0,
|
||||||
Map[0].BufferAddress,
|
Map[0].BufferAddress,
|
||||||
BytesToCopy));
|
BytesToCopy));
|
||||||
|
|
||||||
/* OskitDumpBuffer
|
/* OskitDumpBuffer
|
||||||
( FCB->Recv.Window + FCB->Recv.BytesUsed, BytesToCopy ); */
|
( FCB->Recv.Window + FCB->Recv.BytesUsed, BytesToCopy ); */
|
||||||
|
|
||||||
RtlCopyMemory( Map[0].BufferAddress,
|
RtlCopyMemory( Map[0].BufferAddress,
|
||||||
FCB->Recv.Window + FCB->Recv.BytesUsed,
|
FCB->Recv.Window + FCB->Recv.BytesUsed,
|
||||||
BytesToCopy );
|
BytesToCopy );
|
||||||
|
|
||||||
MmUnmapLockedPages( Map[0].BufferAddress, Map[0].Mdl );
|
MmUnmapLockedPages( Map[0].BufferAddress, Map[0].Mdl );
|
||||||
|
|
||||||
*TotalBytesCopied = BytesToCopy;
|
*TotalBytesCopied = BytesToCopy;
|
||||||
|
|
||||||
|
@ -446,9 +446,9 @@ SatisfyPacketRecvRequest( PAFD_FCB FCB, PIRP Irp,
|
||||||
|
|
||||||
NTSTATUS NTAPI
|
NTSTATUS NTAPI
|
||||||
PacketSocketRecvComplete(
|
PacketSocketRecvComplete(
|
||||||
PDEVICE_OBJECT DeviceObject,
|
PDEVICE_OBJECT DeviceObject,
|
||||||
PIRP Irp,
|
PIRP Irp,
|
||||||
PVOID Context ) {
|
PVOID Context ) {
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
PAFD_FCB FCB = Context;
|
PAFD_FCB FCB = Context;
|
||||||
PIRP NextIrp;
|
PIRP NextIrp;
|
||||||
|
@ -468,105 +468,104 @@ PacketSocketRecvComplete(
|
||||||
|
|
||||||
FCB->ReceiveIrp.InFlightRequest = NULL;
|
FCB->ReceiveIrp.InFlightRequest = NULL;
|
||||||
|
|
||||||
if( Irp->Cancel ) {
|
if( Irp->IoStatus.Status == STATUS_CANCELLED ) {
|
||||||
Irp->IoStatus.Status = STATUS_CANCELLED;
|
Irp->IoStatus.Status = STATUS_CANCELLED;
|
||||||
Irp->IoStatus.Information = 0;
|
Irp->IoStatus.Information = 0;
|
||||||
SocketStateUnlock( FCB );
|
SocketStateUnlock( FCB );
|
||||||
return STATUS_CANCELLED;
|
return STATUS_CANCELLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( FCB->State == SOCKET_STATE_CLOSED ) {
|
if( FCB->State == SOCKET_STATE_CLOSED ) {
|
||||||
Irp->IoStatus.Status = STATUS_FILE_CLOSED;
|
Irp->IoStatus.Status = STATUS_FILE_CLOSED;
|
||||||
Irp->IoStatus.Information = 0;
|
Irp->IoStatus.Information = 0;
|
||||||
SocketStateUnlock( FCB );
|
SocketStateUnlock( FCB );
|
||||||
DestroySocket( FCB );
|
DestroySocket( FCB );
|
||||||
return STATUS_FILE_CLOSED;
|
return STATUS_FILE_CLOSED;
|
||||||
}
|
}
|
||||||
|
|
||||||
DatagramRecv = ExAllocatePool( NonPagedPool, DGSize );
|
DatagramRecv = ExAllocatePool( NonPagedPool, DGSize );
|
||||||
|
|
||||||
if( DatagramRecv ) {
|
if( DatagramRecv ) {
|
||||||
DatagramRecv->Len = Irp->IoStatus.Information;
|
DatagramRecv->Len = Irp->IoStatus.Information;
|
||||||
RtlCopyMemory( DatagramRecv->Buffer, FCB->Recv.Window,
|
RtlCopyMemory( DatagramRecv->Buffer, FCB->Recv.Window,
|
||||||
DatagramRecv->Len );
|
DatagramRecv->Len );
|
||||||
AFD_DbgPrint(MID_TRACE,("Received (A %x)\n",
|
AFD_DbgPrint(MID_TRACE,("Received (A %x)\n",
|
||||||
FCB->AddressFrom->RemoteAddress));
|
FCB->AddressFrom->RemoteAddress));
|
||||||
DatagramRecv->Address =
|
DatagramRecv->Address =
|
||||||
TaCopyTransportAddress( FCB->AddressFrom->RemoteAddress );
|
TaCopyTransportAddress( FCB->AddressFrom->RemoteAddress );
|
||||||
|
|
||||||
if( !DatagramRecv->Address ) Status = STATUS_NO_MEMORY;
|
if( !DatagramRecv->Address ) Status = STATUS_NO_MEMORY;
|
||||||
|
|
||||||
} else Status = STATUS_NO_MEMORY;
|
} else Status = STATUS_NO_MEMORY;
|
||||||
|
|
||||||
if( !NT_SUCCESS( Status ) ) {
|
if( !NT_SUCCESS( Status ) ) {
|
||||||
Irp->IoStatus.Status = Status;
|
Irp->IoStatus.Status = Status;
|
||||||
Irp->IoStatus.Information = 0;
|
Irp->IoStatus.Information = 0;
|
||||||
if( DatagramRecv ) ExFreePool( DatagramRecv );
|
if( DatagramRecv ) ExFreePool( DatagramRecv );
|
||||||
SocketStateUnlock( FCB );
|
SocketStateUnlock( FCB );
|
||||||
return Status;
|
return Status;
|
||||||
} else {
|
} else {
|
||||||
InsertTailList( &FCB->DatagramList, &DatagramRecv->ListEntry );
|
InsertTailList( &FCB->DatagramList, &DatagramRecv->ListEntry );
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Satisfy as many requests as we can */
|
/* Satisfy as many requests as we can */
|
||||||
|
|
||||||
while( !IsListEmpty( &FCB->DatagramList ) &&
|
while( !IsListEmpty( &FCB->DatagramList ) &&
|
||||||
!IsListEmpty( &FCB->PendingIrpList[FUNCTION_RECV] ) ) {
|
!IsListEmpty( &FCB->PendingIrpList[FUNCTION_RECV] ) ) {
|
||||||
AFD_DbgPrint(MID_TRACE,("Looping trying to satisfy request\n"));
|
AFD_DbgPrint(MID_TRACE,("Looping trying to satisfy request\n"));
|
||||||
ListEntry = RemoveHeadList( &FCB->DatagramList );
|
ListEntry = RemoveHeadList( &FCB->DatagramList );
|
||||||
DatagramRecv = CONTAINING_RECORD( ListEntry, AFD_STORED_DATAGRAM,
|
DatagramRecv = CONTAINING_RECORD( ListEntry, AFD_STORED_DATAGRAM,
|
||||||
ListEntry );
|
ListEntry );
|
||||||
ListEntry = RemoveHeadList( &FCB->PendingIrpList[FUNCTION_RECV] );
|
ListEntry = RemoveHeadList( &FCB->PendingIrpList[FUNCTION_RECV] );
|
||||||
NextIrp = CONTAINING_RECORD( ListEntry, IRP, Tail.Overlay.ListEntry );
|
NextIrp = CONTAINING_RECORD( ListEntry, IRP, Tail.Overlay.ListEntry );
|
||||||
NextIrpSp = IoGetCurrentIrpStackLocation( NextIrp );
|
NextIrpSp = IoGetCurrentIrpStackLocation( NextIrp );
|
||||||
RecvReq = NextIrpSp->Parameters.DeviceIoControl.Type3InputBuffer;
|
RecvReq = NextIrpSp->Parameters.DeviceIoControl.Type3InputBuffer;
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("RecvReq: %x, DatagramRecv: %x\n",
|
AFD_DbgPrint(MID_TRACE,("RecvReq: %x, DatagramRecv: %x\n",
|
||||||
RecvReq, DatagramRecv));
|
RecvReq, DatagramRecv));
|
||||||
|
|
||||||
if( DatagramRecv->Len > RecvReq->BufferArray[0].len &&
|
if( DatagramRecv->Len > RecvReq->BufferArray[0].len &&
|
||||||
!(RecvReq->TdiFlags & TDI_RECEIVE_PARTIAL) ) {
|
!(RecvReq->TdiFlags & TDI_RECEIVE_PARTIAL) ) {
|
||||||
InsertHeadList( &FCB->DatagramList,
|
InsertHeadList( &FCB->DatagramList,
|
||||||
&DatagramRecv->ListEntry );
|
&DatagramRecv->ListEntry );
|
||||||
Status = NextIrp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
|
Status = NextIrp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
|
||||||
NextIrp->IoStatus.Information = DatagramRecv->Len;
|
NextIrp->IoStatus.Information = DatagramRecv->Len;
|
||||||
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
|
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
|
||||||
if ( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
|
if ( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
|
||||||
IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
|
IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
|
||||||
} else {
|
} else {
|
||||||
AFD_DbgPrint(MID_TRACE,("Satisfying\n"));
|
AFD_DbgPrint(MID_TRACE,("Satisfying\n"));
|
||||||
Status = SatisfyPacketRecvRequest
|
Status = SatisfyPacketRecvRequest
|
||||||
( FCB, NextIrp, DatagramRecv,
|
( FCB, NextIrp, DatagramRecv,
|
||||||
(PUINT)&NextIrp->IoStatus.Information );
|
(PUINT)&NextIrp->IoStatus.Information );
|
||||||
AFD_DbgPrint(MID_TRACE,("Unlocking\n"));
|
AFD_DbgPrint(MID_TRACE,("Unlocking\n"));
|
||||||
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
|
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
|
||||||
if ( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
|
if ( NextIrp->MdlAddress ) UnlockRequest( NextIrp, IoGetCurrentIrpStackLocation( NextIrp ) );
|
||||||
AFD_DbgPrint(MID_TRACE,("Completing\n"));
|
AFD_DbgPrint(MID_TRACE,("Completing\n"));
|
||||||
IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
|
IoCompleteRequest( NextIrp, IO_NETWORK_INCREMENT );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !IsListEmpty( &FCB->DatagramList ) ) {
|
if( !IsListEmpty( &FCB->DatagramList ) ) {
|
||||||
AFD_DbgPrint(MID_TRACE,("Signalling\n"));
|
AFD_DbgPrint(MID_TRACE,("Signalling\n"));
|
||||||
FCB->PollState |= AFD_EVENT_RECEIVE;
|
FCB->PollState |= AFD_EVENT_RECEIVE;
|
||||||
} else
|
} else
|
||||||
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
||||||
|
|
||||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||||
|
|
||||||
if( NT_SUCCESS(Irp->IoStatus.Status) ) {
|
if( NT_SUCCESS(Irp->IoStatus.Status) ) {
|
||||||
|
/* Now relaunch the datagram request */
|
||||||
/* Now relaunch the datagram request */
|
Status = TdiReceiveDatagram
|
||||||
Status = TdiReceiveDatagram
|
( &FCB->ReceiveIrp.InFlightRequest,
|
||||||
( &FCB->ReceiveIrp.InFlightRequest,
|
FCB->AddressFile.Object,
|
||||||
FCB->AddressFile.Object,
|
0,
|
||||||
0,
|
FCB->Recv.Window,
|
||||||
FCB->Recv.Window,
|
FCB->Recv.Size,
|
||||||
FCB->Recv.Size,
|
FCB->AddressFrom,
|
||||||
FCB->AddressFrom,
|
&FCB->ReceiveIrp.Iosb,
|
||||||
&FCB->ReceiveIrp.Iosb,
|
PacketSocketRecvComplete,
|
||||||
PacketSocketRecvComplete,
|
FCB );
|
||||||
FCB );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SocketStateUnlock( FCB );
|
SocketStateUnlock( FCB );
|
||||||
|
@ -576,7 +575,7 @@ PacketSocketRecvComplete(
|
||||||
|
|
||||||
NTSTATUS NTAPI
|
NTSTATUS NTAPI
|
||||||
AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
PIO_STACK_LOCATION IrpSp ) {
|
PIO_STACK_LOCATION IrpSp ) {
|
||||||
NTSTATUS Status = STATUS_SUCCESS;
|
NTSTATUS Status = STATUS_SUCCESS;
|
||||||
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
PFILE_OBJECT FileObject = IrpSp->FileObject;
|
||||||
PAFD_FCB FCB = FileObject->FsContext;
|
PAFD_FCB FCB = FileObject->FsContext;
|
||||||
|
@ -592,72 +591,72 @@ AfdPacketSocketReadData(PDEVICE_OBJECT DeviceObject, PIRP Irp,
|
||||||
|
|
||||||
/* Check that the socket is bound */
|
/* Check that the socket is bound */
|
||||||
if( FCB->State != SOCKET_STATE_BOUND )
|
if( FCB->State != SOCKET_STATE_BOUND )
|
||||||
return UnlockAndMaybeComplete
|
return UnlockAndMaybeComplete
|
||||||
( FCB, STATUS_INVALID_PARAMETER, Irp, 0, NULL );
|
( FCB, STATUS_INVALID_PARAMETER, Irp, 0, NULL );
|
||||||
if( !(RecvReq = LockRequest( Irp, IrpSp )) )
|
if( !(RecvReq = LockRequest( Irp, IrpSp )) )
|
||||||
return UnlockAndMaybeComplete
|
return UnlockAndMaybeComplete
|
||||||
( FCB, STATUS_NO_MEMORY, Irp, 0, NULL );
|
( FCB, STATUS_NO_MEMORY, Irp, 0, NULL );
|
||||||
|
|
||||||
AFD_DbgPrint(MID_TRACE,("Recv flags %x\n", RecvReq->AfdFlags));
|
AFD_DbgPrint(MID_TRACE,("Recv flags %x\n", RecvReq->AfdFlags));
|
||||||
|
|
||||||
RecvReq->BufferArray = LockBuffers( RecvReq->BufferArray,
|
RecvReq->BufferArray = LockBuffers( RecvReq->BufferArray,
|
||||||
RecvReq->BufferCount,
|
RecvReq->BufferCount,
|
||||||
RecvReq->Address,
|
RecvReq->Address,
|
||||||
RecvReq->AddressLength,
|
RecvReq->AddressLength,
|
||||||
TRUE, TRUE );
|
TRUE, TRUE );
|
||||||
|
|
||||||
if( !RecvReq->BufferArray ) { /* access violation in userspace */
|
if( !RecvReq->BufferArray ) { /* access violation in userspace */
|
||||||
return UnlockAndMaybeComplete
|
return UnlockAndMaybeComplete
|
||||||
( FCB, STATUS_ACCESS_VIOLATION, Irp, 0, NULL );
|
( FCB, STATUS_ACCESS_VIOLATION, Irp, 0, NULL );
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !IsListEmpty( &FCB->DatagramList ) ) {
|
if( !IsListEmpty( &FCB->DatagramList ) ) {
|
||||||
ListEntry = RemoveHeadList( &FCB->DatagramList );
|
ListEntry = RemoveHeadList( &FCB->DatagramList );
|
||||||
DatagramRecv = CONTAINING_RECORD
|
DatagramRecv = CONTAINING_RECORD
|
||||||
( ListEntry, AFD_STORED_DATAGRAM, ListEntry );
|
( ListEntry, AFD_STORED_DATAGRAM, ListEntry );
|
||||||
if( DatagramRecv->Len > RecvReq->BufferArray[0].len &&
|
if( DatagramRecv->Len > RecvReq->BufferArray[0].len &&
|
||||||
!(RecvReq->TdiFlags & TDI_RECEIVE_PARTIAL) ) {
|
!(RecvReq->TdiFlags & TDI_RECEIVE_PARTIAL) ) {
|
||||||
InsertHeadList( &FCB->DatagramList,
|
InsertHeadList( &FCB->DatagramList,
|
||||||
&DatagramRecv->ListEntry );
|
&DatagramRecv->ListEntry );
|
||||||
Status = Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
|
Status = Irp->IoStatus.Status = STATUS_BUFFER_TOO_SMALL;
|
||||||
Irp->IoStatus.Information = DatagramRecv->Len;
|
Irp->IoStatus.Information = DatagramRecv->Len;
|
||||||
|
|
||||||
if( IsListEmpty( &FCB->DatagramList ) )
|
if( IsListEmpty( &FCB->DatagramList ) )
|
||||||
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
||||||
else
|
else
|
||||||
FCB->PollState |= AFD_EVENT_RECEIVE;
|
FCB->PollState |= AFD_EVENT_RECEIVE;
|
||||||
|
|
||||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||||
|
|
||||||
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
|
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
|
||||||
|
|
||||||
return UnlockAndMaybeComplete
|
return UnlockAndMaybeComplete
|
||||||
( FCB, Status, Irp, Irp->IoStatus.Information, NULL );
|
( FCB, Status, Irp, Irp->IoStatus.Information, NULL );
|
||||||
} else {
|
} else {
|
||||||
Status = SatisfyPacketRecvRequest
|
Status = SatisfyPacketRecvRequest
|
||||||
( FCB, Irp, DatagramRecv,
|
( FCB, Irp, DatagramRecv,
|
||||||
(PUINT)&Irp->IoStatus.Information );
|
(PUINT)&Irp->IoStatus.Information );
|
||||||
|
|
||||||
if( IsListEmpty( &FCB->DatagramList ) )
|
if( IsListEmpty( &FCB->DatagramList ) )
|
||||||
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
FCB->PollState &= ~AFD_EVENT_RECEIVE;
|
||||||
else
|
else
|
||||||
FCB->PollState |= AFD_EVENT_RECEIVE;
|
FCB->PollState |= AFD_EVENT_RECEIVE;
|
||||||
|
|
||||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||||
|
|
||||||
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
|
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
|
||||||
|
|
||||||
return UnlockAndMaybeComplete
|
return UnlockAndMaybeComplete
|
||||||
( FCB, Status, Irp, Irp->IoStatus.Information, NULL );
|
( FCB, Status, Irp, Irp->IoStatus.Information, NULL );
|
||||||
}
|
}
|
||||||
} else if( RecvReq->AfdFlags & AFD_IMMEDIATE ) {
|
} else if( RecvReq->AfdFlags & AFD_IMMEDIATE ) {
|
||||||
AFD_DbgPrint(MID_TRACE,("Nonblocking\n"));
|
AFD_DbgPrint(MID_TRACE,("Nonblocking\n"));
|
||||||
Status = STATUS_CANT_WAIT;
|
Status = STATUS_CANT_WAIT;
|
||||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||||
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
|
UnlockBuffers( RecvReq->BufferArray, RecvReq->BufferCount, TRUE );
|
||||||
return UnlockAndMaybeComplete( FCB, Status, Irp, 0, NULL );
|
return UnlockAndMaybeComplete( FCB, Status, Irp, 0, NULL );
|
||||||
} else {
|
} else {
|
||||||
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
PollReeval( FCB->DeviceExt, FCB->FileObject );
|
||||||
return LeaveIrpUntilLater( FCB, Irp, FUNCTION_RECV );
|
return LeaveIrpUntilLater( FCB, Irp, FUNCTION_RECV );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue