+/**\r
+ Add mappings for any devices without one. Do not change any existing maps.\r
+\r
+ @retval EFI_SUCCESS The operation was successful.\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+ShellCommandUpdateMapping (\r
+ VOID\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_HANDLE *HandleList;\r
+ UINTN Count;\r
+ EFI_DEVICE_PATH_PROTOCOL **DevicePathList;\r
+ CHAR16 *NewDefaultName;\r
+ CHAR16 *NewConsistName;\r
+ EFI_DEVICE_PATH_PROTOCOL **ConsistMappingTable;\r
+\r
+ HandleList = NULL;\r
+ Status = EFI_SUCCESS;\r
+\r
+ //\r
+ // remove mappings that represent removed devices.\r
+ //\r
+\r
+ //\r
+ // Find each handle with Simple File System\r
+ //\r
+ HandleList = GetHandleListByProtocol(&gEfiSimpleFileSystemProtocolGuid);\r
+ if (HandleList != NULL) {\r
+ //\r
+ // Do a count of the handles\r
+ //\r
+ for (Count = 0 ; HandleList[Count] != NULL ; Count++);\r
+\r
+ //\r
+ // Get all Device Paths\r
+ //\r
+ DevicePathList = AllocateZeroPool(sizeof(EFI_DEVICE_PATH_PROTOCOL*) * Count);\r
+ if (DevicePathList == NULL) {\r
+ return (EFI_OUT_OF_RESOURCES);\r
+ }\r
+\r
+ for (Count = 0 ; HandleList[Count] != NULL ; Count++) {\r
+ DevicePathList[Count] = DevicePathFromHandle(HandleList[Count]);\r
+ }\r
+\r
+ //\r
+ // Sort all DevicePaths\r
+ //\r
+ PerformQuickSort(DevicePathList, Count, sizeof(EFI_DEVICE_PATH_PROTOCOL*), DevicePathCompare);\r
+\r
+ ShellCommandConsistMappingInitialize(&ConsistMappingTable);\r
+\r
+ //\r
+ // Assign new Mappings to remainders\r
+ //\r
+ for (Count = 0 ; !EFI_ERROR(Status) && HandleList[Count] != NULL && !EFI_ERROR(Status); Count++) {\r
+ //\r
+ // Skip ones that already have\r
+ //\r
+ if (gEfiShellProtocol->GetMapFromDevicePath(&DevicePathList[Count]) != NULL) {\r
+ continue;\r
+ }\r
+ //\r
+ // Get default name\r
+ //\r
+ NewDefaultName = ShellCommandCreateNewMappingName(MappingTypeFileSystem);\r
+ if (NewDefaultName == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Call shell protocol SetMap function now...\r
+ //\r
+ Status = gEfiShellProtocol->SetMap(DevicePathList[Count], NewDefaultName);\r
+\r
+ if (!EFI_ERROR(Status)) {\r
+ //\r
+ // Now do consistent name\r
+ //\r
+ NewConsistName = ShellCommandConsistMappingGenMappingName(DevicePathList[Count], ConsistMappingTable);\r
+ if (NewConsistName != NULL) {\r
+ Status = gEfiShellProtocol->SetMap(DevicePathList[Count], NewConsistName);\r
+ FreePool(NewConsistName);\r
+ }\r
+ }\r
+\r
+ FreePool(NewDefaultName);\r
+ }\r
+ ShellCommandConsistMappingUnInitialize(ConsistMappingTable);\r
+ SHELL_FREE_NON_NULL(HandleList);\r
+ SHELL_FREE_NON_NULL(DevicePathList);\r
+\r
+ HandleList = NULL;\r
+ } else {\r
+ Count = (UINTN)-1;\r
+ }\r
+ //\r
+ // Do it all over again for gEfiBlockIoProtocolGuid\r
+ //\r
+\r
+ return (Status);\r
+}\r
+\r