]> git.proxmox.com Git - mirror_edk2.git/blobdiff - ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.c
ShellPkg: Add protocols / protocol GUIDs to display and input mapping.
[mirror_edk2.git] / ShellPkg / Library / UefiHandleParsingLib / UefiHandleParsingLib.c
index 107b3354e553243cfefa9f22e10297f8f7adfc56..44ad4c0b55d6cc36e7ab8426b2c81bd3d4fb7a6d 100644 (file)
@@ -1,7 +1,7 @@
 /** @file\r
   Provides interface to advanced shell functionality for parsing both handle and protocol database.\r
 \r
-  Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>\r
+  Copyright (c) 2010 - 2012, Intel Corporation. All rights reserved.<BR>\r
   This program and the accompanying materials\r
   are licensed and made available under the terms and conditions of the BSD License\r
   which accompanies this distribution.  The full text of the license may be found at\r
 \r
 #include "UefiHandleParsingLib.h"\r
 \r
-\r
-STATIC CONST EFI_GUID mHandleParsingHiiGuid = \\r
-  { \\r
-  0xb8969637, 0x81de, 0x43af, { 0xbc, 0x9a, 0x24, 0xd9, 0x89, 0x13, 0xf2, 0xf6 } \\r
-  };\r
 EFI_HANDLE mHandleParsingHiiHandle;\r
 HANDLE_INDEX_LIST mHandleList = {{{NULL,NULL},0,0},0};\r
 \r
@@ -37,7 +32,7 @@ HandleParsingLibConstructor (
   IN EFI_SYSTEM_TABLE  *SystemTable\r
   )\r
 {\r
-  mHandleParsingHiiHandle = HiiAddPackages (&mHandleParsingHiiGuid, gImageHandle, UefiHandleParsingLibStrings, NULL);\r
+  mHandleParsingHiiHandle = HiiAddPackages (&gHandleParsingHiiGuid, gImageHandle, UefiHandleParsingLibStrings, NULL);\r
   if (mHandleParsingHiiHandle == NULL) {\r
     return (EFI_DEVICE_ERROR);\r
   }\r
@@ -211,8 +206,10 @@ TxtOutProtocolDumpInformation(
   RetVal = AllocateZeroPool(Size);\r
 \r
   Temp = HiiGetString(mHandleParsingHiiHandle, STRING_TOKEN(STR_TXT_OUT_DUMP_HEADER), NULL);\r
-  UnicodeSPrint(RetVal, Size, Temp, Dev, Dev->Mode->Attribute);\r
-  FreePool(Temp);\r
+  if (Temp != NULL) {\r
+    UnicodeSPrint(RetVal, Size, Temp, Dev, Dev->Mode->Attribute);\r
+    FreePool(Temp);\r
+  }\r
 \r
   //\r
   // Dump TextOut Info\r
@@ -224,7 +221,7 @@ TxtOutProtocolDumpInformation(
     UnicodeSPrint(\r
       RetVal + StrLen(RetVal),\r
       NewSize,\r
-      Temp,\r
+      Temp == NULL?L"":Temp,\r
       Index == Dev->Mode->Mode ? L'*' : L' ',\r
       Index,\r
       !EFI_ERROR(Status)?Col:-1,\r
@@ -265,7 +262,7 @@ DriverEfiVersionProtocolDumpInformation(
 \r
   ASSERT_EFI_ERROR(Status);\r
 \r
-  RetVal = AllocatePool(VersionStringSize);\r
+  RetVal = AllocateZeroPool(VersionStringSize);\r
   ASSERT(RetVal != NULL);\r
   UnicodeSPrint(RetVal, VersionStringSize, L"0x%08x", DriverEfiVersion->FirmwareVersion);\r
   return (RetVal);\r
@@ -306,7 +303,7 @@ DevicePathProtocolDumpInformation(
       gBS->CloseProtocol(TheHandle, &gEfiDevicePathProtocolGuid, gImageHandle, NULL);\r
     }\r
   }\r
-  if (Verbose && Temp != NULL && StrLen(Temp) > 30) {\r
+  if (!Verbose && Temp != NULL && StrLen(Temp) > 30) {\r
     Temp2 = NULL;\r
     Temp2 = StrnCatGrow(&Temp2, NULL, Temp+(StrLen(Temp) - 30), 30);\r
     FreePool(Temp);\r
@@ -336,14 +333,14 @@ STATIC CONST EFI_GUID WinNtThunkProtocolGuid = LOCAL_EFI_WIN_NT_THUNK_PROTOCOL_G
 STATIC CONST EFI_GUID WinNtIoProtocolGuid    = LOCAL_EFI_WIN_NT_BUS_DRIVER_IO_PROTOCOL_GUID;\r
 STATIC CONST EFI_GUID WinNtSerialPortGuid    = LOCAL_EFI_WIN_NT_SERIAL_PORT_GUID;\r
 \r
-STATIC CONST PROTOCOL_INFO_BLOCK mGuidStringListNT[] = {\r
+STATIC CONST GUID_INFO_BLOCK mGuidStringListNT[] = {\r
   {STRING_TOKEN(STR_WINNT_THUNK),           (EFI_GUID*)&WinNtThunkProtocolGuid,               NULL},\r
   {STRING_TOKEN(STR_WINNT_DRIVER_IO),       (EFI_GUID*)&WinNtIoProtocolGuid,                  NULL},\r
   {STRING_TOKEN(STR_WINNT_SERIAL_PORT),     (EFI_GUID*)&WinNtSerialPortGuid,                  NULL},\r
   {STRING_TOKEN(STR_UNKNOWN_DEVICE),        NULL,                                             NULL},\r
 };\r
 \r
-STATIC CONST PROTOCOL_INFO_BLOCK mGuidStringList[] = {\r
+STATIC CONST GUID_INFO_BLOCK mGuidStringList[] = {\r
   {STRING_TOKEN(STR_LOADED_IMAGE),          &gEfiLoadedImageProtocolGuid,                     NULL},\r
   {STRING_TOKEN(STR_DEVICE_PATH),           &gEfiDevicePathProtocolGuid,                      DevicePathProtocolDumpInformation},\r
   {STRING_TOKEN(STR_IMAGE_PATH),            &gEfiLoadedImageDevicePathProtocolGuid,           DevicePathProtocolDumpInformation},\r
@@ -379,8 +376,6 @@ STATIC CONST PROTOCOL_INFO_BLOCK mGuidStringList[] = {
   {STRING_TOKEN(STR_LOAD_FILE),             &gEfiLoadFileProtocolGuid,                        NULL},\r
   {STRING_TOKEN(STR_LOAD_FILE2),            &gEfiLoadFile2ProtocolGuid,                       NULL},\r
   {STRING_TOKEN(STR_SIMPLE_FILE_SYS),       &gEfiSimpleFileSystemProtocolGuid,                NULL},\r
-  {STRING_TOKEN(STR_FILE_INFO),             &gEfiFileInfoGuid,                                NULL},\r
-  {STRING_TOKEN(STR_FILE_SYS_INFO),         &gEfiFileSystemInfoGuid,                          NULL},\r
   {STRING_TOKEN(STR_TAPE_IO),               &gEfiTapeIoProtocolGuid,                          NULL},\r
   {STRING_TOKEN(STR_DISK_IO),               &gEfiDiskIoProtocolGuid,                          NULL},\r
   {STRING_TOKEN(STR_BLK_IO),                &gEfiBlockIoProtocolGuid,                         NULL},\r
@@ -419,7 +414,6 @@ STATIC CONST PROTOCOL_INFO_BLOCK mGuidStringList[] = {
   {STRING_TOKEN(STR_IPV4_CFG),              &gEfiIp4ConfigProtocolGuid,                       NULL},\r
   {STRING_TOKEN(STR_SHELL_PARAMETERS),      &gEfiShellParametersProtocolGuid,                 NULL},\r
   {STRING_TOKEN(STR_SHELL),                 &gEfiShellProtocolGuid,                           NULL},\r
-  {STRING_TOKEN(STR_EFI_GLOBAL_VARIABLE),   &gEfiGlobalVariableGuid,                          NULL},\r
   {STRING_TOKEN(STR_UDPV4_SB),              &gEfiUdp4ServiceBindingProtocolGuid,              NULL},\r
   {STRING_TOKEN(STR_UDPV4),                 &gEfiUdp4ProtocolGuid,                            NULL},\r
   {STRING_TOKEN(STR_MTFTPV4_SB),            &gEfiMtftp4ServiceBindingProtocolGuid,            NULL},\r
@@ -434,6 +428,14 @@ STATIC CONST PROTOCOL_INFO_BLOCK mGuidStringList[] = {
   {STRING_TOKEN(STR_HII_CONFIG_ROUT),       &gEfiHiiConfigRoutingProtocolGuid,                NULL},\r
   {STRING_TOKEN(STR_HII_CONFIG_ACC),        &gEfiHiiConfigAccessProtocolGuid,                 NULL},\r
   {STRING_TOKEN(STR_HII_FORM_BROWSER2),     &gEfiFormBrowser2ProtocolGuid,                    NULL},\r
+  {STRING_TOKEN(STR_DRIVER_FAM_OVERRIDE),   &gEfiDriverFamilyOverrideProtocolGuid,            NULL},\r
+  {STRING_TOKEN(STR_PCD),                   &gPcdProtocolGuid,                                NULL},\r
+  {STRING_TOKEN(STR_TCG),                   &gEfiTcgProtocolGuid,                             NULL},\r
+  {STRING_TOKEN(STR_HII_PACKAGE_LIST),      &gEfiHiiPackageListProtocolGuid,                  NULL},\r
+\r
+//\r
+// the ones under this are deprecated by the current UEFI Spec, but may be found anyways...\r
+//\r
   {STRING_TOKEN(STR_SHELL_INTERFACE),       &gEfiShellInterfaceGuid,                          NULL},\r
   {STRING_TOKEN(STR_SHELL_ENV2),            &gEfiShellEnvironment2Guid,                       NULL},\r
   {STRING_TOKEN(STR_SHELL_ENV),             &gEfiShellEnvironment2Guid,                       NULL},\r
@@ -444,6 +446,62 @@ STATIC CONST PROTOCOL_INFO_BLOCK mGuidStringList[] = {
   {STRING_TOKEN(STR_GPT_NBR),               &gEfiPartTypeLegacyMbrGuid,                       NULL},\r
   {STRING_TOKEN(STR_DRIVER_CONFIG),         &gEfiDriverConfigurationProtocolGuid,             NULL},\r
   {STRING_TOKEN(STR_DRIVER_CONFIG2),        &gEfiDriverConfiguration2ProtocolGuid,            NULL},\r
+\r
+//\r
+// the ones under this are GUID identified structs, not protocols\r
+//\r
+  {STRING_TOKEN(STR_FILE_INFO),             &gEfiFileInfoGuid,                                NULL},\r
+  {STRING_TOKEN(STR_FILE_SYS_INFO),         &gEfiFileSystemInfoGuid,                          NULL},\r
+\r
+//\r
+// the ones under this are misc GUIDS.\r
+//\r
+  {STRING_TOKEN(STR_EFI_GLOBAL_VARIABLE),   &gEfiGlobalVariableGuid,                          NULL},\r
+\r
+//\r
+// UEFI 2.2\r
+//\r
+  {STRING_TOKEN(STR_IP6_SB),                &gEfiIp6ServiceBindingProtocolGuid,               NULL},\r
+  {STRING_TOKEN(STR_IP6),                   &gEfiIp6ProtocolGuid,                             NULL},\r
+  {STRING_TOKEN(STR_IP6_CONFIG),            &gEfiIp6ConfigProtocolGuid,                       NULL},\r
+  {STRING_TOKEN(STR_MTFTP6_SB),             &gEfiMtftp6ServiceBindingProtocolGuid,            NULL},\r
+  {STRING_TOKEN(STR_MTFTP6),                &gEfiMtftp6ProtocolGuid,                          NULL},\r
+  {STRING_TOKEN(STR_DHCP6_SB),              &gEfiDhcp6ServiceBindingProtocolGuid,             NULL},\r
+  {STRING_TOKEN(STR_DHCP6),                 &gEfiDhcp6ProtocolGuid,                           NULL},\r
+  {STRING_TOKEN(STR_UDP6_SB),               &gEfiUdp6ServiceBindingProtocolGuid,              NULL},\r
+  {STRING_TOKEN(STR_UDP6),                  &gEfiUdp6ProtocolGuid,                            NULL},\r
+  {STRING_TOKEN(STR_TCP6_SB),               &gEfiTcp6ServiceBindingProtocolGuid,              NULL},\r
+  {STRING_TOKEN(STR_TCP6),                  &gEfiTcp6ProtocolGuid,                            NULL},\r
+  {STRING_TOKEN(STR_VLAN_CONFIG),           &gEfiVlanConfigProtocolGuid,                      NULL},\r
+  {STRING_TOKEN(STR_EAP),                   &gEfiEapProtocolGuid,                             NULL},\r
+  {STRING_TOKEN(STR_EAP_MGMT),              &gEfiEapManagementProtocolGuid,                   NULL},\r
+  {STRING_TOKEN(STR_FTP4_SB),               &gEfiFtp4ServiceBindingProtocolGuid,              NULL},\r
+  {STRING_TOKEN(STR_FTP4),                  &gEfiFtp4ProtocolGuid,                            NULL},\r
+  {STRING_TOKEN(STR_IP_SEC_CONFIG),         &gEfiIpSecConfigProtocolGuid,                     NULL},\r
+  {STRING_TOKEN(STR_DH),                    &gEfiDriverHealthProtocolGuid,                    NULL},\r
+  {STRING_TOKEN(STR_DEF_IMG_LOAD),          &gEfiDeferredImageLoadProtocolGuid,               NULL},\r
+  {STRING_TOKEN(STR_USER_CRED),             &gEfiUserCredentialProtocolGuid,                  NULL},\r
+  {STRING_TOKEN(STR_USER_MNGR),             &gEfiUserManagerProtocolGuid,                     NULL},\r
+  {STRING_TOKEN(STR_ATA_PASS_THRU),         &gEfiAtaPassThruProtocolGuid,                     NULL},\r
+\r
+//\r
+// UEFI 2.3\r
+//\r
+  {STRING_TOKEN(STR_FW_MGMT),               &gEfiFirmwareManagementProtocolGuid,              NULL},\r
+  {STRING_TOKEN(STR_IP_SEC),                &gEfiIpSecProtocolGuid,                           NULL},\r
+  {STRING_TOKEN(STR_IP_SEC2),               &gEfiIpSec2ProtocolGuid,                          NULL},\r
+\r
+//\r
+// UEFI 2.3.1\r
+//\r
+  {STRING_TOKEN(STR_KMS),                   &gEfiKmsProtocolGuid,                             NULL},\r
+  {STRING_TOKEN(STR_BLK_IO2),               &gEfiBlockIo2ProtocolGuid,                        NULL},\r
+  {STRING_TOKEN(STR_SSC),                   &gEfiStorageSecurityCommandProtocolGuid,          NULL},\r
+  {STRING_TOKEN(STR_UC2),                   &gEfiUserCredential2ProtocolGuid,                 NULL},\r
+\r
+//\r
+// terminator\r
+//\r
   {STRING_TOKEN(STR_UNKNOWN_DEVICE),        NULL,                                             NULL},\r
 };\r
 \r
@@ -456,13 +514,13 @@ STATIC CONST PROTOCOL_INFO_BLOCK mGuidStringList[] = {
 \r
   @return                       The node.\r
 **/\r
-CONST PROTOCOL_INFO_BLOCK *\r
+CONST GUID_INFO_BLOCK *\r
 EFIAPI\r
 InternalShellGetNodeFromGuid(\r
   IN CONST EFI_GUID* Guid\r
   )\r
 {\r
-  CONST PROTOCOL_INFO_BLOCK *ListWalker;\r
+  CONST GUID_INFO_BLOCK *ListWalker;\r
 \r
   ASSERT(Guid != NULL);\r
 \r
@@ -499,7 +557,7 @@ GetStringNameFromGuid(
   IN CONST CHAR8    *Lang OPTIONAL\r
   )\r
 {\r
-  CONST PROTOCOL_INFO_BLOCK *Id;\r
+  CONST GUID_INFO_BLOCK *Id;\r
 \r
   Id = InternalShellGetNodeFromGuid(Guid);\r
   return (HiiGetString(mHandleParsingHiiHandle, Id->StringId, Lang));\r
@@ -529,7 +587,7 @@ GetProtocolInformationDump(
   IN CONST BOOLEAN    Verbose\r
   )\r
 {\r
-  CONST PROTOCOL_INFO_BLOCK *Id;\r
+  CONST GUID_INFO_BLOCK *Id;\r
 \r
   ASSERT(TheHandle  != NULL);\r
   ASSERT(Guid       != NULL);\r
@@ -562,7 +620,7 @@ GetGuidFromStringName(
   IN EFI_GUID     **Guid\r
   )\r
 {\r
-  CONST PROTOCOL_INFO_BLOCK  *ListWalker;\r
+  CONST GUID_INFO_BLOCK  *ListWalker;\r
   CHAR16                     *String;\r
 \r
   ASSERT(Guid != NULL);\r
@@ -680,7 +738,7 @@ InternalShellInitHandleList(
     return (Status);\r
   }\r
   for (mHandleList.NextIndex = 1 ; mHandleList.NextIndex <= HandleCount ; mHandleList.NextIndex++){\r
-    ListWalker = AllocatePool(sizeof(HANDLE_LIST));\r
+    ListWalker = AllocateZeroPool(sizeof(HANDLE_LIST));\r
     ASSERT(ListWalker != NULL);\r
     ListWalker->TheHandle = HandleBuffer[mHandleList.NextIndex-1];\r
     ListWalker->TheIndex  = mHandleList.NextIndex;\r
@@ -708,7 +766,9 @@ ConvertHandleToHandleIndex(
   )\r
 {\r
   HANDLE_LIST *ListWalker;\r
-  ASSERT(TheHandle!=NULL);\r
+  if (TheHandle == NULL) {\r
+    return 0;\r
+  }\r
 \r
   InternalShellInitHandleList();\r
 \r
@@ -720,7 +780,7 @@ ConvertHandleToHandleIndex(
       return (ListWalker->TheIndex);\r
     }\r
   }\r
-  ListWalker = AllocatePool(sizeof(HANDLE_LIST));\r
+  ListWalker = AllocateZeroPool(sizeof(HANDLE_LIST));\r
   ASSERT(ListWalker != NULL);\r
   ListWalker->TheHandle = TheHandle;\r
   ListWalker->TheIndex  = mHandleList.NextIndex++;\r
@@ -1038,7 +1098,7 @@ ParseHandleDatabaseByRelationship (
         //\r
         // Allocate a handle buffer for the number of handles that matched the attributes in Mask\r
         //\r
-        *MatchingHandleBuffer = AllocatePool ((*MatchingHandleCount +1)* sizeof (EFI_HANDLE));\r
+        *MatchingHandleBuffer = AllocateZeroPool ((*MatchingHandleCount +1)* sizeof (EFI_HANDLE));\r
         ASSERT(*MatchingHandleBuffer != NULL);\r
 \r
         for (HandleIndex = 0,*MatchingHandleCount = 0\r
@@ -1095,17 +1155,20 @@ ParseHandleDatabaseForChildControllers(
   )\r
 {\r
   EFI_STATUS  Status;\r
-  UINTN       HandleIndex;\r
+//  UINTN       HandleIndex;\r
   UINTN       DriverBindingHandleCount;\r
   EFI_HANDLE  *DriverBindingHandleBuffer;\r
   UINTN       DriverBindingHandleIndex;\r
   UINTN       ChildControllerHandleCount;\r
   EFI_HANDLE  *ChildControllerHandleBuffer;\r
   UINTN       ChildControllerHandleIndex;\r
-  BOOLEAN     Found;\r
+//  BOOLEAN     Found;\r
   EFI_HANDLE  *HandleBufferForReturn;\r
 \r
-  ASSERT (MatchingHandleCount != NULL);\r
+  if (MatchingHandleCount == NULL) {\r
+    return (EFI_INVALID_PARAMETER);\r
+  }\r
+  *MatchingHandleCount = 0;\r
 \r
   Status = PARSE_HANDLE_DATABASE_UEFI_DRIVERS (\r
             ControllerHandle,\r
@@ -1116,13 +1179,15 @@ ParseHandleDatabaseForChildControllers(
     return Status;\r
   }\r
 \r
-  HandleBufferForReturn = GetHandleListByProtocol(&gEfiDriverBindingProtocolGuid);\r
+  //\r
+  // Get a buffer big enough for all the controllers.\r
+  //\r
+  HandleBufferForReturn = GetHandleListByProtocol(&gEfiDevicePathProtocolGuid);\r
   if (HandleBufferForReturn == NULL) {\r
     FreePool (DriverBindingHandleBuffer);\r
-    return Status;\r
+    return (EFI_NOT_FOUND);\r
   }\r
 \r
-  *MatchingHandleCount = 0;\r
   for (DriverBindingHandleIndex = 0; DriverBindingHandleIndex < DriverBindingHandleCount; DriverBindingHandleIndex++) {\r
     Status = PARSE_HANDLE_DATABASE_MANAGED_CHILDREN (\r
               DriverBindingHandleBuffer[DriverBindingHandleIndex],\r
@@ -1138,17 +1203,18 @@ ParseHandleDatabaseForChildControllers(
          ChildControllerHandleIndex < ChildControllerHandleCount;\r
          ChildControllerHandleIndex++\r
        ) {\r
-      Found = FALSE;\r
-      for (HandleIndex = 0; HandleBufferForReturn[HandleIndex] != NULL; HandleIndex++) {\r
-        if (HandleBufferForReturn[HandleIndex] == ChildControllerHandleBuffer[ChildControllerHandleIndex]) {\r
-          Found = TRUE;\r
-          break;\r
-        }\r
-      }\r
-\r
-      if (!Found) {\r
-        HandleBufferForReturn[(*MatchingHandleCount)++] = ChildControllerHandleBuffer[ChildControllerHandleIndex];\r
-      }\r
+//      Found = FALSE;\r
+      HandleBufferForReturn[(*MatchingHandleCount)++] = ChildControllerHandleBuffer[ChildControllerHandleIndex];\r
+//      for (HandleIndex = 0; HandleBufferForReturn[HandleIndex] != NULL; HandleIndex++) {\r
+//        if (HandleBufferForReturn[HandleIndex] == ChildControllerHandleBuffer[ChildControllerHandleIndex]) {\r
+//          Found = TRUE;\r
+//          break;\r
+//        }\r
+//      }\r
+\r
+//      if (Found) {\r
+//        HandleBufferForReturn[(*MatchingHandleCount)++] = ChildControllerHandleBuffer[ChildControllerHandleIndex];\r
+//      }\r
     }\r
 \r
     FreePool (ChildControllerHandleBuffer);\r
@@ -1171,10 +1237,10 @@ ParseHandleDatabaseForChildControllers(
 \r
   If DestinationBuffer is NULL, then ASSERT().\r
 \r
-  @param[in,out]  DestinationBuffer The pointer to the pointer to the buffer to append onto.\r
-  @param[in,out]  DestinationSize   The pointer to the size of DestinationBuffer.\r
-  @param[in]      SourceBuffer      The pointer to the buffer to append onto DestinationBuffer.\r
-  @param[in]      SourceSize        The number of bytes of SourceBuffer to append.\r
+  @param[in, out]  DestinationBuffer The pointer to the pointer to the buffer to append onto.\r
+  @param[in, out]  DestinationSize   The pointer to the size of DestinationBuffer.\r
+  @param[in]       SourceBuffer      The pointer to the buffer to append onto DestinationBuffer.\r
+  @param[in]       SourceSize        The number of bytes of SourceBuffer to append.\r
 \r
   @retval NULL                      A memory allocation failed.\r
   @retval NULL                      A parameter was invalid.\r
@@ -1212,7 +1278,7 @@ BuffernCatGrow (
 \r
   if (LocalDestinationSize == 0) {\r
     // allcoate\r
-    *DestinationBuffer = AllocatePool(LocalDestinationFinalSize);\r
+    *DestinationBuffer = AllocateZeroPool(LocalDestinationFinalSize);\r
   } else {\r
     // reallocate\r
     *DestinationBuffer = ReallocatePool(LocalDestinationSize, LocalDestinationFinalSize, *DestinationBuffer);\r
@@ -1328,7 +1394,7 @@ GetHandleListByProtocol (
   if (ProtocolGuid == NULL) {\r
     Status = gBS->LocateHandle(AllHandles, NULL, NULL, &Size, HandleList);\r
     if (Status == EFI_BUFFER_TOO_SMALL) {\r
-      HandleList = AllocatePool(Size + sizeof(EFI_HANDLE));\r
+      HandleList = AllocateZeroPool(Size + sizeof(EFI_HANDLE));\r
       if (HandleList == NULL) {\r
         return (NULL);\r
       }\r
@@ -1338,7 +1404,7 @@ GetHandleListByProtocol (
   } else {\r
     Status = gBS->LocateHandle(ByProtocol, (EFI_GUID*)ProtocolGuid, NULL, &Size, HandleList);\r
     if (Status == EFI_BUFFER_TOO_SMALL) {\r
-      HandleList = AllocatePool(Size + sizeof(EFI_HANDLE));\r
+      HandleList = AllocateZeroPool(Size + sizeof(EFI_HANDLE));\r
       if (HandleList == NULL) {\r
         return (NULL);\r
       }\r
@@ -1361,7 +1427,8 @@ GetHandleListByProtocol (
   @param[in] ProtocolGuids  A NULL terminated list of protocol GUIDs.\r
 \r
   @retval NULL              A memory allocation failed.\r
-  @return                   A NULL terminated list of handles.\r
+  @retval NULL              ProtocolGuids was NULL.\r
+  @return                   A NULL terminated list of EFI_HANDLEs.\r
 **/\r
 EFI_HANDLE*\r
 EFIAPI\r
@@ -1397,7 +1464,6 @@ GetHandleListByProtocolList (
   }\r
 \r
   HandleList = AllocateZeroPool(TotalSize);\r
-  ASSERT(HandleList != NULL);\r
   if (HandleList == NULL) {\r
     return (NULL);\r
   }\r
@@ -1405,16 +1471,16 @@ GetHandleListByProtocolList (
   Size = 0;\r
   for (GuidWalker = ProtocolGuids ; GuidWalker != NULL && *GuidWalker != NULL ; GuidWalker++){\r
     TempSize = TotalSize - Size;\r
-    Status = gBS->LocateHandle(ByProtocol, (EFI_GUID*)(*GuidWalker), NULL, &TempSize, HandleList+((TotalSize - Size)/sizeof(EFI_HANDLE)));\r
+    Status = gBS->LocateHandle(ByProtocol, (EFI_GUID*)(*GuidWalker), NULL, &TempSize, HandleList+(Size/sizeof(EFI_HANDLE)));\r
 \r
     //\r
     // Allow for missing protocols... Only update the 'used' size upon success.\r
     //\r
     if (!EFI_ERROR(Status)) {\r
-      Size = TempSize;\r
+      Size += TempSize;\r
     }\r
   }\r
-  HandleList[(TotalSize/sizeof(EFI_HANDLE))-1] = NULL;\r
+  ASSERT(HandleList[(TotalSize/sizeof(EFI_HANDLE))-1] == NULL);\r
 \r
   for (HandleWalker1 = HandleList ; HandleWalker1 != NULL && *HandleWalker1 != NULL ; HandleWalker1++) {\r
     for (HandleWalker2 = HandleWalker1 + 1; HandleWalker2 != NULL && *HandleWalker2 != NULL ; HandleWalker2++) {\r