NTSTATUS
FxDevice::DispatchWithLock(
__in MdDeviceObject DeviceObject,
__in MdIrp Irp
)
{
NTSTATUS status;
FxIrp irp(Irp);
switch (_RequiresRemLock(irp.GetMajorFunction(),
irp.GetMinorFunction())) {
case FxDeviceRemLockRequired:
status = Mx::MxAcquireRemoveLock(
&_GetFxWdmExtension(DeviceObject)->IoRemoveLock,
Irp
);
if (!NT_SUCCESS(status)) {
irp.SetStatus(status);
irp.CompleteRequest(IO_NO_INCREMENT);
return status;
}
break;
case FxDeviceRemLockOptIn:
status = _AcquireOptinRemoveLock(
DeviceObject,
Irp
);
if (!NT_SUCCESS(status)) {
irp.SetStatus(status);
irp.CompleteRequest(IO_NO_INCREMENT);
return status;
}
break;
case FxDeviceRemLockTestValid:
//
// Try to Acquire and Release the RemLock. If acquiring the lock
// fails then it is not safe to process the IRP and the IRP should
// be completed immediately.
//
status = Mx::MxAcquireRemoveLock(
&_GetFxWdmExtension(DeviceObject)->IoRemoveLock,
Irp
);
if (!NT_SUCCESS(status)) {
irp.SetStatus(status);
irp.CompleteRequest(IO_NO_INCREMENT);
return status;
}
Mx::MxReleaseRemoveLock(
&_GetFxWdmExtension(DeviceObject)->IoRemoveLock,
Irp
);
break;
}
return Dispatch(DeviceObject, Irp);
}