/** UEFI application entry point which has an interface similar to a standard C main function. The ShellCEntryLib library instance wrappers the actual UEFI application entry point and calls this ShellAppMain function. @param Argc Argument count @param Argv The parsed arguments @retval 0 The application exited normally. @retval Other An error occurred. **/ INTN EFIAPI ShellAppMain ( IN UINTN Argc, IN CHAR16 **Argv ) { INTN Array[10]; Array[0] = 2; Array[1] = 3; Array[2] = 4; Array[3] = 1; Array[4] = 5; Array[5] = 6; Array[6] = 7; Array[7] = 8; Array[8] = 1; Array[9] = 5; Print(L"Array = %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\r\n", Array[0],Array[1],Array[2],Array[3],Array[4],Array[5],Array[6],Array[7],Array[8],Array[9]); PerformQuickSort(Array, 10, sizeof(INTN), Test); Print(L"POST-SORT\r\n"); Print(L"Array = %d, %d, %d, %d, %d, %d, %d, %d, %d, %d\r\n", Array[0],Array[1],Array[2],Array[3],Array[4],Array[5],Array[6],Array[7],Array[8],Array[9]); return 0; }
/** Sort the load option. The DriverOrder or BootOrder will be re-created to reflect the new order. @param OptionType Load option type @param CompareFunction The comparator **/ VOID EFIAPI EfiBootManagerSortLoadOptionVariable ( EFI_BOOT_MANAGER_LOAD_OPTION_TYPE OptionType, SORT_COMPARE CompareFunction ) { EFI_STATUS Status; EFI_BOOT_MANAGER_LOAD_OPTION *LoadOption; UINTN LoadOptionCount; UINTN Index; UINT16 *OptionOrder; LoadOption = EfiBootManagerGetLoadOptions (&LoadOptionCount, OptionType); // // Insertion sort algorithm // PerformQuickSort ( LoadOption, LoadOptionCount, sizeof (EFI_BOOT_MANAGER_LOAD_OPTION), CompareFunction ); // // Create new ****Order variable // OptionOrder = AllocatePool (LoadOptionCount * sizeof (UINT16)); ASSERT (OptionOrder != NULL); for (Index = 0; Index < LoadOptionCount; Index++) { OptionOrder[Index] = (UINT16) LoadOption[Index].OptionNumber; } Status = gRT->SetVariable ( mBmLoadOptionOrderName[OptionType], &gEfiGlobalVariableGuid, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE, LoadOptionCount * sizeof (UINT16), OptionOrder ); // // Changing the *Order content without increasing its size with current variable implementation shouldn't fail. // ASSERT_EFI_ERROR (Status); FreePool (OptionOrder); EfiBootManagerFreeLoadOptions (LoadOption, LoadOptionCount); }
/** Function to initialize the table for creating consistent map names. @param[out] Table The pointer to pointer to pointer to DevicePathProtocol object. @retval EFI_SUCCESS The table was created successfully. **/ EFI_STATUS EFIAPI ShellCommandConsistMappingInitialize ( OUT EFI_DEVICE_PATH_PROTOCOL ***Table ) { EFI_HANDLE *HandleBuffer; UINTN HandleNum; UINTN HandleLoop; EFI_DEVICE_PATH_PROTOCOL **TempTable; EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_DEVICE_PATH_PROTOCOL *HIDevicePath; UINTN Index; EFI_STATUS Status; HandleBuffer = NULL; Status = gBS->LocateHandleBuffer ( AllHandles, NULL, NULL, &HandleNum, &HandleBuffer ); ASSERT_EFI_ERROR(Status); TempTable = AllocateZeroPool ((HandleNum + 1) * sizeof (EFI_DEVICE_PATH_PROTOCOL *)); if (TempTable == NULL) { return EFI_OUT_OF_RESOURCES; } for (HandleLoop = 0 ; HandleLoop < HandleNum ; HandleLoop++) { DevicePath = DevicePathFromHandle (HandleBuffer[HandleLoop]); if (DevicePath == NULL) { continue; } HIDevicePath = GetHIDevicePath (DevicePath); if (HIDevicePath == NULL) { continue; } for (Index = 0; TempTable[Index] != NULL; Index++) { if (DevicePathCompare (&TempTable[Index], &HIDevicePath) == 0) { FreePool (HIDevicePath); break; } } if (TempTable[Index] == NULL) { TempTable[Index] = HIDevicePath; } } for (Index = 0; TempTable[Index] != NULL; Index++); PerformQuickSort(TempTable, Index, sizeof(EFI_DEVICE_PATH_PROTOCOL*), DevicePathCompare); *Table = TempTable; if (HandleBuffer != NULL) { FreePool (HandleBuffer); } return EFI_SUCCESS; }
/** Dump capsule information from disk. @param[in] Fs The device path of disk. @param[in] DumpCapsuleInfo The flag to indicate whether to dump the capsule inforomation. @retval EFI_SUCCESS The capsule information is dumped. **/ EFI_STATUS DumpCapsuleFromDisk ( IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs, IN BOOLEAN DumpCapsuleInfo ) { EFI_STATUS Status; EFI_FILE *Root; EFI_FILE *DirHandle; EFI_FILE *FileHandle; UINTN Index; UINTN FileSize; VOID *FileBuffer; EFI_FILE_INFO **FileInfoBuffer; EFI_FILE_INFO *FileInfo; UINTN FileCount; BOOLEAN NoFile; DirHandle = NULL; FileHandle = NULL; Index = 0; FileInfoBuffer = NULL; FileInfo = NULL; FileCount = 0; NoFile = FALSE; Status = Fs->OpenVolume (Fs, &Root); if (EFI_ERROR (Status)) { Print (L"Cannot open volume. Status = %r\n", Status); goto Done; } Status = Root->Open (Root, &DirHandle, EFI_CAPSULE_FILE_DIRECTORY, EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE , 0); if (EFI_ERROR (Status)) { Print (L"Cannot open %s. Status = %r\n", EFI_CAPSULE_FILE_DIRECTORY, Status); goto Done; } // // Get file count first // do { Status = FileHandleFindFirstFile (DirHandle, &FileInfo); if (EFI_ERROR (Status) || FileInfo == NULL) { Print (L"Get File Info Fail. Status = %r\n", Status); goto Done; } if ((FileInfo->Attribute & (EFI_FILE_SYSTEM | EFI_FILE_ARCHIVE)) != 0) { FileCount++; } Status = FileHandleFindNextFile (DirHandle, FileInfo, &NoFile); if (EFI_ERROR (Status)) { Print (L"Get Next File Fail. Status = %r\n", Status); goto Done; } } while (!NoFile); if (FileCount == 0) { Print (L"Error: No capsule file found!\n"); Status = EFI_NOT_FOUND; goto Done; } FileInfoBuffer = AllocateZeroPool (sizeof (FileInfo) * FileCount); if (FileInfoBuffer == NULL) { Status = EFI_OUT_OF_RESOURCES; goto Done; } NoFile = FALSE; // // Get all file info // do { Status = FileHandleFindFirstFile (DirHandle, &FileInfo); if (EFI_ERROR (Status) || FileInfo == NULL) { Print (L"Get File Info Fail. Status = %r\n", Status); goto Done; } if ((FileInfo->Attribute & (EFI_FILE_SYSTEM | EFI_FILE_ARCHIVE)) != 0) { FileInfoBuffer[Index++] = AllocateCopyPool ((UINTN)FileInfo->Size, FileInfo); } Status = FileHandleFindNextFile (DirHandle, FileInfo, &NoFile); if (EFI_ERROR (Status)) { Print (L"Get Next File Fail. Status = %r\n", Status); goto Done; } } while (!NoFile); // // Sort FileInfoBuffer by alphabet order // PerformQuickSort ( FileInfoBuffer, FileCount, sizeof (FileInfo), (SORT_COMPARE) CompareFileNameInAlphabet ); Print (L"The capsules will be performed by following order:\n"); for (Index = 0; Index < FileCount; Index++) { Print (L" %d.%s\n", Index + 1, FileInfoBuffer[Index]->FileName); } if (!DumpCapsuleInfo) { Status = EFI_SUCCESS; goto Done; } Print(L"The infomation of the capsules:\n"); for (Index = 0; Index < FileCount; Index++) { FileHandle = NULL; Status = DirHandle->Open (DirHandle, &FileHandle, FileInfoBuffer[Index]->FileName, EFI_FILE_MODE_READ, 0); if (EFI_ERROR (Status)) { goto Done; } Status = FileHandleGetSize (FileHandle, (UINT64 *) &FileSize); if (EFI_ERROR (Status)) { Print (L"Cannot read file %s. Status = %r\n", FileInfoBuffer[Index]->FileName, Status); FileHandleClose (FileHandle); goto Done; } FileBuffer = AllocatePool (FileSize); if (FileBuffer == NULL) { Status = EFI_OUT_OF_RESOURCES; goto Done; } Status = FileHandleRead (FileHandle, &FileSize, FileBuffer); if (EFI_ERROR (Status)) { Print (L"Cannot read file %s. Status = %r\n", FileInfoBuffer[Index]->FileName, Status); FileHandleClose (FileHandle); FreePool (FileBuffer); goto Done; } Print (L"**************************\n"); Print (L" %d.%s:\n", Index + 1, FileInfoBuffer[Index]->FileName); Print (L"**************************\n"); DumpCapsuleFromBuffer ((EFI_CAPSULE_HEADER *) FileBuffer); FileHandleClose (FileHandle); FreePool (FileBuffer); } Done: if (FileInfoBuffer != NULL) { for (Index = 0; Index < FileCount; Index++) { if (FileInfoBuffer[Index] != NULL) { FreePool (FileInfoBuffer[Index]); } } FreePool (FileInfoBuffer); } return Status; }