181 IN CONST EFI_HANDLE DriverBindingHandle OPTIONAL,
182 IN CONST EFI_HANDLE ControllerHandle OPTIONAL,
183 IN UINTN *HandleCount,
184 OUT EFI_HANDLE **HandleBuffer,
185 OUT UINTN **HandleType
190 EFI_GUID **ProtocolGuidArray;
193 EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfo;
197 INTN DriverBindingHandleIndex;
199 ASSERT (HandleCount != NULL);
200 ASSERT (HandleBuffer != NULL);
201 ASSERT (HandleType != NULL);
202 ASSERT (DriverBindingHandle != NULL || ControllerHandle != NULL);
205 *HandleBuffer = NULL;
211 Status =
gBS->LocateHandleBuffer (
218 if (EFI_ERROR (Status)) {
222 *HandleType = AllocateZeroPool (*HandleCount *
sizeof (UINTN));
223 if (*HandleType == NULL) {
224 if (*HandleBuffer != NULL) {
225 FreePool (*HandleBuffer);
226 *HandleBuffer = NULL;
230 return EFI_OUT_OF_RESOURCES;
233 DriverBindingHandleIndex = -1;
234 for (HandleIndex = 0; HandleIndex < *HandleCount; HandleIndex++) {
235 if ((DriverBindingHandle != NULL) && ((*HandleBuffer)[HandleIndex] == DriverBindingHandle)) {
236 DriverBindingHandleIndex = (INTN)HandleIndex;
240 for (HandleIndex = 0; HandleIndex < *HandleCount; HandleIndex++) {
244 Status =
gBS->ProtocolsPerHandle (
245 (*HandleBuffer)[HandleIndex],
249 if (EFI_ERROR (Status)) {
253 for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {
261 }
else if (
CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfiguration2ProtocolGuid)) {
263 }
else if (
CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfigurationProtocolGuid)) {
265 }
else if (
CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnostics2ProtocolGuid)) {
267 }
else if (
CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnosticsProtocolGuid)) {
269 }
else if (
CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentName2ProtocolGuid)) {
280 Status =
gBS->OpenProtocolInformation (
281 (*HandleBuffer)[HandleIndex],
282 ProtocolGuidArray[ProtocolIndex],
286 if (EFI_ERROR (Status)) {
290 if (ControllerHandle == NULL) {
295 for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {
296 if ((OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) && ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0)) {
298 if (DriverBindingHandleIndex != -1) {
303 if ((OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) && ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0)) {
305 if (DriverBindingHandleIndex != -1) {
309 for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
310 if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) {
318 if ((DriverBindingHandle == NULL) && (ControllerHandle != NULL)) {
319 if (ControllerHandle == (*HandleBuffer)[HandleIndex]) {
321 for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {
322 if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {
323 for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
324 if (OpenInfo[OpenInfoIndex].AgentHandle == (*HandleBuffer)[ChildIndex]) {
330 if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
331 for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
332 if (OpenInfo[OpenInfoIndex].AgentHandle == (*HandleBuffer)[ChildIndex]) {
336 if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) {
343 for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {
344 if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
345 if (OpenInfo[OpenInfoIndex].ControllerHandle == ControllerHandle) {
353 if ((DriverBindingHandle != NULL) && (ControllerHandle != NULL)) {
354 if (ControllerHandle == (*HandleBuffer)[HandleIndex]) {
356 for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {
357 if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {
358 if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) {
359 if (DriverBindingHandleIndex != -1) {
365 if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
366 if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) {
367 for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
368 if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) {
374 for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
375 if (OpenInfo[OpenInfoIndex].AgentHandle == (*HandleBuffer)[ChildIndex]) {
382 for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {
383 if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
384 if (OpenInfo[OpenInfoIndex].ControllerHandle == ControllerHandle) {
395 FreePool (ProtocolGuidArray);
432 IN CONST EFI_HANDLE DriverBindingHandle OPTIONAL,
433 IN CONST EFI_HANDLE ControllerHandle OPTIONAL,
435 IN UINTN *MatchingHandleCount,
436 OUT EFI_HANDLE **MatchingHandleBuffer OPTIONAL
441 EFI_HANDLE *HandleBuffer;
445 ASSERT (MatchingHandleCount != NULL);
446 ASSERT (DriverBindingHandle != NULL || ControllerHandle != NULL);
449 return (EFI_INVALID_PARAMETER);
452 if (((Mask &
HR_CHILD_HANDLE) != 0) && (DriverBindingHandle == NULL)) {
453 return (EFI_INVALID_PARAMETER);
456 *MatchingHandleCount = 0;
457 if (MatchingHandleBuffer != NULL) {
458 *MatchingHandleBuffer = NULL;
471 if (!EFI_ERROR (Status)) {
475 for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {
476 if ((HandleType[HandleIndex] & Mask) == Mask) {
477 (*MatchingHandleCount)++;
484 if (*MatchingHandleCount == 0) {
485 Status = EFI_NOT_FOUND;
487 if (MatchingHandleBuffer == NULL) {
491 Status = EFI_SUCCESS;
496 *MatchingHandleBuffer = AllocateZeroPool ((*MatchingHandleCount +1)*
sizeof (EFI_HANDLE));
497 if (*MatchingHandleBuffer == NULL) {
498 Status = EFI_OUT_OF_RESOURCES;
500 for (HandleIndex = 0, *MatchingHandleCount = 0
501 ; HandleIndex < HandleCount
508 if ((HandleType[HandleIndex] & Mask) == Mask) {
509 (*MatchingHandleBuffer)[(*MatchingHandleCount)++] = HandleBuffer[HandleIndex];
516 (*MatchingHandleBuffer)[*MatchingHandleCount] = NULL;
518 Status = EFI_SUCCESS;
524 if (HandleBuffer != NULL) {
525 FreePool (HandleBuffer);
528 if (HandleType != NULL) {
529 FreePool (HandleType);
533 (MatchingHandleBuffer == NULL) ||
534 (*MatchingHandleCount == 0 && *MatchingHandleBuffer == NULL) ||
535 (*MatchingHandleCount != 0 && *MatchingHandleBuffer != NULL)