diff --git a/src/sys/device.c b/src/sys/device.c index b30139d1..0c056334 100644 --- a/src/sys/device.c +++ b/src/sys/device.c @@ -442,9 +442,11 @@ static VOID FspFsvolDeviceExpirationRoutine(PVOID Context) PDEVICE_OBJECT DeviceObject = Context; FSP_FSVOL_DEVICE_EXTENSION *FsvolDeviceExtension = FspFsvolDeviceExtension(DeviceObject); + UINT64 InterruptTime; KIRQL Irql; - FspIoqRemoveExpired(FsvolDeviceExtension->Ioq); + InterruptTime = KeQueryInterruptTime(); + FspIoqRemoveExpired(FsvolDeviceExtension->Ioq, InterruptTime); KeAcquireSpinLock(&FsvolDeviceExtension->ExpirationLock, &Irql); FsvolDeviceExtension->ExpirationInProgress = FALSE; diff --git a/src/sys/driver.h b/src/sys/driver.h index 1b8baaa1..5d9463b7 100644 --- a/src/sys/driver.h +++ b/src/sys/driver.h @@ -375,7 +375,7 @@ NTSTATUS FspIoqCreate( VOID FspIoqDelete(FSP_IOQ *Ioq); VOID FspIoqStop(FSP_IOQ *Ioq); BOOLEAN FspIoqStopped(FSP_IOQ *Ioq); -VOID FspIoqRemoveExpired(FSP_IOQ *Ioq); +VOID FspIoqRemoveExpired(FSP_IOQ *Ioq, UINT64 InterruptTime); BOOLEAN FspIoqPostIrpEx(FSP_IOQ *Ioq, PIRP Irp, BOOLEAN BestEffort, NTSTATUS *PResult); PIRP FspIoqNextPendingIrp(FSP_IOQ *Ioq, PIRP BoundaryIrp, PLARGE_INTEGER Timeout, PIRP CancellableIrp); diff --git a/src/sys/ioq.c b/src/sys/ioq.c index f084287a..109b076d 100644 --- a/src/sys/ioq.c +++ b/src/sys/ioq.c @@ -509,11 +509,11 @@ BOOLEAN FspIoqStopped(FSP_IOQ *Ioq) return Result; } -VOID FspIoqRemoveExpired(FSP_IOQ *Ioq) +VOID FspIoqRemoveExpired(FSP_IOQ *Ioq, UINT64 InterruptTime) { FSP_IOQ_PEEK_CONTEXT PeekContext; PeekContext.IrpHint = 0; - PeekContext.ExpirationTime = QueryInterruptTimeInSec(); + PeekContext.ExpirationTime = ConvertInterruptTimeToSec(InterruptTime); PIRP Irp; while (0 != (Irp = IoCsqRemoveNextIrp(&Ioq->PendingIoCsq, &PeekContext))) Ioq->CompleteCanceledIrp(Irp);