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