_Use_decl_annotations_ VOID OnDeviceContextCleanup( WDFOBJECT Object ) /*++ Routine Description: This event handles cleanup of the device object. Arguments: Object - Pointer to the object to cleanup Return Value: None --*/ { PDEVICE_CONTEXT deviceContext; deviceContext = GetContext(Object); // // release all resources from the device object (there is only one) // if (deviceContext->dmaBuffer) { MmFreeContiguousMemorySpecifyCache(deviceContext->dmaBuffer, DMA_BUFFER_SIZE, MmNonCached); } if (deviceContext->dmaCb) { // For cleanup functions of WDFDEVICE objects the IRQL is IRQL_PASSIVE. So we are save to call. #pragma warning(push) #pragma warning(disable:28118) MmFreeContiguousMemorySpecifyCache(deviceContext->dmaCb, deviceContext->dmaControlDataSize, MmNonCached); #pragma warning(pop) } }
VOID SpReleaseAdapterResources( IN PADAPTER_EXTENSION Adapter, IN BOOLEAN Surprise ) /*++ Routine Description: This function deletes all of the storage associated with a device extension, disconnects from the timers and interrupts and then deletes the object. This function can be called at any time during the initialization. Arguments: Adapter - Supplies a pointer to the device extesnion to be deleted. Return Value: None. --*/ { PCOMMON_EXTENSION commonExtension = &(Adapter->CommonExtension); ULONG j; PVOID tempPointer; PAGED_CODE(); #if DBG if(!Surprise) { // // Free the Remove tracking lookaside list. // ExDeleteNPagedLookasideList(&(commonExtension->RemoveTrackingLookasideList)); } #endif // // Stop the time and disconnect the interrupt if they have been // initialized. The interrupt object is connected after // timer has been initialized, and the interrupt object is connected, but // before the timer is started. // if(Adapter->DeviceObject->Timer != NULL) { IoStopTimer(Adapter->DeviceObject); KeCancelTimer(&(Adapter->MiniPortTimer)); } if(Adapter->SynchronizeExecution != SpSynchronizeExecution) { if (Adapter->InterruptObject) { IoDisconnectInterrupt(Adapter->InterruptObject); } if (Adapter->InterruptObject2) { IoDisconnectInterrupt(Adapter->InterruptObject2); Adapter->InterruptObject2 = NULL; } // // SpSynchronizeExecution expects to get a pointer to the // adapter extension as the "interrupt" parameter. // Adapter->InterruptObject = (PVOID) Adapter; Adapter->SynchronizeExecution = SpSynchronizeExecution; } // // Delete the miniport's device extension // if (Adapter->HwDeviceExtension != NULL) { PHW_DEVICE_EXTENSION devExt = CONTAINING_RECORD(Adapter->HwDeviceExtension, HW_DEVICE_EXTENSION, HwDeviceExtension); ExFreePool(devExt); Adapter->HwDeviceExtension = NULL; } // // Free the configuration information structure. // if (Adapter->PortConfig) { ExFreePool(Adapter->PortConfig); Adapter->PortConfig = NULL; } // // Deallocate SCSIPORT WMI REGINFO information, if any. // SpWmiDestroySpRegInfo(Adapter->DeviceObject); // // Free the common buffer. // if (Adapter->SrbExtensionBuffer != NULL && Adapter->CommonBufferSize != 0) { if (Adapter->DmaAdapterObject == NULL) { // // Since there is no adapter just free the non-paged pool. // ExFreePool(Adapter->SrbExtensionBuffer); } else { #if defined(_X86_) if(Adapter->UncachedExtensionIsCommonBuffer == FALSE) { MmFreeContiguousMemorySpecifyCache(Adapter->SrbExtensionBuffer, Adapter->CommonBufferSize, MmNonCached); } else #endif { HalFreeCommonBuffer( Adapter->DmaAdapterObject, Adapter->CommonBufferSize, Adapter->PhysicalCommonBuffer, Adapter->SrbExtensionBuffer, FALSE); } } Adapter->SrbExtensionBuffer = NULL; } // // Free the SRB data array. // if (Adapter->SrbDataListInitialized) { if(Adapter->EmergencySrbData != NULL) { ExFreeToNPagedLookasideList( &Adapter->SrbDataLookasideList, Adapter->EmergencySrbData); Adapter->EmergencySrbData = NULL; } ExDeleteNPagedLookasideList(&Adapter->SrbDataLookasideList); Adapter->SrbDataListInitialized = FALSE; } if (Adapter->InquiryBuffer != NULL) { ExFreePool(Adapter->InquiryBuffer); Adapter->InquiryBuffer = NULL; } if (Adapter->InquirySenseBuffer != NULL) { ExFreePool(Adapter->InquirySenseBuffer); Adapter->InquirySenseBuffer = NULL; } if (Adapter->InquiryIrp != NULL) { IoFreeIrp(Adapter->InquiryIrp); Adapter->InquiryIrp = NULL; } if (Adapter->InquiryMdl != NULL) { IoFreeMdl(Adapter->InquiryMdl); Adapter->InquiryMdl = NULL; } // // Free the Scatter Gather lookaside list. // if (Adapter->MediumScatterGatherListInitialized) { ExDeleteNPagedLookasideList( &Adapter->MediumScatterGatherLookasideList); Adapter->MediumScatterGatherListInitialized = FALSE; } // // Unmap any mapped areas. // SpReleaseMappedAddresses(Adapter); // // If we've got any resource lists allocated still we should free them // now. // if(Adapter->AllocatedResources != NULL) { ExFreePool(Adapter->AllocatedResources); Adapter->AllocatedResources = NULL; } if(Adapter->TranslatedResources != NULL) { ExFreePool(Adapter->TranslatedResources); Adapter->TranslatedResources = NULL; } Adapter->CommonExtension.IsInitialized = FALSE; return; }