EFIAPI EFI_STATUS BootMonFsGetInfo ( IN EFI_FILE_PROTOCOL *This, IN EFI_GUID *InformationType, IN OUT UINTN *BufferSize, OUT VOID *Buffer ) { EFI_STATUS Status; BOOTMON_FS_FILE *File; BOOTMON_FS_INSTANCE *Instance; if ((This == NULL) || (InformationType == NULL) || (BufferSize == NULL) || ((Buffer == NULL) && (*BufferSize > 0)) ) { return EFI_INVALID_PARAMETER; } File = BOOTMON_FS_FILE_FROM_FILE_THIS (This); if (File->Info == NULL) { return EFI_INVALID_PARAMETER; } Instance = File->Instance; // If the instance has not been initialized yet then do it ... if (!Instance->Initialized) { Status = BootMonFsInitialize (Instance); } else { Status = EFI_SUCCESS; } if (!EFI_ERROR (Status)) { if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid) != 0) { Status = GetFileSystemVolumeLabelInfo (Instance, BufferSize, Buffer); } else if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid) != 0) { Status = GetFilesystemInfo (Instance, BufferSize, Buffer); } else if (CompareGuid (InformationType, &gEfiFileInfoGuid) != 0) { Status = GetFileInfo (Instance, File, BufferSize, Buffer); } else if (CompareGuid (InformationType, &gArmBootMonFsFileInfoGuid) != 0) { Status = GetBootMonFsFileInfo (Instance, File, BufferSize, Buffer); } else { Status = EFI_UNSUPPORTED; } } return Status; }
/** Opens a file on the Nor Flash FS volume Calls BootMonFsGetFileFromAsciiFilename to search the list of tracked files. @param This The EFI_FILE_PROTOCOL parent handle. @param NewHandle Double-pointer to the newly created protocol. @param FileName The name of the image/metadata on flash @param OpenMode Read,write,append etc @param Attributes ? @return EFI_STATUS OUT_OF_RESOURCES Run out of space to keep track of the allocated structures DEVICE_ERROR Unable to locate the volume associated with the parent file handle NOT_FOUND Filename wasn't found on flash SUCCESS **/ EFIAPI EFI_STATUS BootMonFsOpenFile ( IN EFI_FILE_PROTOCOL *This, OUT EFI_FILE_PROTOCOL **NewHandle, IN CHAR16 *FileName, IN UINT64 OpenMode, IN UINT64 Attributes ) { BOOTMON_FS_FILE *Directory; BOOTMON_FS_FILE *File; BOOTMON_FS_INSTANCE *Instance; CHAR8* AsciiFileName; EFI_STATUS Status; if ((FileName == NULL) || (NewHandle == NULL)) { return EFI_INVALID_PARAMETER; } // The only valid modes are read, read/write, and read/write/create if (!(OpenMode & EFI_FILE_MODE_READ) || ((OpenMode & EFI_FILE_MODE_CREATE) && !(OpenMode & EFI_FILE_MODE_WRITE))) { return EFI_INVALID_PARAMETER; } Directory = BOOTMON_FS_FILE_FROM_FILE_THIS (This); if (Directory == NULL) { return EFI_DEVICE_ERROR; } Instance = Directory->Instance; // If the instance has not been initialized it yet then do it ... if (!Instance->Initialized) { Status = BootMonFsInitialize (Instance); if (EFI_ERROR (Status)) { return Status; } } // BootMonFs interface requires ASCII filenames AsciiFileName = AllocatePool ((StrLen (FileName) + 1) * sizeof (CHAR8)); if (AsciiFileName == NULL) { return EFI_OUT_OF_RESOURCES; } UnicodeStrToAsciiStr (FileName, AsciiFileName); if ((AsciiStrCmp (AsciiFileName, "\\") == 0) || (AsciiStrCmp (AsciiFileName, "/") == 0) || (AsciiStrCmp (AsciiFileName, "") == 0) || (AsciiStrCmp (AsciiFileName, ".") == 0)) { // // Opening '/', '\', '.', or the NULL pathname is trying to open the root directory // *NewHandle = &Instance->RootFile->File; Instance->RootFile->Position = 0; Status = EFI_SUCCESS; } else { // // Open or Create a regular file // // Check if the file already exists Status = BootMonGetFileFromAsciiFileName (Instance, AsciiFileName, &File); if (Status == EFI_NOT_FOUND) { // The file doesn't exist. if (OpenMode & EFI_FILE_MODE_CREATE) { // If the file does not exist but is required then create it. if (Attributes & EFI_FILE_DIRECTORY) { // BootMonFS doesn't support subdirectories Status = EFI_UNSUPPORTED; } else { // Create a new file Status = CreateNewFile (Instance, AsciiFileName, &File); if (!EFI_ERROR (Status)) { File->OpenMode = OpenMode; *NewHandle = &File->File; File->Position = 0; } } } } else if (Status == EFI_SUCCESS) { // The file exists File->OpenMode = OpenMode; *NewHandle = &File->File; File->Position = 0; } } FreePool (AsciiFileName); return Status; }