-/**\r
- Read a file.\r
- If ScanFs is FLASE, it will use this Vol as default Fs.\r
- If ScanFs is TRUE, it will scan all FS and check the file.\r
- If there is only one file match the name, it will be read.\r
- If there is more than one file match the name, it will return Error.\r
-\r
- @param[in] ThisVol File System Volume\r
- @param[in] FileName The file to be read.\r
- @param[out] BufferSize The file buffer size\r
- @param[out] Buffer The file buffer\r
- @param[in] ScanFs Need Scan all FS\r
-\r
- @retval EFI_SUCCESS Read file successfully\r
- @retval EFI_NOT_FOUND File not found\r
- @retval EFI_NO_MAPPING There is duplicated files found\r
-**/\r
-EFI_STATUS\r
-ReadFileToBufferEx (\r
- IN OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **ThisVol,\r
- IN CHAR16 *FileName,\r
- OUT UINTN *BufferSize,\r
- OUT VOID **Buffer,\r
- IN BOOLEAN ScanFs\r
- )\r
-{\r
- EFI_STATUS Status;\r
- EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Vol;\r
- UINTN TempBufferSize;\r
- VOID *TempBuffer;\r
- UINTN NoHandles;\r
- EFI_HANDLE *HandleBuffer;\r
- UINTN Index;\r
-\r
- //\r
- // Check parameters\r
- //\r
- if ((FileName == NULL) || (Buffer == NULL) || (ThisVol == NULL)) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
-\r
- //\r
- // not scan fs\r
- //\r
- if (!ScanFs) {\r
- if (*ThisVol == NULL) {\r
- *ThisVol = GetMyVol ();\r
- if (*ThisVol == NULL) {\r
- return EFI_INVALID_PARAMETER;\r
- }\r
- }\r
- //\r
- // Read file directly from Vol\r
- //\r
- return ReadFileFromVol (*ThisVol, FileName, BufferSize, Buffer);\r
- }\r
-\r
- //\r
- // need scan fs\r
- //\r
-\r
- //\r
- // Get all Vol handle\r
- //\r
- Status = gBS->LocateHandleBuffer (\r
- ByProtocol,\r
- &gEfiSimpleFileSystemProtocolGuid,\r
- NULL,\r
- &NoHandles,\r
- &HandleBuffer\r
- );\r
- if (EFI_ERROR (Status) && (NoHandles == 0)) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- //\r
- // Walk through each Vol\r
- //\r
- *ThisVol = NULL;\r
- *BufferSize = 0;\r
- *Buffer = NULL;\r
- for (Index = 0; Index < NoHandles; Index++) {\r
- Status = gBS->HandleProtocol (\r
- HandleBuffer[Index],\r
- &gEfiSimpleFileSystemProtocolGuid,\r
- (VOID **)&Vol\r
- );\r
- if (EFI_ERROR(Status)) {\r
- continue;\r
- }\r
-\r
- Status = ReadFileFromVol (Vol, FileName, &TempBufferSize, &TempBuffer);\r
- if (!EFI_ERROR (Status)) {\r
- //\r
- // Read file OK, check duplication\r
- //\r
- if (*ThisVol != NULL) {\r
- //\r
- // Find the duplicated file\r
- //\r
- gBS->FreePool (TempBuffer);\r
- gBS->FreePool (*Buffer);\r
- Print (L"Duplicated FileName found!\n");\r
- return EFI_NO_MAPPING;\r
- } else {\r
- //\r
- // Record value\r
- //\r
- *ThisVol = Vol;\r
- *BufferSize = TempBufferSize;\r
- *Buffer = TempBuffer;\r
- }\r
- }\r
- }\r
-\r
- //\r
- // Scan Fs done\r
- //\r
- if (*ThisVol == NULL) {\r
- return EFI_NOT_FOUND;\r
- }\r
-\r
- //\r
- // Done\r
- //\r
- return EFI_SUCCESS;\r
-}\r
-\r
-/**\r
- Read a file.\r
-\r
- @param[in] FileName The file to be read.\r
- @param[out] BufferSize The file buffer size\r
- @param[out] Buffer The file buffer\r
-\r
- @retval EFI_SUCCESS Read file successfully\r
- @retval EFI_NOT_FOUND File not found\r
-**/\r
-EFI_STATUS\r
-ReadFileToBuffer (\r
- IN CHAR16 *FileName,\r
- OUT UINTN *BufferSize,\r
- OUT VOID **Buffer\r
- )\r
-{\r
- EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Vol;\r
- Vol = NULL;\r
- return ReadFileToBufferEx(&Vol, FileName, BufferSize, Buffer, FALSE);\r
-}\r
-\r