diff --git a/drivers/sac/driver/data.c b/drivers/sac/driver/data.c index d7f1ae09d09..face230f688 100644 --- a/drivers/sac/driver/data.c +++ b/drivers/sac/driver/data.c @@ -153,27 +153,29 @@ FreeDeviceData(IN PDEVICE_OBJECT DeviceObject) /* Get the device extension and see how far we had gotten */ DeviceExtension = (PSAC_DEVICE_EXTENSION)DeviceObject->DeviceExtension; - if ((GlobalDataInitialized) && (DeviceExtension->Initialized)) + if (!(GlobalDataInitialized) || !(DeviceExtension->Initialized)) { - /* Attempt to rundown while holding the lock */ + goto Exit; + } + + /* Attempt to rundown while holding the lock */ + KeAcquireSpinLock(&DeviceExtension->Lock, &OldIrql); + while (DeviceExtension->RundownInProgress) + { + SAC_DBG(SAC_DBG_ENTRY_EXIT, "SAC FreeDeviceData: Waiting....\n"); + + /* Initiate and wait for rundown */ + KeInitializeEvent(&DeviceExtension->RundownEvent, SynchronizationEvent, 0); + KeReleaseSpinLock(&DeviceExtension->Lock, OldIrql); + Status = KeWaitForSingleObject(&DeviceExtension->RundownEvent, + Executive, + KernelMode, + FALSE, + NULL); + ASSERT(Status == STATUS_SUCCESS); + + /* Re-acquire the lock and check if rundown is done */ KeAcquireSpinLock(&DeviceExtension->Lock, &OldIrql); - while (DeviceExtension->RundownInProgress) - { - SAC_DBG(SAC_DBG_ENTRY_EXIT, "SAC FreeDeviceData: Waiting....\n"); - - /* Initiate and wait for rundown */ - KeInitializeEvent(&DeviceExtension->RundownEvent, SynchronizationEvent, 0); - KeReleaseSpinLock(&DeviceExtension->Lock, OldIrql); - Status = KeWaitForSingleObject(&DeviceExtension->RundownEvent, - Executive, - KernelMode, - FALSE, - NULL); - ASSERT(Status == STATUS_SUCCESS); - - /* Re-acquire the lock and check if rundown is done */ - KeAcquireSpinLock(&DeviceExtension->Lock, &OldIrql); - } } /* Now set the rundown flag while we cancel the timer */ @@ -205,6 +207,7 @@ FreeDeviceData(IN PDEVICE_OBJECT DeviceObject) KeAcquireSpinLock(&DeviceExtension->Lock, &OldIrql); DeviceExtension->Initialized = FALSE; KeReleaseSpinLock(&DeviceExtension->Lock, OldIrql); +Exit: SAC_DBG(SAC_DBG_ENTRY_EXIT, "SAC FreeDeviceData: Exiting.\n"); } diff --git a/drivers/sac/driver/sacdrv.h b/drivers/sac/driver/sacdrv.h index 0280b6c9d1c..9c44671985f 100644 --- a/drivers/sac/driver/sacdrv.h +++ b/drivers/sac/driver/sacdrv.h @@ -74,6 +74,7 @@ { \ if (!VerifyEventWaitable(Attributes->x, &Object, &WaitObject)) \ { \ + Status = STATUS_INVALID_HANDLE; \ goto FailChannel; \ } \ Channel->x = Attributes->x; \