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; }
/** Return information about a file or a file system. @param[in] This A pointer to the EFI_FILE_PROTOCOL instance that is the file handle the requested information is for. @param[in] InformationType The type identifier for the information being requested : EFI_FILE_INFO_ID or EFI_FILE_SYSTEM_INFO_ID or EFI_FILE_SYSTEM_VOLUME_LABEL_ID @param[in out] BufferSize The size, in bytes, of Buffer. @param[out] Buffer A pointer to the data buffer to return. The type of the data inside the buffer is indicated by InformationType. @retval EFI_SUCCESS The information was returned. @retval EFI_UNSUPPORTED The InformationType is not known. @retval EFI_BUFFER_TOO_SMALL The BufferSize is too small to return the information. BufferSize has been updated with the size needed to complete the request. @retval EFI_INVALID_PARAMETER The parameter "This" or "InformationType" or "BufferSize" is NULL or "Buffer" is NULL and "*Buffersize" is greater than 0. **/ EFI_STATUS FileGetInfo ( IN EFI_FILE *This, IN EFI_GUID *InformationType, IN OUT UINTN *BufferSize, OUT VOID *Buffer ) { SEMIHOST_FCB *Fcb; EFI_STATUS Status; UINTN ResultSize; if ((This == NULL) || (InformationType == NULL) || (BufferSize == NULL) || ((Buffer == NULL) && (*BufferSize > 0)) ) { return EFI_INVALID_PARAMETER; } Fcb = SEMIHOST_FCB_FROM_THIS(This); if (CompareGuid (InformationType, &gEfiFileSystemInfoGuid)) { Status = GetFilesystemInfo (Fcb, BufferSize, Buffer); } else if (CompareGuid (InformationType, &gEfiFileInfoGuid)) { Status = GetFileInfo (Fcb, BufferSize, Buffer); } else if (CompareGuid (InformationType, &gEfiFileSystemVolumeLabelInfoIdGuid)) { ResultSize = StrSize (mSemihostFsLabel); if (*BufferSize >= ResultSize) { StrCpy (Buffer, mSemihostFsLabel); Status = EFI_SUCCESS; } else { Status = EFI_BUFFER_TOO_SMALL; } *BufferSize = ResultSize; } else { Status = EFI_UNSUPPORTED; } return Status; }
EFI_STATUS FileGetInfo ( IN EFI_FILE *File, IN EFI_GUID *InformationType, IN OUT UINTN *BufferSize, OUT VOID *Buffer ) { SEMIHOST_FCB *Fcb = NULL; EFI_STATUS Status = EFI_UNSUPPORTED; Fcb = SEMIHOST_FCB_FROM_THIS(File); if (CompareGuid(InformationType, &gEfiFileSystemInfoGuid) != 0) { Status = GetFilesystemInfo(Fcb, BufferSize, Buffer); } else if (CompareGuid(InformationType, &gEfiFileInfoGuid) != 0) { Status = GetFileInfo(Fcb, BufferSize, Buffer); } return Status; }