mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-11-04 03:57:26 +00:00 
			
		
		
		
	Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Michael Kinney <michael.d.kinney@intel.com>
Reviewed-by: Jaben Carsey <Jaben.carsey@intel.com>
1) ShellPkg/Library/UefiHandleParsingLib
    a. UefiHandleParsingLib.c – ConvertHandleToHandleIndex() and ConvertHandleIndexToHandle()
        i. Update to work correctly when handles are destroyed due to driver disconnect operations.  Same handle index is never reused.
    b. UefiHandleParsingLib.c – ParseHandleDatabaseByRelationshipWithType() and ParseHandleDatabaseForChildControllers()
        i. Expand to handle Service Binding Protocol usage such as Network stack.
2) ShellPkg/Library/UefiShellDriver1CommandsLib
    a. DevTree.c – Fix bug where the same handle is shown more than once.
    b. Dh.c – Fix use of GetDriverName() and GetDriverImageName().  The status returned must always be evaluated. 
    c. Disconnect.c – Remove requirement that a handle being disconnected must support Device Path Protocol.  This prevents driver model handles without device paths from being disconnected (i.e. Network Stack)
    d. OpenInfo.c – Fix bug when showing open info about a ControllerHandle that has been destroyed due to a disconnect or an unload operation.
    e. UefiShellDriver1CommandsLib.uni – Fix “drivers” command formatting when handle indexes have more than 2 characters.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13786 6f19259b-4bc3-4df7-8a09-765794883524
			
			
This commit is contained in:
		
							parent
							
								
									c42c9cac8c
								
							
						
					
					
						commit
						f330ff35dc
					
				@ -948,7 +948,11 @@ ConvertHandleToHandleIndex(
 | 
			
		||||
  IN CONST EFI_HANDLE TheHandle
 | 
			
		||||
  )
 | 
			
		||||
{
 | 
			
		||||
  HANDLE_LIST *ListWalker;
 | 
			
		||||
  EFI_STATUS   Status;
 | 
			
		||||
  EFI_GUID     **ProtocolBuffer;
 | 
			
		||||
  UINTN        ProtocolCount;
 | 
			
		||||
  HANDLE_LIST  *ListWalker;
 | 
			
		||||
 | 
			
		||||
  if (TheHandle == NULL) {
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
@ -960,9 +964,34 @@ ConvertHandleToHandleIndex(
 | 
			
		||||
    ;  ListWalker = (HANDLE_LIST*)GetNextNode(&mHandleList.List.Link,&ListWalker->Link)
 | 
			
		||||
   ){
 | 
			
		||||
    if (ListWalker->TheHandle == TheHandle) {
 | 
			
		||||
      //
 | 
			
		||||
      // Verify that TheHandle is still present in the Handle Database
 | 
			
		||||
      //
 | 
			
		||||
      Status = gBS->ProtocolsPerHandle(TheHandle, &ProtocolBuffer, &ProtocolCount);
 | 
			
		||||
      if (EFI_ERROR (Status)) {
 | 
			
		||||
        //
 | 
			
		||||
        // TheHandle is not present in the Handle Database, so delete from the handle list
 | 
			
		||||
        //
 | 
			
		||||
        RemoveEntryList (&ListWalker->Link);
 | 
			
		||||
        return 0;
 | 
			
		||||
      }
 | 
			
		||||
      FreePool (ProtocolBuffer);
 | 
			
		||||
      return (ListWalker->TheIndex);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //
 | 
			
		||||
  // Verify that TheHandle is valid handle
 | 
			
		||||
  //
 | 
			
		||||
  Status = gBS->ProtocolsPerHandle(TheHandle, &ProtocolBuffer, &ProtocolCount);
 | 
			
		||||
  if (EFI_ERROR (Status)) {
 | 
			
		||||
    //
 | 
			
		||||
    // TheHandle is not valid, so do not add to handle list
 | 
			
		||||
    //
 | 
			
		||||
    return 0;
 | 
			
		||||
  }
 | 
			
		||||
  FreePool (ProtocolBuffer);
 | 
			
		||||
 | 
			
		||||
  ListWalker = AllocateZeroPool(sizeof(HANDLE_LIST));
 | 
			
		||||
  ASSERT(ListWalker != NULL);
 | 
			
		||||
  ListWalker->TheHandle = TheHandle;
 | 
			
		||||
@ -988,23 +1017,36 @@ ConvertHandleIndexToHandle(
 | 
			
		||||
  IN CONST UINTN TheIndex
 | 
			
		||||
  )
 | 
			
		||||
{
 | 
			
		||||
  EFI_STATUS   Status;
 | 
			
		||||
  EFI_GUID     **ProtocolBuffer;
 | 
			
		||||
  UINTN        ProtocolCount;
 | 
			
		||||
  HANDLE_LIST *ListWalker;
 | 
			
		||||
 | 
			
		||||
  InternalShellInitHandleList();
 | 
			
		||||
 | 
			
		||||
  if (TheIndex >= mHandleList.NextIndex) {
 | 
			
		||||
    return (NULL);
 | 
			
		||||
    return NULL;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  for (ListWalker = (HANDLE_LIST*)GetFirstNode(&mHandleList.List.Link)
 | 
			
		||||
    ;  !IsNull(&mHandleList.List.Link,&ListWalker->Link)
 | 
			
		||||
    ;  ListWalker = (HANDLE_LIST*)GetNextNode(&mHandleList.List.Link,&ListWalker->Link)
 | 
			
		||||
   ){
 | 
			
		||||
    if (ListWalker->TheIndex == TheIndex) {
 | 
			
		||||
    if (ListWalker->TheIndex == TheIndex && ListWalker->TheHandle != NULL) {
 | 
			
		||||
      //
 | 
			
		||||
      // Verify that LinkWalker->TheHandle is valid handle
 | 
			
		||||
      //
 | 
			
		||||
      Status = gBS->ProtocolsPerHandle(ListWalker->TheHandle, &ProtocolBuffer, &ProtocolCount);
 | 
			
		||||
      if (EFI_ERROR (Status)) {
 | 
			
		||||
        //
 | 
			
		||||
        // TheHandle is not valid, so do not add to handle list
 | 
			
		||||
        //
 | 
			
		||||
        ListWalker->TheHandle = NULL;
 | 
			
		||||
      }
 | 
			
		||||
      return (ListWalker->TheHandle);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return (NULL);
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -1052,6 +1094,7 @@ ParseHandleDatabaseByRelationshipWithType (
 | 
			
		||||
  UINTN                               OpenInfoCount;
 | 
			
		||||
  UINTN                               OpenInfoIndex;
 | 
			
		||||
  UINTN                               ChildIndex;
 | 
			
		||||
  INTN                                DriverBindingHandleIndex;
 | 
			
		||||
 | 
			
		||||
  ASSERT(HandleCount  != NULL);
 | 
			
		||||
  ASSERT(HandleBuffer != NULL);
 | 
			
		||||
@ -1079,6 +1122,13 @@ ParseHandleDatabaseByRelationshipWithType (
 | 
			
		||||
  *HandleType = AllocateZeroPool (*HandleCount * sizeof (UINTN));
 | 
			
		||||
  ASSERT(*HandleType != NULL);
 | 
			
		||||
 | 
			
		||||
  DriverBindingHandleIndex = -1;
 | 
			
		||||
  for (HandleIndex = 0; HandleIndex < *HandleCount; HandleIndex++) {
 | 
			
		||||
    if (DriverBindingHandle != NULL && (*HandleBuffer)[HandleIndex] == DriverBindingHandle) {
 | 
			
		||||
      DriverBindingHandleIndex = (INTN)HandleIndex;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  for (HandleIndex = 0; HandleIndex < *HandleCount; HandleIndex++) {
 | 
			
		||||
    //
 | 
			
		||||
    // Retrieve the list of all the protocols on each handle
 | 
			
		||||
@ -1088,102 +1138,150 @@ ParseHandleDatabaseByRelationshipWithType (
 | 
			
		||||
                  &ProtocolGuidArray,
 | 
			
		||||
                  &ArrayCount
 | 
			
		||||
                 );
 | 
			
		||||
    if (!EFI_ERROR (Status)) {
 | 
			
		||||
    if (EFI_ERROR (Status)) {
 | 
			
		||||
      continue;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
      for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {
 | 
			
		||||
    for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {
 | 
			
		||||
 | 
			
		||||
        //
 | 
			
		||||
        // Set the bit describing what this handle has
 | 
			
		||||
        //
 | 
			
		||||
        if        (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiLoadedImageProtocolGuid)         ) {
 | 
			
		||||
          (*HandleType)[HandleIndex] |= HR_IMAGE_HANDLE;
 | 
			
		||||
        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverBindingProtocolGuid)       ) {
 | 
			
		||||
          (*HandleType)[HandleIndex] |= HR_DRIVER_BINDING_HANDLE;
 | 
			
		||||
        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfiguration2ProtocolGuid)) {
 | 
			
		||||
          (*HandleType)[HandleIndex] |= HR_DRIVER_CONFIGURATION_HANDLE;
 | 
			
		||||
        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfigurationProtocolGuid) ) {
 | 
			
		||||
          (*HandleType)[HandleIndex] |= HR_DRIVER_CONFIGURATION_HANDLE;
 | 
			
		||||
        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnostics2ProtocolGuid)  ) {
 | 
			
		||||
          (*HandleType)[HandleIndex] |= HR_DRIVER_DIAGNOSTICS_HANDLE;
 | 
			
		||||
        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnosticsProtocolGuid)   ) {
 | 
			
		||||
          (*HandleType)[HandleIndex] |= HR_DRIVER_DIAGNOSTICS_HANDLE;
 | 
			
		||||
        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentName2ProtocolGuid)      ) {
 | 
			
		||||
          (*HandleType)[HandleIndex] |= HR_COMPONENT_NAME_HANDLE;
 | 
			
		||||
        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentNameProtocolGuid)       ) {
 | 
			
		||||
          (*HandleType)[HandleIndex] |= HR_COMPONENT_NAME_HANDLE;
 | 
			
		||||
        } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDevicePathProtocolGuid)          ) {
 | 
			
		||||
          (*HandleType)[HandleIndex] |= HR_DEVICE_HANDLE;
 | 
			
		||||
        } else {
 | 
			
		||||
          DEBUG_CODE_BEGIN();
 | 
			
		||||
          ASSERT((*HandleType)[HandleIndex] == (*HandleType)[HandleIndex]);
 | 
			
		||||
          DEBUG_CODE_END();
 | 
			
		||||
        }
 | 
			
		||||
        //
 | 
			
		||||
        // Retrieve the list of agents that have opened each protocol
 | 
			
		||||
        //
 | 
			
		||||
        Status = gBS->OpenProtocolInformation (
 | 
			
		||||
      //
 | 
			
		||||
      // Set the bit describing what this handle has
 | 
			
		||||
      //
 | 
			
		||||
      if        (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiLoadedImageProtocolGuid)         ) {
 | 
			
		||||
        (*HandleType)[HandleIndex] |= HR_IMAGE_HANDLE;
 | 
			
		||||
      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverBindingProtocolGuid)       ) {
 | 
			
		||||
        (*HandleType)[HandleIndex] |= HR_DRIVER_BINDING_HANDLE;
 | 
			
		||||
      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfiguration2ProtocolGuid)) {
 | 
			
		||||
        (*HandleType)[HandleIndex] |= HR_DRIVER_CONFIGURATION_HANDLE;
 | 
			
		||||
      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverConfigurationProtocolGuid) ) {
 | 
			
		||||
        (*HandleType)[HandleIndex] |= HR_DRIVER_CONFIGURATION_HANDLE;
 | 
			
		||||
      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnostics2ProtocolGuid)  ) {
 | 
			
		||||
        (*HandleType)[HandleIndex] |= HR_DRIVER_DIAGNOSTICS_HANDLE;
 | 
			
		||||
      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDriverDiagnosticsProtocolGuid)   ) {
 | 
			
		||||
        (*HandleType)[HandleIndex] |= HR_DRIVER_DIAGNOSTICS_HANDLE;
 | 
			
		||||
      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentName2ProtocolGuid)      ) {
 | 
			
		||||
        (*HandleType)[HandleIndex] |= HR_COMPONENT_NAME_HANDLE;
 | 
			
		||||
      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiComponentNameProtocolGuid)       ) {
 | 
			
		||||
        (*HandleType)[HandleIndex] |= HR_COMPONENT_NAME_HANDLE;
 | 
			
		||||
      } else if (CompareGuid (ProtocolGuidArray[ProtocolIndex], &gEfiDevicePathProtocolGuid)          ) {
 | 
			
		||||
        (*HandleType)[HandleIndex] |= HR_DEVICE_HANDLE;
 | 
			
		||||
      } else {
 | 
			
		||||
        DEBUG_CODE_BEGIN();
 | 
			
		||||
        ASSERT((*HandleType)[HandleIndex] == (*HandleType)[HandleIndex]);
 | 
			
		||||
        DEBUG_CODE_END();
 | 
			
		||||
      }
 | 
			
		||||
      //
 | 
			
		||||
      // Retrieve the list of agents that have opened each protocol
 | 
			
		||||
      //
 | 
			
		||||
      Status = gBS->OpenProtocolInformation (
 | 
			
		||||
                      (*HandleBuffer)[HandleIndex],
 | 
			
		||||
                      ProtocolGuidArray[ProtocolIndex],
 | 
			
		||||
                      &OpenInfo,
 | 
			
		||||
                      &OpenInfoCount
 | 
			
		||||
                     );
 | 
			
		||||
        if (!EFI_ERROR (Status)) {
 | 
			
		||||
          for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {
 | 
			
		||||
            if (DriverBindingHandle != NULL && OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) {
 | 
			
		||||
              if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) == EFI_OPEN_PROTOCOL_BY_DRIVER) {
 | 
			
		||||
                (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);
 | 
			
		||||
      if (EFI_ERROR (Status)) {
 | 
			
		||||
        continue;
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      if (ControllerHandle == NULL) {
 | 
			
		||||
        //
 | 
			
		||||
        // ControllerHandle == NULL and DriverBindingHandle != NULL.  
 | 
			
		||||
        // Return information on all the controller handles that the driver specified by DriverBindingHandle is managing
 | 
			
		||||
        //
 | 
			
		||||
        for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {
 | 
			
		||||
          if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle && (OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {
 | 
			
		||||
            (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);
 | 
			
		||||
            if (DriverBindingHandleIndex != -1) {
 | 
			
		||||
              (*HandleType)[DriverBindingHandleIndex] |= HR_DEVICE_DRIVER;
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle && (OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
 | 
			
		||||
            (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);
 | 
			
		||||
            if (DriverBindingHandleIndex != -1) {
 | 
			
		||||
              (*HandleType)[DriverBindingHandleIndex] |= (HR_BUS_DRIVER | HR_DEVICE_DRIVER);
 | 
			
		||||
            }
 | 
			
		||||
            for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
 | 
			
		||||
              if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) {
 | 
			
		||||
                (*HandleType)[ChildIndex] |= (HR_DEVICE_HANDLE | HR_CHILD_HANDLE);
 | 
			
		||||
              }
 | 
			
		||||
              if (ControllerHandle != NULL && (*HandleBuffer)[HandleIndex] == ControllerHandle) {
 | 
			
		||||
                if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) == EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) {
 | 
			
		||||
                  for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
 | 
			
		||||
                    if ((*HandleBuffer)[ChildIndex] == OpenInfo[OpenInfoIndex].ControllerHandle) {
 | 
			
		||||
                      (*HandleType)[ChildIndex] |= (HR_DEVICE_HANDLE | HR_CHILD_HANDLE);
 | 
			
		||||
                    }
 | 
			
		||||
                  }
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      if (DriverBindingHandle == NULL && ControllerHandle != NULL) {
 | 
			
		||||
        if (ControllerHandle == (*HandleBuffer)[HandleIndex]) {
 | 
			
		||||
          (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);
 | 
			
		||||
          for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {
 | 
			
		||||
            if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {
 | 
			
		||||
              for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
 | 
			
		||||
                if (OpenInfo[OpenInfoIndex].AgentHandle == (*HandleBuffer)[ChildIndex]) {
 | 
			
		||||
                  (*HandleType)[ChildIndex] |= HR_DEVICE_DRIVER;
 | 
			
		||||
                }
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
            if (DriverBindingHandle == NULL && OpenInfo[OpenInfoIndex].ControllerHandle == ControllerHandle) {
 | 
			
		||||
              if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) == EFI_OPEN_PROTOCOL_BY_DRIVER) {
 | 
			
		||||
                for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
 | 
			
		||||
                  if ((*HandleBuffer)[ChildIndex] == OpenInfo[OpenInfoIndex].AgentHandle) {
 | 
			
		||||
                    (*HandleType)[ChildIndex] |= HR_DEVICE_DRIVER;
 | 
			
		||||
                  }
 | 
			
		||||
            if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
 | 
			
		||||
              for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
 | 
			
		||||
                if (OpenInfo[OpenInfoIndex].AgentHandle == (*HandleBuffer)[ChildIndex]) {
 | 
			
		||||
                  (*HandleType)[ChildIndex] |= (HR_BUS_DRIVER | HR_DEVICE_DRIVER);
 | 
			
		||||
                }
 | 
			
		||||
              }
 | 
			
		||||
              if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) == EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) {
 | 
			
		||||
                (*HandleType)[HandleIndex] |= HR_PARENT_HANDLE;
 | 
			
		||||
                for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
 | 
			
		||||
                  if ((*HandleBuffer)[ChildIndex] == OpenInfo[OpenInfoIndex].AgentHandle) {
 | 
			
		||||
                    (*HandleType)[ChildIndex] |= HR_BUS_DRIVER;
 | 
			
		||||
                  }
 | 
			
		||||
                if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) {
 | 
			
		||||
                  (*HandleType)[ChildIndex] |= (HR_DEVICE_HANDLE | HR_CHILD_HANDLE);
 | 
			
		||||
                }
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
 | 
			
		||||
          FreePool (OpenInfo);
 | 
			
		||||
        } else {
 | 
			
		||||
          for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {
 | 
			
		||||
            if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
 | 
			
		||||
              if (OpenInfo[OpenInfoIndex].ControllerHandle == ControllerHandle) {
 | 
			
		||||
                (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | HR_PARENT_HANDLE);
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      if (DriverBindingHandle != NULL && ControllerHandle != NULL) {
 | 
			
		||||
        if (ControllerHandle == (*HandleBuffer)[HandleIndex]) {
 | 
			
		||||
          (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | HR_CONTROLLER_HANDLE);
 | 
			
		||||
          for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {
 | 
			
		||||
            if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {
 | 
			
		||||
              if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) {
 | 
			
		||||
                if (DriverBindingHandleIndex != -1) {
 | 
			
		||||
                  (*HandleType)[DriverBindingHandleIndex] |= HR_DEVICE_DRIVER;
 | 
			
		||||
                }
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
            if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
 | 
			
		||||
              if (OpenInfo[OpenInfoIndex].AgentHandle == DriverBindingHandle) {
 | 
			
		||||
                for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
 | 
			
		||||
                  if (OpenInfo[OpenInfoIndex].ControllerHandle == (*HandleBuffer)[ChildIndex]) {
 | 
			
		||||
                    (*HandleType)[ChildIndex] |= (HR_DEVICE_HANDLE | HR_CHILD_HANDLE);
 | 
			
		||||
                  }
 | 
			
		||||
                }
 | 
			
		||||
              }
 | 
			
		||||
 | 
			
		||||
      FreePool (ProtocolGuidArray);
 | 
			
		||||
              for (ChildIndex = 0; ChildIndex < *HandleCount; ChildIndex++) {
 | 
			
		||||
                if (OpenInfo[OpenInfoIndex].AgentHandle == (*HandleBuffer)[ChildIndex]) {
 | 
			
		||||
                  (*HandleType)[ChildIndex] |= (HR_BUS_DRIVER | HR_DEVICE_DRIVER);
 | 
			
		||||
                }
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        } else {
 | 
			
		||||
          for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {
 | 
			
		||||
            if ((OpenInfo[OpenInfoIndex].Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {
 | 
			
		||||
              if (OpenInfo[OpenInfoIndex].ControllerHandle == ControllerHandle) {
 | 
			
		||||
                (*HandleType)[HandleIndex] |= (HR_DEVICE_HANDLE | HR_PARENT_HANDLE);
 | 
			
		||||
              }
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      FreePool (OpenInfo);
 | 
			
		||||
    }
 | 
			
		||||
    FreePool (ProtocolGuidArray);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  if (EFI_ERROR(Status)) {
 | 
			
		||||
    if (*HandleType != NULL) {
 | 
			
		||||
      FreePool (*HandleType);
 | 
			
		||||
    }
 | 
			
		||||
    if (*HandleBuffer != NULL) {
 | 
			
		||||
      FreePool (*HandleBuffer);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    *HandleCount  = 0;
 | 
			
		||||
    *HandleBuffer = NULL;
 | 
			
		||||
    *HandleType   = NULL;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return Status;
 | 
			
		||||
  return EFI_SUCCESS;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -1338,14 +1436,13 @@ ParseHandleDatabaseForChildControllers(
 | 
			
		||||
  )
 | 
			
		||||
{
 | 
			
		||||
  EFI_STATUS  Status;
 | 
			
		||||
//  UINTN       HandleIndex;
 | 
			
		||||
  UINTN       HandleIndex;
 | 
			
		||||
  UINTN       DriverBindingHandleCount;
 | 
			
		||||
  EFI_HANDLE  *DriverBindingHandleBuffer;
 | 
			
		||||
  UINTN       DriverBindingHandleIndex;
 | 
			
		||||
  UINTN       ChildControllerHandleCount;
 | 
			
		||||
  EFI_HANDLE  *ChildControllerHandleBuffer;
 | 
			
		||||
  UINTN       ChildControllerHandleIndex;
 | 
			
		||||
//  BOOLEAN     Found;
 | 
			
		||||
  EFI_HANDLE  *HandleBufferForReturn;
 | 
			
		||||
 | 
			
		||||
  if (MatchingHandleCount == NULL) {
 | 
			
		||||
@ -1365,7 +1462,7 @@ ParseHandleDatabaseForChildControllers(
 | 
			
		||||
  //
 | 
			
		||||
  // Get a buffer big enough for all the controllers.
 | 
			
		||||
  //
 | 
			
		||||
  HandleBufferForReturn = GetHandleListByProtocol(&gEfiDevicePathProtocolGuid);
 | 
			
		||||
  HandleBufferForReturn = GetHandleListByProtocol(NULL);
 | 
			
		||||
  if (HandleBufferForReturn == NULL) {
 | 
			
		||||
    FreePool (DriverBindingHandleBuffer);
 | 
			
		||||
    return (EFI_NOT_FOUND);
 | 
			
		||||
@ -1386,18 +1483,14 @@ ParseHandleDatabaseForChildControllers(
 | 
			
		||||
         ChildControllerHandleIndex < ChildControllerHandleCount;
 | 
			
		||||
         ChildControllerHandleIndex++
 | 
			
		||||
       ) {
 | 
			
		||||
//      Found = FALSE;
 | 
			
		||||
      HandleBufferForReturn[(*MatchingHandleCount)++] = ChildControllerHandleBuffer[ChildControllerHandleIndex];
 | 
			
		||||
//      for (HandleIndex = 0; HandleBufferForReturn[HandleIndex] != NULL; HandleIndex++) {
 | 
			
		||||
//        if (HandleBufferForReturn[HandleIndex] == ChildControllerHandleBuffer[ChildControllerHandleIndex]) {
 | 
			
		||||
//          Found = TRUE;
 | 
			
		||||
//          break;
 | 
			
		||||
//        }
 | 
			
		||||
//      }
 | 
			
		||||
 | 
			
		||||
//      if (Found) {
 | 
			
		||||
//        HandleBufferForReturn[(*MatchingHandleCount)++] = ChildControllerHandleBuffer[ChildControllerHandleIndex];
 | 
			
		||||
//      }
 | 
			
		||||
      for (HandleIndex = 0; HandleIndex < *MatchingHandleCount; HandleIndex++) {
 | 
			
		||||
        if (HandleBufferForReturn[HandleIndex] == ChildControllerHandleBuffer[ChildControllerHandleIndex]) {
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      if (HandleIndex >= *MatchingHandleCount) {
 | 
			
		||||
        HandleBufferForReturn[(*MatchingHandleCount)++] = ChildControllerHandleBuffer[ChildControllerHandleIndex];
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    FreePool (ChildControllerHandleBuffer);
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
/** @file
 | 
			
		||||
  Main file for DevTree shell Driver1 function.
 | 
			
		||||
 | 
			
		||||
  Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
 | 
			
		||||
  Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR>
 | 
			
		||||
  This program and the accompanying materials
 | 
			
		||||
  are licensed and made available under the terms and conditions of the BSD License
 | 
			
		||||
  which accompanies this distribution.  The full text of the license may be found at
 | 
			
		||||
@ -84,23 +84,6 @@ DoDevTreeForHandle(
 | 
			
		||||
    return SHELL_SUCCESS;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //
 | 
			
		||||
  // If we are at the begining then we want root handles they have no parents and do have device path.
 | 
			
		||||
  //
 | 
			
		||||
  if (IndentCharCount == 0) {
 | 
			
		||||
    Status = gBS->OpenProtocol (
 | 
			
		||||
                  TheHandle,
 | 
			
		||||
                  &gEfiDevicePathProtocolGuid,
 | 
			
		||||
                  NULL,
 | 
			
		||||
                  NULL,
 | 
			
		||||
                  NULL,
 | 
			
		||||
                  EFI_OPEN_PROTOCOL_TEST_PROTOCOL
 | 
			
		||||
                 );
 | 
			
		||||
    if (EFI_ERROR (Status)) {
 | 
			
		||||
      return SHELL_SUCCESS;
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  FormatString        = AllocateZeroPool(StrSize(HiiString) + (10)*sizeof(FormatString[0]));
 | 
			
		||||
 | 
			
		||||
  ASSERT(HiiString    != NULL);
 | 
			
		||||
@ -169,6 +152,8 @@ ShellCommandRunDevTree (
 | 
			
		||||
  EFI_HANDLE          TheHandle;
 | 
			
		||||
  BOOLEAN             FlagD;
 | 
			
		||||
  UINT64              Intermediate;
 | 
			
		||||
  UINTN               ParentControllerHandleCount;
 | 
			
		||||
  EFI_HANDLE          *ParentControllerHandleBuffer;
 | 
			
		||||
 | 
			
		||||
  ShellStatus         = SHELL_SUCCESS;
 | 
			
		||||
  Status              = EFI_SUCCESS;
 | 
			
		||||
@ -226,6 +211,39 @@ ShellCommandRunDevTree (
 | 
			
		||||
        if (TheHandle == NULL){
 | 
			
		||||
          break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //
 | 
			
		||||
        // Skip handles that do not have device path protocol
 | 
			
		||||
        //
 | 
			
		||||
        Status = gBS->OpenProtocol (
 | 
			
		||||
                      TheHandle,
 | 
			
		||||
                      &gEfiDevicePathProtocolGuid,
 | 
			
		||||
                      NULL,
 | 
			
		||||
                      NULL,
 | 
			
		||||
                      NULL,
 | 
			
		||||
                      EFI_OPEN_PROTOCOL_TEST_PROTOCOL
 | 
			
		||||
                     );
 | 
			
		||||
        if (EFI_ERROR (Status)) {
 | 
			
		||||
          continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //
 | 
			
		||||
        // Skip handles that do have parents
 | 
			
		||||
        //
 | 
			
		||||
        ParentControllerHandleBuffer = NULL;
 | 
			
		||||
        Status = PARSE_HANDLE_DATABASE_PARENTS (
 | 
			
		||||
                   TheHandle,
 | 
			
		||||
                   &ParentControllerHandleCount,
 | 
			
		||||
                   &ParentControllerHandleBuffer
 | 
			
		||||
                   );
 | 
			
		||||
        SHELL_FREE_NON_NULL (ParentControllerHandleBuffer);
 | 
			
		||||
        if (ParentControllerHandleCount > 0) {
 | 
			
		||||
          continue;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        //
 | 
			
		||||
        // Start a devtree from TheHandle that has a device path and no parents
 | 
			
		||||
        //
 | 
			
		||||
        ShellStatus = DoDevTreeForHandle(TheHandle, Language, FlagD, 0, HiiString);
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
/** @file
 | 
			
		||||
  Main file for Dh shell Driver1 function.
 | 
			
		||||
 | 
			
		||||
  Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
 | 
			
		||||
  Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR>
 | 
			
		||||
  This program and the accompanying materials
 | 
			
		||||
  are licensed and made available under the terms and conditions of the BSD License
 | 
			
		||||
  which accompanies this distribution.  The full text of the license may be found at
 | 
			
		||||
@ -394,11 +394,14 @@ DisplayDriverModelHandle (
 | 
			
		||||
                  Language,
 | 
			
		||||
                  &DriverName
 | 
			
		||||
                  );
 | 
			
		||||
        if (DriverName == NULL) {
 | 
			
		||||
        if (EFI_ERROR (Status)) {
 | 
			
		||||
          Status = GetDriverImageName (
 | 
			
		||||
                    DriverBindingHandleBuffer[Index],
 | 
			
		||||
                    &DriverName
 | 
			
		||||
                    );
 | 
			
		||||
          if (EFI_ERROR (Status)) {
 | 
			
		||||
            DriverName = NULL;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (Image) {
 | 
			
		||||
@ -537,6 +540,9 @@ DisplayDriverModelHandle (
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Status = GetDriverName (Handle, Language, &DriverName);
 | 
			
		||||
  if (EFI_ERROR (Status)) {
 | 
			
		||||
    DriverName = NULL;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  ShellPrintHiiEx(
 | 
			
		||||
    -1, 
 | 
			
		||||
@ -548,11 +554,13 @@ DisplayDriverModelHandle (
 | 
			
		||||
    DriverName!=NULL?DriverName:L"<Unknown>"
 | 
			
		||||
    );
 | 
			
		||||
  SHELL_FREE_NON_NULL(DriverName);
 | 
			
		||||
  DriverName = NULL;
 | 
			
		||||
  Status = GetDriverImageName (
 | 
			
		||||
            Handle,
 | 
			
		||||
            &DriverName
 | 
			
		||||
            );
 | 
			
		||||
  if (EFI_ERROR (Status)) {
 | 
			
		||||
    DriverName = NULL;
 | 
			
		||||
  }
 | 
			
		||||
  ShellPrintHiiEx(
 | 
			
		||||
    -1, 
 | 
			
		||||
    -1, 
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
/** @file
 | 
			
		||||
  Main file for Disconnect shell Driver1 function.
 | 
			
		||||
 | 
			
		||||
  Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
 | 
			
		||||
  Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR>
 | 
			
		||||
  This program and the accompanying materials
 | 
			
		||||
  are licensed and made available under the terms and conditions of the BSD License
 | 
			
		||||
  which accompanies this distribution.  The full text of the license may be found at
 | 
			
		||||
@ -163,10 +163,6 @@ ShellCommandRunDisconnect (
 | 
			
		||||
        } else if (Param3 != NULL && Handle3 == NULL) {
 | 
			
		||||
          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, Param3);
 | 
			
		||||
          ShellStatus = SHELL_INVALID_PARAMETER;
 | 
			
		||||
        } else if (EFI_ERROR(gBS->OpenProtocol(Handle1, &gEfiDevicePathProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {
 | 
			
		||||
          ASSERT(Param1 != NULL);
 | 
			
		||||
          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_HANDLE_NOT), gShellDriver1HiiHandle, ShellStrToUintn(Param1), L"controller handle");
 | 
			
		||||
          ShellStatus = SHELL_INVALID_PARAMETER;
 | 
			
		||||
        } else if (Handle2 != NULL && EFI_ERROR(gBS->OpenProtocol(Handle2, &gEfiDriverBindingProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {
 | 
			
		||||
          ASSERT(Param2 != NULL);
 | 
			
		||||
          ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_HANDLE_NOT), gShellDriver1HiiHandle, ShellStrToUintn(Param2), L"driver handle");
 | 
			
		||||
 | 
			
		||||
@ -48,6 +48,7 @@ TraverseHandleDatabase (
 | 
			
		||||
  CHAR16                              *TempString;
 | 
			
		||||
  UINTN                               HandleIndex;
 | 
			
		||||
  CONST CHAR16                        *Name;
 | 
			
		||||
  UINTN                               ControllerIndex;
 | 
			
		||||
 | 
			
		||||
  if (TheHandle == NULL) {
 | 
			
		||||
    return (EFI_INVALID_PARAMETER);
 | 
			
		||||
@ -98,9 +99,10 @@ TraverseHandleDatabase (
 | 
			
		||||
                                                        OpenTypeString = StringDriverEx;  break;
 | 
			
		||||
            default:                                    OpenTypeString = StringUnknown;   break;
 | 
			
		||||
          }
 | 
			
		||||
          HandleIndex = ConvertHandleToHandleIndex(OpenInfo[OpenInfoIndex].AgentHandle);
 | 
			
		||||
          Name        = GetStringNameFromHandle(OpenInfo[OpenInfoIndex].AgentHandle, NULL);
 | 
			
		||||
          if (OpenInfo[OpenInfoIndex].ControllerHandle!=NULL) {
 | 
			
		||||
          HandleIndex     = ConvertHandleToHandleIndex(OpenInfo[OpenInfoIndex].AgentHandle);
 | 
			
		||||
          Name            = GetStringNameFromHandle(OpenInfo[OpenInfoIndex].AgentHandle, NULL);
 | 
			
		||||
          ControllerIndex = ConvertHandleToHandleIndex(OpenInfo[OpenInfoIndex].ControllerHandle);
 | 
			
		||||
          if (ControllerIndex != 0) {
 | 
			
		||||
            ShellPrintHiiEx(
 | 
			
		||||
              -1,
 | 
			
		||||
              -1,
 | 
			
		||||
@ -108,7 +110,7 @@ TraverseHandleDatabase (
 | 
			
		||||
              STRING_TOKEN(STR_OPENINFO_LINE),
 | 
			
		||||
              gShellDriver1HiiHandle,
 | 
			
		||||
              HandleIndex,
 | 
			
		||||
              ConvertHandleToHandleIndex(OpenInfo[OpenInfoIndex].ControllerHandle),
 | 
			
		||||
              ControllerIndex,
 | 
			
		||||
              OpenInfo[OpenInfoIndex].OpenCount,
 | 
			
		||||
              OpenTypeString,
 | 
			
		||||
              Name
 | 
			
		||||
 | 
			
		||||
										
											Binary file not shown.
										
									
								
							
		Loading…
	
		Reference in New Issue
	
	Block a user