diff --git a/reactos/drivers/storage/scsiport/scsiport.c b/reactos/drivers/storage/scsiport/scsiport.c index e7296e36c06..2f63cb5ee16 100644 --- a/reactos/drivers/storage/scsiport/scsiport.c +++ b/reactos/drivers/storage/scsiport/scsiport.c @@ -4405,7 +4405,8 @@ SpiCompletionRoutine(PDEVICE_OBJECT DeviceObject, if (Irp->MdlAddress != NULL) { - MmUnlockPages(Irp->MdlAddress); + /* We don't need to unlock this MDL because the request could + * only have come from dispatch level */ IoFreeMdl(Irp->MdlAddress); Irp->MdlAddress = NULL; } diff --git a/reactos/ntoskrnl/io/iomgr/irp.c b/reactos/ntoskrnl/io/iomgr/irp.c index fdb48064786..f4f7ea4a3de 100644 --- a/reactos/ntoskrnl/io/iomgr/irp.c +++ b/reactos/ntoskrnl/io/iomgr/irp.c @@ -682,23 +682,30 @@ IoBuildAsynchronousFsdRequest(IN ULONG MajorFunction, return NULL; } - /* Probe and Lock */ - _SEH_TRY - { - /* Do the probe */ - MmProbeAndLockPages(Irp->MdlAddress, - KernelMode, - MajorFunction == IRP_MJ_READ ? - IoWriteAccess : IoReadAccess); - } - _SEH_HANDLE - { - /* Free the IRP and its MDL */ - IoFreeMdl(Irp->MdlAddress); - IoFreeIrp(Irp); - Irp = NULL; - } - _SEH_END; + if (KeGetCurrentIrql() >= DISPATCH_LEVEL) + { + MmBuildMdlForNonPagedPool(Irp->MdlAddress); + } + else + { + /* Probe and Lock */ + _SEH_TRY + { + /* Do the probe */ + MmProbeAndLockPages(Irp->MdlAddress, + KernelMode, + MajorFunction == IRP_MJ_READ ? + IoWriteAccess : IoReadAccess); + } + _SEH_HANDLE + { + /* Free the IRP and its MDL */ + IoFreeMdl(Irp->MdlAddress); + IoFreeIrp(Irp); + Irp = NULL; + } + _SEH_END; + } /* This is how we know if we failed during the probe */ if (!Irp) return NULL; @@ -1344,7 +1351,7 @@ IofCompleteRequest(IN PIRP Irp, Mdl = Irp->MdlAddress; while (Mdl) { - MmUnlockPages(Mdl); + MmUnlockPages(Mdl); Mdl = Mdl->Next; }