TI_DbgPrint(DEBUG_IRP, ("Done Completing IRP\n"));
}
+typedef struct _DISCONNECT_TYPE {
+ UINT Type;
+ PVOID Context;
+ PIRP Irp;
+ PFILE_OBJECT FileObject;
+} DISCONNECT_TYPE, *PDISCONNECT_TYPE;
+
+VOID DispDoDisconnect( PVOID Data ) {
+ PDISCONNECT_TYPE DisType = (PDISCONNECT_TYPE)Data;
+
+ TI_DbgPrint(DEBUG_IRP, ("PostCancel: DoDisconnect\n"));
+ TCPDisconnect
+ ( DisType->Context,
+ DisType->Type,
+ NULL,
+ NULL,
+ DispDataRequestComplete,
+ DisType->Irp );
+ TI_DbgPrint(DEBUG_IRP, ("PostCancel: DoDisconnect done\n"));
-VOID DDKAPI DispCancelRequest(
+ DispDataRequestComplete(DisType->Irp, STATUS_CANCELLED, 0);
+
+ DispCancelComplete(DisType->FileObject);
+}
+
+VOID NTAPI DispCancelRequest(
PDEVICE_OBJECT Device,
PIRP Irp)
/*
PTRANSPORT_CONTEXT TranContext;
PFILE_OBJECT FileObject;
UCHAR MinorFunction;
+ DISCONNECT_TYPE DisType;
+ PVOID WorkItem;
/*NTSTATUS Status = STATUS_SUCCESS;*/
TI_DbgPrint(DEBUG_IRP, ("Called.\n"));
TI_DbgPrint(DEBUG_IRP, ("IRP at (0x%X) MinorFunction (0x%X) IrpSp (0x%X).\n", Irp, MinorFunction, IrpSp));
+ Irp->IoStatus.Status = STATUS_PENDING;
+
#ifdef DBG
if (!Irp->Cancel)
TI_DbgPrint(MIN_TRACE, ("Irp->Cancel is FALSE, should be TRUE.\n"));
/* Try canceling the request */
switch(MinorFunction) {
case TDI_SEND:
- TCPDisconnect
- ( TranContext->Handle.ConnectionContext,
- TDI_DISCONNECT_RELEASE,
- NULL,
- NULL,
- DispDataRequestComplete,
- Irp );
- break;
-
case TDI_RECEIVE:
- TCPDisconnect
- ( TranContext->Handle.ConnectionContext,
- TDI_DISCONNECT_ABORT | TDI_DISCONNECT_RELEASE,
- NULL,
- NULL,
- DispDataRequestComplete,
- Irp );
+ DisType.Type = TDI_DISCONNECT_RELEASE |
+ ((MinorFunction == TDI_RECEIVE) ? TDI_DISCONNECT_ABORT : 0);
+ DisType.Context = TranContext->Handle.ConnectionContext;
+ DisType.Irp = Irp;
+ DisType.FileObject = FileObject;
+
+ TCPRemoveIRP( TranContext->Handle.ConnectionContext, Irp );
+
+ if( !ChewCreate( &WorkItem, sizeof(DISCONNECT_TYPE),
+ DispDoDisconnect, &DisType ) )
+ ASSERT(0);
break;
case TDI_SEND_DATAGRAM:
+ Irp->IoStatus.Status = STATUS_CANCELLED;
if (FileObject->FsContext2 != (PVOID)TDI_TRANSPORT_ADDRESS_FILE) {
TI_DbgPrint(MIN_TRACE, ("TDI_SEND_DATAGRAM, but no address file.\n"));
break;
break;
case TDI_RECEIVE_DATAGRAM:
+ Irp->IoStatus.Status = STATUS_CANCELLED;
if (FileObject->FsContext2 != (PVOID)TDI_TRANSPORT_ADDRESS_FILE) {
TI_DbgPrint(MIN_TRACE, ("TDI_RECEIVE_DATAGRAM, but no address file.\n"));
break;
break;
}
- IoReleaseCancelSpinLock(Irp->CancelIrql);
+ if( Irp->IoStatus.Status == STATUS_PENDING )
+ IoMarkIrpPending(Irp);
- DispCancelComplete(FileObject);
+ IoReleaseCancelSpinLock(Irp->CancelIrql);
TI_DbgPrint(MAX_TRACE, ("Leaving.\n"));
}
-VOID DDKAPI DispCancelListenRequest(
+VOID NTAPI DispCancelListenRequest(
PDEVICE_OBJECT Device,
PIRP Irp)
/*
*/
{
PIO_STACK_LOCATION IrpSp;
- PTDI_REQUEST_KERNEL_RECEIVE ReceiveInfo;
+ PTDI_REQUEST_KERNEL_SEND SendInfo;
PTRANSPORT_CONTEXT TranContext;
NTSTATUS Status;
- ULONG BytesReceived;
+ ULONG BytesSent;
TI_DbgPrint(DEBUG_IRP, ("Called.\n"));
IrpSp = IoGetCurrentIrpStackLocation(Irp);
- ReceiveInfo = (PTDI_REQUEST_KERNEL_RECEIVE)&(IrpSp->Parameters);
+ SendInfo = (PTDI_REQUEST_KERNEL_SEND)&(IrpSp->Parameters);
TranContext = IrpSp->FileObject->FsContext;
if (TranContext == NULL)
Status = TCPSendData(
TranContext->Handle.ConnectionContext,
Data,
- ReceiveInfo->ReceiveLength,
- &BytesReceived,
- ReceiveInfo->ReceiveFlags);
+ SendInfo->SendLength,
+ &BytesSent,
+ SendInfo->SendFlags,
+ DispDataRequestComplete,
+ Irp);
if (Status != STATUS_PENDING)
{
- DispDataRequestComplete(Irp, Status, BytesReceived);
+ DispDataRequestComplete(Irp, Status, BytesSent);
} else
IoMarkIrpPending( Irp );
}