EFI_STATUS QNCSmmCoreUnRegister ( IN QNC_SMM_GENERIC_PROTOCOL *This, IN EFI_HANDLE DispatchHandle ) /*++ Routine Description: Arguments: Returns: --*/ // GC_TODO: This - add argument and description to function comment // GC_TODO: DispatchHandle - add argument and description to function comment // GC_TODO: EFI_INVALID_PARAMETER - add return value to function comment // GC_TODO: EFI_INVALID_PARAMETER - add return value to function comment // GC_TODO: EFI_SUCCESS - add return value to function comment { BOOLEAN SafeToDisable; DATABASE_RECORD *RecordToDelete; DATABASE_RECORD *RecordInDb; LIST_ENTRY *LinkInDb; if (DispatchHandle == NULL) { return EFI_INVALID_PARAMETER; } if (BASE_CR (DispatchHandle, DATABASE_RECORD, Link)->Signature != DATABASE_RECORD_SIGNATURE) { return EFI_INVALID_PARAMETER; } RecordToDelete = DATABASE_RECORD_FROM_LINK (DispatchHandle); RemoveEntryList (&RecordToDelete->Link); RecordToDelete->Signature = 0; // // See if we can disable the source, reserved for future use since this might // not be the only criteria to disable // SafeToDisable = TRUE; LinkInDb = GetFirstNode (&mPrivateData.CallbackDataBase); while(!IsNull (&mPrivateData.CallbackDataBase, LinkInDb)) { RecordInDb = DATABASE_RECORD_FROM_LINK (LinkInDb); if (CompareEnables (&RecordToDelete->SrcDesc, &RecordInDb->SrcDesc)) { SafeToDisable = FALSE; break; } LinkInDb = GetNextNode (&mPrivateData.CallbackDataBase, &RecordInDb->Link); } if (SafeToDisable) { QNCSmmDisableSource( &RecordToDelete->SrcDesc ); } FreePool (RecordToDelete); return EFI_SUCCESS; }
/** Compare 2 SMM source descriptors, based on Enable settings and Status settings of them. @param[in] Src1 Pointer to the PCH SMI source description table 1 @param[in] Src2 Pointer to the PCH SMI source description table 2 @retval TRUE The 2 SMM source descriptors are identical. @retval FALSE The 2 SMM source descriptors are not identical. **/ BOOLEAN CompareSources ( CONST IN PCH_SMM_SOURCE_DESC *Src1, CONST IN PCH_SMM_SOURCE_DESC *Src2 ) { return (BOOLEAN) (CompareEnables (Src1, Src2) && CompareStatuses (Src1, Src2)); }