+/**
+ Tests whether a controller is managed by a specific driver.
+
+ This function tests whether a specific driver manages ControllerHandle by\r
+ opening on DriverBindingHandle a protocol specified by ProtocolGuid with\r
+ attribute EFI_OPEN_PROTOCOL_BY_DRIVER. This library function is used to\r
+ implement the Component Name Protocol for EFI Drivers.\r
+ If ProtocolGuid is NULL, then ASSERT().\r
+
+ @param ControllerHandle A handle for a controller to test.
+ @param DriverBindingHandle Specifies the driver binding handle for the
+ driver.
+ @param ProtocolGuid Supplies GUID for the protocol opened by the
+ driver on the controller.
+
+ @retval EFI_SUCCESS ControllerHandle is managed by the specific
+ driver.
+ @retval EFI_UNSUPPORTED ControllerHandle is not managed by the specific
+ driver.
+
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EfiTestManagedDevice (\r
+ IN CONST EFI_HANDLE ControllerHandle,\r
+ IN CONST EFI_HANDLE DriverBindingHandle,\r
+ IN CONST EFI_GUID *ProtocolGuid\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ VOID *ManagedInterface;\r
+\r
+ ASSERT (ProtocolGuid != NULL);\r
+\r
+ Status = gBS->OpenProtocol (\r
+ ControllerHandle,\r
+ (EFI_GUID *) ProtocolGuid,\r
+ &ManagedInterface,\r
+ DriverBindingHandle,\r
+ ControllerHandle,\r
+ EFI_OPEN_PROTOCOL_BY_DRIVER\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ gBS->CloseProtocol (\r
+ ControllerHandle,\r
+ (EFI_GUID *) ProtocolGuid,\r
+ DriverBindingHandle,\r
+ ControllerHandle\r
+ );\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ if (Status != EFI_ALREADY_STARTED) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**
+ Tests whether a child handle is a children device of the controller.
+
+ This function tests whether ChildHandle is one of the children of
+ ControllerHandle which are consuming a protocol specified by ProtocolGuid
+ with the attribute bit EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER set. This
+ library function is used to implement the Component Name Protocol for EFI
+ Drivers.
+ If ProtocolGuid is NULL, then ASSERT().
+
+ @param ControllerHandle A handle for a (parent) controller to test.
+ @param ChildHandle A child handle to test.
+ @param ConsumsedGuid Supplies GUID for the protocol consumed by
+ children from controller.
+
+ @retval EFI_SUCCESS ChildHandle is a child of the ControllerHandle.
+ @retval EFI_UNSUPPORTED ChildHandle is not a child of the
+ ControllerHandle.
+
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+EfiTestChildHandle (\r
+ IN CONST EFI_HANDLE ControllerHandle,\r
+ IN CONST EFI_HANDLE ChildHandle,\r
+ IN CONST EFI_GUID *ProtocolGuid\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;\r
+ UINTN EntryCount;\r
+ UINTN Index;\r
+\r
+ ASSERT (ProtocolGuid != NULL);\r
+\r
+ //\r
+ // Retrieve the list of agents that are consuming the specific protocol\r
+ // on ControllerHandle.\r
+ //\r
+ Status = gBS->OpenProtocolInformation (\r
+ ControllerHandle,\r
+ (EFI_GUID *) ProtocolGuid,\r
+ &OpenInfoBuffer,\r
+ &EntryCount\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ //\r
+ // Inspect if ChildHandle is one of the agents.\r
+ //\r
+ Status = EFI_UNSUPPORTED;\r
+ for (Index = 0; Index < EntryCount; Index++) {\r
+ if ((OpenInfoBuffer[Index].ControllerHandle == ChildHandle) &&\r
+ (OpenInfoBuffer[Index].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
+ Status = EFI_SUCCESS;\r
+ break;\r
+ }\r
+ }\r
+ \r
+ FreePool (OpenInfoBuffer);\r
+ return Status;\r
+}\r
+\r