mirror of
https://github.com/ApfelTeeSaft/reactos.git
synced 2026-09-02 12:23:31 +00:00
Fix (among other things) failure to boot when a CD is not inserted, caused by
the new (correct) ASSERT in mutex acquisition in MmProbeAndLockPages, which was erroneously being called from IoBuildAsynchronousFsdRequest at DISPATCH_LEVEL. The only correct course of action when calling IoBuildAsynchronousFsdRequest at DISPATCH_LEVEL is to MmBuildMdlForNonPagedPool since the buffer must be nonpaged (if the IRP completes synchronously, we'll still be at DISPATCH_LEVEL) This is the case when direct io is done at DISPATCH_LEVEL using IoBuildAsynchronousFsdRequest. svn path=/trunk/; revision=34899
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user