---
src/xenfilt/fdo.c | 284 ++++--------------------------------------
src/xenfilt/pdo.c | 307 ++++------------------------------------------
2 files changed, 46 insertions(+), 545 deletions(-)
diff --git a/src/xenfilt/fdo.c b/src/xenfilt/fdo.c
index 6a45b0f..63fa7b3 100644
--- a/src/xenfilt/fdo.c
+++ b/src/xenfilt/fdo.c
@@ -581,27 +581,6 @@ fail1:
return status;
}
-__drv_functionClass(IO_COMPLETION_ROUTINE)
-__drv_sameIRQL
-static NTSTATUS
-FdoQueryStopDeviceCompletion(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PVOID Context
- )
-{
- PXENFILT_FDO Fdo = Context;
-
- UNREFERENCED_PARAMETER(DeviceObject);
-
- if (Irp->PendingReturned)
- IoMarkIrpPending(Irp);
-
- IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
-
- return STATUS_SUCCESS;
-}
-
static NTSTATUS
FdoQueryStopDevice(
IN PXENFILT_FDO Fdo,
@@ -617,15 +596,10 @@ FdoQueryStopDevice(
__FdoSetDevicePnpState(Fdo, StopPending);
Irp->IoStatus.Status = STATUS_SUCCESS;
- IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp,
- FdoQueryStopDeviceCompletion,
- Fdo,
- TRUE,
- TRUE,
- TRUE);
+ IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
+ IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
return status;
@@ -636,27 +610,6 @@ fail1:
return status;
}
-__drv_functionClass(IO_COMPLETION_ROUTINE)
-__drv_sameIRQL
-static NTSTATUS
-FdoCancelStopDeviceCompletion(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PVOID Context
- )
-{
- PXENFILT_FDO Fdo = Context;
-
- UNREFERENCED_PARAMETER(DeviceObject);
-
- if (Irp->PendingReturned)
- IoMarkIrpPending(Irp);
-
- IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
-
- return STATUS_SUCCESS;
-}
-
static NTSTATUS
FdoCancelStopDevice(
IN PXENFILT_FDO Fdo,
@@ -673,15 +626,10 @@ FdoCancelStopDevice(
__FdoRestoreDevicePnpState(Fdo, StopPending);
- IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp,
- FdoCancelStopDeviceCompletion,
- Fdo,
- TRUE,
- TRUE,
- TRUE);
+ IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
+ IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
return status;
@@ -692,27 +640,6 @@ fail1:
return status;
}
-__drv_functionClass(IO_COMPLETION_ROUTINE)
-__drv_sameIRQL
-static NTSTATUS
-FdoStopDeviceCompletion(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PVOID Context
- )
-{
- PXENFILT_FDO Fdo = Context;
-
- UNREFERENCED_PARAMETER(DeviceObject);
-
- if (Irp->PendingReturned)
- IoMarkIrpPending(Irp);
-
- IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
-
- return STATUS_SUCCESS;
-}
-
static NTSTATUS
FdoStopDevice(
IN PXENFILT_FDO Fdo,
@@ -739,15 +666,10 @@ FdoStopDevice(
__FdoSetDevicePnpState(Fdo, Stopped);
Irp->IoStatus.Status = STATUS_SUCCESS;
- IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp,
- FdoStopDeviceCompletion,
- Fdo,
- TRUE,
- TRUE,
- TRUE);
+ IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
+ IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
return status;
@@ -758,27 +680,6 @@ fail1:
return status;
}
-__drv_functionClass(IO_COMPLETION_ROUTINE)
-__drv_sameIRQL
-static NTSTATUS
-FdoQueryRemoveDeviceCompletion(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PVOID Context
- )
-{
- PXENFILT_FDO Fdo = Context;
-
- UNREFERENCED_PARAMETER(DeviceObject);
-
- if (Irp->PendingReturned)
- IoMarkIrpPending(Irp);
-
- IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
-
- return STATUS_SUCCESS;
-}
-
static NTSTATUS
FdoQueryRemoveDevice(
IN PXENFILT_FDO Fdo,
@@ -794,15 +695,10 @@ FdoQueryRemoveDevice(
__FdoSetDevicePnpState(Fdo, RemovePending);
Irp->IoStatus.Status = STATUS_SUCCESS;
- IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp,
- FdoQueryRemoveDeviceCompletion,
- Fdo,
- TRUE,
- TRUE,
- TRUE);
+ IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
+ IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
return status;
@@ -813,27 +709,6 @@ fail1:
return status;
}
-__drv_functionClass(IO_COMPLETION_ROUTINE)
-__drv_sameIRQL
-static NTSTATUS
-FdoCancelRemoveDeviceCompletion(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PVOID Context
- )
-{
- PXENFILT_FDO Fdo = Context;
-
- UNREFERENCED_PARAMETER(DeviceObject);
-
- if (Irp->PendingReturned)
- IoMarkIrpPending(Irp);
-
- IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
-
- return STATUS_SUCCESS;
-}
-
static NTSTATUS
FdoCancelRemoveDevice(
IN PXENFILT_FDO Fdo,
@@ -849,15 +724,10 @@ FdoCancelRemoveDevice(
__FdoRestoreDevicePnpState(Fdo, RemovePending);
Irp->IoStatus.Status = STATUS_SUCCESS;
- IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp,
- FdoCancelRemoveDeviceCompletion,
- Fdo,
- TRUE,
- TRUE,
- TRUE);
+ IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
+ IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
return status;
@@ -868,27 +738,6 @@ fail1:
return status;
}
-__drv_functionClass(IO_COMPLETION_ROUTINE)
-__drv_sameIRQL
-static NTSTATUS
-FdoSurpriseRemovalCompletion(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PVOID Context
- )
-{
- PXENFILT_FDO Fdo = Context;
-
- UNREFERENCED_PARAMETER(DeviceObject);
-
- if (Irp->PendingReturned)
- IoMarkIrpPending(Irp);
-
- IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
-
- return STATUS_SUCCESS;
-}
-
static NTSTATUS
FdoSurpriseRemoval(
IN PXENFILT_FDO Fdo,
@@ -904,15 +753,10 @@ FdoSurpriseRemoval(
__FdoSetDevicePnpState(Fdo, SurpriseRemovePending);
Irp->IoStatus.Status = STATUS_SUCCESS;
- IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp,
- FdoSurpriseRemovalCompletion,
- Fdo,
- TRUE,
- TRUE,
- TRUE);
+ IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
+ IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
return status;
@@ -974,10 +818,9 @@ FdoRemoveDevice(
done:
__FdoSetDevicePnpState(Fdo, Deleted);
- IoReleaseRemoveLockAndWait(&Fdo->Dx->RemoveLock, Irp);
-
status = FdoForwardIrpSynchronously(Fdo, Irp);
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
+ IoReleaseRemoveLockAndWait(&Fdo->Dx->RemoveLock, Irp);
__FdoAcquireMutex(Fdo);
ASSERT3U(Fdo->References, !=, 0);
@@ -990,6 +833,8 @@ done:
DriverReleaseMutex();
}
+ IoCompleteRequest(Irp, IO_NO_INCREMENT);
+
return status;
fail1:
@@ -1159,26 +1004,6 @@ fail1:
return status;
}
-__drv_functionClass(IO_COMPLETION_ROUTINE)
-__drv_sameIRQL
-static NTSTATUS
-FdoDispatchPnpCompletion(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PVOID Context
- )
-{
- PXENFILT_FDO Fdo = Context;
-
- UNREFERENCED_PARAMETER(DeviceObject);
-
- if (Irp->PendingReturned)
- IoMarkIrpPending(Irp);
-
- IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
- return STATUS_SUCCESS;
-}
-
static NTSTATUS
FdoDispatchPnp(
IN PXENFILT_FDO Fdo,
@@ -1234,15 +1059,10 @@ FdoDispatchPnp(
if (!NT_SUCCESS(status))
goto fail1;
- IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp,
- FdoDispatchPnpCompletion,
- Fdo,
- TRUE,
- TRUE,
- TRUE);
+ IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
+ IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
break;
}
@@ -1754,26 +1574,6 @@ FdoSystemPower(
return STATUS_SUCCESS;
}
-__drv_functionClass(IO_COMPLETION_ROUTINE)
-__drv_sameIRQL
-static NTSTATUS
-FdoDispatchPowerCompletion(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PVOID Context
- )
-{
- PXENFILT_FDO Fdo = Context;
-
- UNREFERENCED_PARAMETER(DeviceObject);
-
- if (Irp->PendingReturned)
- IoMarkIrpPending(Irp);
-
- IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
- return STATUS_SUCCESS;
-}
-
static NTSTATUS
FdoDispatchPower(
IN PXENFILT_FDO Fdo,
@@ -1794,15 +1594,10 @@ FdoDispatchPower(
if (MinorFunction != IRP_MN_QUERY_POWER &&
MinorFunction != IRP_MN_SET_POWER) {
- IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp,
- FdoDispatchPowerCompletion,
- Fdo,
- TRUE,
- TRUE,
- TRUE);
+ IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
+ IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
goto done;
}
@@ -1840,15 +1635,10 @@ FdoDispatchPower(
break;
default:
- IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp,
- FdoDispatchPowerCompletion,
- Fdo,
- TRUE,
- TRUE,
- TRUE);
+ IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
+ IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
break;
}
@@ -1870,27 +1660,6 @@ fail1:
return status;
}
-__drv_functionClass(IO_COMPLETION_ROUTINE)
-__drv_sameIRQL
-static NTSTATUS
-FdoDispatchDefaultCompletion(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PVOID Context
- )
-{
- PXENFILT_FDO Fdo = Context;
-
- UNREFERENCED_PARAMETER(DeviceObject);
-
- if (Irp->PendingReturned)
- IoMarkIrpPending(Irp);
-
- IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
-
- return STATUS_SUCCESS;
-}
-
static NTSTATUS
FdoDispatchDefault(
IN PXENFILT_FDO Fdo,
@@ -1903,15 +1672,10 @@ FdoDispatchDefault(
if (!NT_SUCCESS(status))
goto fail1;
- IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp,
- FdoDispatchDefaultCompletion,
- Fdo,
- TRUE,
- TRUE,
- TRUE);
+ IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(Fdo->LowerDeviceObject, Irp);
+ IoReleaseRemoveLock(&Fdo->Dx->RemoveLock, Irp);
return status;
diff --git a/src/xenfilt/pdo.c b/src/xenfilt/pdo.c
index b3569a3..741c2f3 100644
--- a/src/xenfilt/pdo.c
+++ b/src/xenfilt/pdo.c
@@ -523,27 +523,6 @@ fail1:
return status;
}
-__drv_functionClass(IO_COMPLETION_ROUTINE)
-__drv_sameIRQL
-static NTSTATUS
-PdoQueryStopDeviceCompletion(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PVOID Context
- )
-{
- PXENFILT_PDO Pdo = Context;
-
- UNREFERENCED_PARAMETER(DeviceObject);
-
- if (Irp->PendingReturned)
- IoMarkIrpPending(Irp);
-
- IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
-
- return STATUS_SUCCESS;
-}
-
static NTSTATUS
PdoQueryStopDevice(
IN PXENFILT_PDO Pdo,
@@ -559,15 +538,10 @@ PdoQueryStopDevice(
__PdoSetDevicePnpState(Pdo, StopPending);
Irp->IoStatus.Status = STATUS_SUCCESS;
- IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp,
- PdoQueryStopDeviceCompletion,
- Pdo,
- TRUE,
- TRUE,
- TRUE);
+ IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(Pdo->LowerDeviceObject, Irp);
+ IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
return status;
@@ -578,27 +552,6 @@ fail1:
return status;
}
-__drv_functionClass(IO_COMPLETION_ROUTINE)
-__drv_sameIRQL
-static NTSTATUS
-PdoCancelStopDeviceCompletion(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PVOID Context
- )
-{
- PXENFILT_PDO Pdo = Context;
-
- UNREFERENCED_PARAMETER(DeviceObject);
-
- if (Irp->PendingReturned)
- IoMarkIrpPending(Irp);
-
- IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
-
- return STATUS_SUCCESS;
-}
-
static NTSTATUS
PdoCancelStopDevice(
IN PXENFILT_PDO Pdo,
@@ -615,15 +568,10 @@ PdoCancelStopDevice(
__PdoRestoreDevicePnpState(Pdo, StopPending);
- IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp,
- PdoCancelStopDeviceCompletion,
- Pdo,
- TRUE,
- TRUE,
- TRUE);
+ IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(Pdo->LowerDeviceObject, Irp);
+ IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
return status;
@@ -634,27 +582,6 @@ fail1:
return status;
}
-__drv_functionClass(IO_COMPLETION_ROUTINE)
-__drv_sameIRQL
-static NTSTATUS
-PdoStopDeviceCompletion(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PVOID Context
- )
-{
- PXENFILT_PDO Pdo = Context;
-
- UNREFERENCED_PARAMETER(DeviceObject);
-
- if (Irp->PendingReturned)
- IoMarkIrpPending(Irp);
-
- IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
-
- return STATUS_SUCCESS;
-}
-
static NTSTATUS
PdoStopDevice(
IN PXENFILT_PDO Pdo,
@@ -682,15 +609,10 @@ done:
__PdoSetDevicePnpState(Pdo, Stopped);
Irp->IoStatus.Status = STATUS_SUCCESS;
- IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp,
- PdoStopDeviceCompletion,
- Pdo,
- TRUE,
- TRUE,
- TRUE);
+ IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(Pdo->LowerDeviceObject, Irp);
+ IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
return status;
@@ -701,27 +623,6 @@ fail1:
return status;
}
-__drv_functionClass(IO_COMPLETION_ROUTINE)
-__drv_sameIRQL
-static NTSTATUS
-PdoQueryRemoveDeviceCompletion(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PVOID Context
- )
-{
- PXENFILT_PDO Pdo = Context;
-
- UNREFERENCED_PARAMETER(DeviceObject);
-
- if (Irp->PendingReturned)
- IoMarkIrpPending(Irp);
-
- IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
-
- return STATUS_SUCCESS;
-}
-
static NTSTATUS
PdoQueryRemoveDevice(
IN PXENFILT_PDO Pdo,
@@ -737,15 +638,10 @@ PdoQueryRemoveDevice(
__PdoSetDevicePnpState(Pdo, RemovePending);
Irp->IoStatus.Status = STATUS_SUCCESS;
- IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp,
- PdoQueryRemoveDeviceCompletion,
- Pdo,
- TRUE,
- TRUE,
- TRUE);
+ IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(Pdo->LowerDeviceObject, Irp);
+ IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
return status;
@@ -756,27 +652,6 @@ fail1:
return status;
}
-__drv_functionClass(IO_COMPLETION_ROUTINE)
-__drv_sameIRQL
-static NTSTATUS
-PdoCancelRemoveDeviceCompletion(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PVOID Context
- )
-{
- PXENFILT_PDO Pdo = Context;
-
- UNREFERENCED_PARAMETER(DeviceObject);
-
- if (Irp->PendingReturned)
- IoMarkIrpPending(Irp);
-
- IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
-
- return STATUS_SUCCESS;
-}
-
static NTSTATUS
PdoCancelRemoveDevice(
IN PXENFILT_PDO Pdo,
@@ -792,15 +667,10 @@ PdoCancelRemoveDevice(
__PdoRestoreDevicePnpState(Pdo, RemovePending);
Irp->IoStatus.Status = STATUS_SUCCESS;
- IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp,
- PdoCancelRemoveDeviceCompletion,
- Pdo,
- TRUE,
- TRUE,
- TRUE);
+ IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(Pdo->LowerDeviceObject, Irp);
+ IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
return status;
@@ -811,27 +681,6 @@ fail1:
return status;
}
-__drv_functionClass(IO_COMPLETION_ROUTINE)
-__drv_sameIRQL
-static NTSTATUS
-PdoSurpriseRemovalCompletion(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PVOID Context
- )
-{
- PXENFILT_PDO Pdo = Context;
-
- UNREFERENCED_PARAMETER(DeviceObject);
-
- if (Irp->PendingReturned)
- IoMarkIrpPending(Irp);
-
- IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
-
- return STATUS_SUCCESS;
-}
-
static NTSTATUS
PdoSurpriseRemoval(
IN PXENFILT_PDO Pdo,
@@ -847,15 +696,10 @@ PdoSurpriseRemoval(
__PdoSetDevicePnpState(Pdo, SurpriseRemovePending);
Irp->IoStatus.Status = STATUS_SUCCESS;
- IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp,
- PdoSurpriseRemovalCompletion,
- Pdo,
- TRUE,
- TRUE,
- TRUE);
+ IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(Pdo->LowerDeviceObject, Irp);
+ IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
return status;
@@ -930,27 +774,6 @@ fail1:
return status;
}
-__drv_functionClass(IO_COMPLETION_ROUTINE)
-__drv_sameIRQL
-static NTSTATUS
-PdoQueryInterfaceCompletion(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PVOID Context
- )
-{
- PXENFILT_PDO Pdo = Context;
-
- UNREFERENCED_PARAMETER(DeviceObject);
-
- if (Irp->PendingReturned)
- IoMarkIrpPending(Irp);
-
- IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
-
- return STATUS_SUCCESS;
-}
-
#define DEFINE_PDO_QUERY_INTERFACE(_Interface) \
static NTSTATUS \
PdoQuery ## _Interface ## Interface( \
@@ -1041,15 +864,10 @@ PdoQueryInterface(
}
done:
- IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp,
- PdoQueryInterfaceCompletion,
- Pdo,
- TRUE,
- TRUE,
- TRUE);
+ IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(Pdo->LowerDeviceObject, Irp);
+ IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
return status;
@@ -1283,26 +1101,6 @@ PdoEject(
return status;
}
-__drv_functionClass(IO_COMPLETION_ROUTINE)
-__drv_sameIRQL
-static NTSTATUS
-PdoDispatchPnpCompletion(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PVOID Context
- )
-{
- PXENFILT_PDO Pdo = Context;
-
- UNREFERENCED_PARAMETER(DeviceObject);
-
- if (Irp->PendingReturned)
- IoMarkIrpPending(Irp);
-
- IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
- return STATUS_SUCCESS;
-}
-
static NTSTATUS
PdoDispatchPnp(
IN PXENFILT_PDO Pdo,
@@ -1370,15 +1168,10 @@ PdoDispatchPnp(
if (!NT_SUCCESS(status))
goto fail1;
- IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp,
- PdoDispatchPnpCompletion,
- Pdo,
- TRUE,
- TRUE,
- TRUE);
+ IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(Pdo->LowerDeviceObject, Irp);
+ IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
break;
}
@@ -1894,26 +1687,6 @@ PdoSystemPower(
return STATUS_SUCCESS;
}
-__drv_functionClass(IO_COMPLETION_ROUTINE)
-__drv_sameIRQL
-static NTSTATUS
-PdoDispatchPowerCompletion(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PVOID Context
- )
-{
- PXENFILT_PDO Pdo = Context;
-
- UNREFERENCED_PARAMETER(DeviceObject);
-
- if (Irp->PendingReturned)
- IoMarkIrpPending(Irp);
-
- IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
- return STATUS_SUCCESS;
-}
-
static NTSTATUS
PdoDispatchPower(
IN PXENFILT_PDO Pdo,
@@ -1934,15 +1707,10 @@ PdoDispatchPower(
if (MinorFunction != IRP_MN_QUERY_POWER &&
MinorFunction != IRP_MN_SET_POWER) {
- IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp,
- PdoDispatchPowerCompletion,
- Pdo,
- TRUE,
- TRUE,
- TRUE);
+ IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(Pdo->LowerDeviceObject, Irp);
+ IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
goto done;
}
@@ -1980,15 +1748,10 @@ PdoDispatchPower(
break;
default:
- IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp,
- PdoDispatchPowerCompletion,
- Pdo,
- TRUE,
- TRUE,
- TRUE);
+ IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(Pdo->LowerDeviceObject, Irp);
+ IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
break;
}
@@ -2010,27 +1773,6 @@ fail1:
return status;
}
-__drv_functionClass(IO_COMPLETION_ROUTINE)
-__drv_sameIRQL
-static NTSTATUS
-PdoDispatchDefaultCompletion(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp,
- IN PVOID Context
- )
-{
- PXENFILT_PDO Pdo = Context;
-
- UNREFERENCED_PARAMETER(DeviceObject);
-
- if (Irp->PendingReturned)
- IoMarkIrpPending(Irp);
-
- IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
-
- return STATUS_SUCCESS;
-}
-
static NTSTATUS
PdoDispatchDefault(
IN PXENFILT_PDO Pdo,
@@ -2043,15 +1785,10 @@ PdoDispatchDefault(
if (!NT_SUCCESS(status))
goto fail1;
- IoCopyCurrentIrpStackLocationToNext(Irp);
- IoSetCompletionRoutine(Irp,
- PdoDispatchDefaultCompletion,
- Pdo,
- TRUE,
- TRUE,
- TRUE);
+ IoSkipCurrentIrpStackLocation(Irp);
status = IoCallDriver(Pdo->LowerDeviceObject, Irp);
+ IoReleaseRemoveLock(&Pdo->Dx->RemoveLock, Irp);
return status;