- Don't try to mark IRPs as pending when they might already be completed. For simplicity, always pend them instead.
CORE-11962

svn path=/trunk/; revision=72673
This commit is contained in:
Thomas Faber 2016-09-14 11:46:19 +00:00
parent 7d478eb667
commit aac3bbc746

View file

@ -400,6 +400,8 @@ NTSTATUS DispTdiConnect(
IrpSp = IoGetCurrentIrpStackLocation(Irp); IrpSp = IoGetCurrentIrpStackLocation(Irp);
IoMarkIrpPending(Irp);
/* Get associated connection endpoint file object. Quit if none exists */ /* Get associated connection endpoint file object. Quit if none exists */
TranContext = IrpSp->FileObject->FsContext; TranContext = IrpSp->FileObject->FsContext;
@ -434,12 +436,11 @@ NTSTATUS DispTdiConnect(
done: done:
if (Status != STATUS_PENDING) { if (Status != STATUS_PENDING) {
DispDataRequestComplete(Irp, Status, 0); DispDataRequestComplete(Irp, Status, 0);
} else }
IoMarkIrpPending(Irp);
TI_DbgPrint(MAX_TRACE, ("TCP Connect returned %08x\n", Status)); TI_DbgPrint(MAX_TRACE, ("TCP Connect returned %08x\n", Status));
return Status; return STATUS_PENDING;
} }
@ -502,6 +503,8 @@ NTSTATUS DispTdiDisconnect(
IrpSp = IoGetCurrentIrpStackLocation(Irp); IrpSp = IoGetCurrentIrpStackLocation(Irp);
DisReq = (PTDI_REQUEST_KERNEL_DISCONNECT)&IrpSp->Parameters; DisReq = (PTDI_REQUEST_KERNEL_DISCONNECT)&IrpSp->Parameters;
IoMarkIrpPending(Irp);
/* Get associated connection endpoint file object. Quit if none exists */ /* Get associated connection endpoint file object. Quit if none exists */
TranContext = IrpSp->FileObject->FsContext; TranContext = IrpSp->FileObject->FsContext;
@ -537,12 +540,11 @@ NTSTATUS DispTdiDisconnect(
done: done:
if (Status != STATUS_PENDING) { if (Status != STATUS_PENDING) {
DispDataRequestComplete(Irp, Status, 0); DispDataRequestComplete(Irp, Status, 0);
} else }
IoMarkIrpPending(Irp);
TI_DbgPrint(MAX_TRACE, ("TCP Disconnect returned %08x\n", Status)); TI_DbgPrint(MAX_TRACE, ("TCP Disconnect returned %08x\n", Status));
return Status; return STATUS_PENDING;
} }
@ -567,6 +569,8 @@ NTSTATUS DispTdiListen(
IrpSp = IoGetCurrentIrpStackLocation(Irp); IrpSp = IoGetCurrentIrpStackLocation(Irp);
IoMarkIrpPending(Irp);
/* Get associated connection endpoint file object. Quit if none exists */ /* Get associated connection endpoint file object. Quit if none exists */
TranContext = IrpSp->FileObject->FsContext; TranContext = IrpSp->FileObject->FsContext;
@ -649,12 +653,11 @@ NTSTATUS DispTdiListen(
done: done:
if (Status != STATUS_PENDING) { if (Status != STATUS_PENDING) {
DispDataRequestComplete(Irp, Status, 0); DispDataRequestComplete(Irp, Status, 0);
} else }
IoMarkIrpPending(Irp);
TI_DbgPrint(MID_TRACE,("Leaving %x\n", Status)); TI_DbgPrint(MID_TRACE,("Leaving %x\n", Status));
return Status; return STATUS_PENDING;
} }
@ -807,6 +810,8 @@ NTSTATUS DispTdiReceive(
IrpSp = IoGetCurrentIrpStackLocation(Irp); IrpSp = IoGetCurrentIrpStackLocation(Irp);
ReceiveInfo = (PTDI_REQUEST_KERNEL_RECEIVE)&(IrpSp->Parameters); ReceiveInfo = (PTDI_REQUEST_KERNEL_RECEIVE)&(IrpSp->Parameters);
IoMarkIrpPending(Irp);
TranContext = IrpSp->FileObject->FsContext; TranContext = IrpSp->FileObject->FsContext;
if (TranContext == NULL) if (TranContext == NULL)
{ {
@ -844,12 +849,11 @@ NTSTATUS DispTdiReceive(
done: done:
if (Status != STATUS_PENDING) { if (Status != STATUS_PENDING) {
DispDataRequestComplete(Irp, Status, BytesReceived); DispDataRequestComplete(Irp, Status, BytesReceived);
} else }
IoMarkIrpPending(Irp);
TI_DbgPrint(DEBUG_IRP, ("Leaving. Status is (0x%X)\n", Status)); TI_DbgPrint(DEBUG_IRP, ("Leaving. Status is (0x%X)\n", Status));
return Status; return STATUS_PENDING;
} }
@ -875,6 +879,8 @@ NTSTATUS DispTdiReceiveDatagram(
IrpSp = IoGetCurrentIrpStackLocation(Irp); IrpSp = IoGetCurrentIrpStackLocation(Irp);
DgramInfo = (PTDI_REQUEST_KERNEL_RECEIVEDG)&(IrpSp->Parameters); DgramInfo = (PTDI_REQUEST_KERNEL_RECEIVEDG)&(IrpSp->Parameters);
IoMarkIrpPending(Irp);
TranContext = IrpSp->FileObject->FsContext; TranContext = IrpSp->FileObject->FsContext;
if (TranContext == NULL) if (TranContext == NULL)
{ {
@ -918,12 +924,11 @@ NTSTATUS DispTdiReceiveDatagram(
done: done:
if (Status != STATUS_PENDING) { if (Status != STATUS_PENDING) {
DispDataRequestComplete(Irp, Status, BytesReceived); DispDataRequestComplete(Irp, Status, BytesReceived);
} else }
IoMarkIrpPending(Irp);
TI_DbgPrint(DEBUG_IRP, ("Leaving. Status is (0x%X)\n", Status)); TI_DbgPrint(DEBUG_IRP, ("Leaving. Status is (0x%X)\n", Status));
return Status; return STATUS_PENDING;
} }
@ -948,6 +953,8 @@ NTSTATUS DispTdiSend(
IrpSp = IoGetCurrentIrpStackLocation(Irp); IrpSp = IoGetCurrentIrpStackLocation(Irp);
SendInfo = (PTDI_REQUEST_KERNEL_SEND)&(IrpSp->Parameters); SendInfo = (PTDI_REQUEST_KERNEL_SEND)&(IrpSp->Parameters);
IoMarkIrpPending(Irp);
TranContext = IrpSp->FileObject->FsContext; TranContext = IrpSp->FileObject->FsContext;
if (TranContext == NULL) if (TranContext == NULL)
{ {
@ -990,12 +997,11 @@ NTSTATUS DispTdiSend(
done: done:
if (Status != STATUS_PENDING) { if (Status != STATUS_PENDING) {
DispDataRequestComplete(Irp, Status, BytesSent); DispDataRequestComplete(Irp, Status, BytesSent);
} else }
IoMarkIrpPending(Irp);
TI_DbgPrint(DEBUG_IRP, ("Leaving. Status is (0x%X)\n", Status)); TI_DbgPrint(DEBUG_IRP, ("Leaving. Status is (0x%X)\n", Status));
return Status; return STATUS_PENDING;
} }
@ -1020,6 +1026,8 @@ NTSTATUS DispTdiSendDatagram(
IrpSp = IoGetCurrentIrpStackLocation(Irp); IrpSp = IoGetCurrentIrpStackLocation(Irp);
DgramInfo = (PTDI_REQUEST_KERNEL_SENDDG)&(IrpSp->Parameters); DgramInfo = (PTDI_REQUEST_KERNEL_SENDDG)&(IrpSp->Parameters);
IoMarkIrpPending(Irp);
TranContext = IrpSp->FileObject->FsContext; TranContext = IrpSp->FileObject->FsContext;
if (TranContext == NULL) if (TranContext == NULL)
{ {
@ -1074,12 +1082,11 @@ NTSTATUS DispTdiSendDatagram(
done: done:
if (Status != STATUS_PENDING) { if (Status != STATUS_PENDING) {
DispDataRequestComplete(Irp, Status, Irp->IoStatus.Information); DispDataRequestComplete(Irp, Status, Irp->IoStatus.Information);
} else }
IoMarkIrpPending(Irp);
TI_DbgPrint(DEBUG_IRP, ("Leaving.\n")); TI_DbgPrint(DEBUG_IRP, ("Leaving.\n"));
return Status; return STATUS_PENDING;
} }