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:
Art Yerkes
2008-07-28 12:38:47 +00:00
parent 966a7b788f
commit 258329b01b
2 changed files with 27 additions and 19 deletions
+2 -1
View File
@@ -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;
}
+25 -18
View File
@@ -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;
}