4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_PROTOCOL wrappers for other items (Like Environment Variables,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StdIn, StdOut, StdErr, etc...).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.php
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "Shell.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "FileHandleInternal.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for console (Open).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] NewHandle Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] FileName Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpenMode Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Attributes Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceOpenNotFound(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_FILE_PROTOCOL **NewHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 *FileName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 OpenMode,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Attributes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_NOT_FOUND);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for console (Close, Delete, & Flush)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceNopGeneric(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for console (GetPosition).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Position Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceNopGetPosition(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT64 *Position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_UNSUPPORTED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for console (SetPosition).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Position Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceNopSetPosition(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_UNSUPPORTED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for console (GetInfo).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] InformationType Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] BufferSize Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Buffer Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceNopGetInfo(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GUID *InformationType,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_UNSUPPORTED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for console (SetInfo).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] InformationType Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] BufferSize Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Buffer Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceNopSetInfo(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GUID *InformationType,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_UNSUPPORTED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for StdOut (Write).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Writes data to the screen.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This The pointer to the EFI_FILE_PROTOCOL object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] BufferSize Size in bytes of Buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Buffer The pointer to the buffer to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED No output console is supported.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return A return value from gST->ConOut->OutputString.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceStdOutWrite(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoConsoleOut) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_UNSUPPORTED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (gST->ConOut->OutputString(gST->ConOut, Buffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for StdIn (Write).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] BufferSize Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Buffer Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceStdInWrite(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_UNSUPPORTED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for console StdErr (Write).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Writes error to the error output.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This The pointer to the EFI_FILE_PROTOCOL object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] BufferSize Size in bytes of Buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Buffer The pointer to the buffer to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return A return value from gST->StdErr->OutputString.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceStdErrWrite(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (gST->StdErr->OutputString(gST->StdErr, Buffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for console StdOut (Read).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] BufferSize Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Buffer Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceStdOutRead(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_UNSUPPORTED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for console StdErr (Read).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] BufferSize Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Buffer Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED Always.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceStdErrRead(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_UNSUPPORTED);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for NUL file (Read).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] BufferSize Poiner to 0 upon return.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Buffer Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Always.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceNulRead(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *BufferSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for NUL file (Write).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] BufferSize Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Buffer Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceNulWrite(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for console (Read).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This will return a single line of input from the console.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This A pointer to the EFI_FILE_PROTOCOL instance that is the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync file handle to read data from. Not used.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param BufferSize On input, the size of the Buffer. On output, the amount
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of data returned in Buffer. In both cases, the size is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync measured in bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer The buffer into which the data is read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The data was read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NO_MEDIA The device has no medium.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR The device reported an error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR An attempt was made to read from a deleted file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR On entry, the current file position is beyond the end of the file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BUFFER_TOO_SMALL The BufferSize is too small to read the current directory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync entry. BufferSize has been updated with the size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync needed to complete the request.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES A memory allocation failed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceStdInRead(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *CurrentString;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN Done;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Column; // Column of current cursor
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Row; // Row of current cursor
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN StartColumn; // Column at the beginning of the line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Update; // Line index for update
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Delete; // Num of chars to delete from console after update
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN StringLen; // Total length of the line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN StringCurPos; // Line index corresponding to the cursor
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN MaxStr; // Maximum possible line length
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN TotalColumn; // Num of columns in the console
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN TotalRow; // Num of rows in the console
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN SkipLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN OutputLength; // Length of the update string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN TailRow; // Row of end of line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN TailColumn; // Column of end of line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_INPUT_KEY Key;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BUFFER_LIST *LinePos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BUFFER_LIST *NewPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN InScrolling;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN InTabScrolling; // Whether in TAB-completion state
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SHELL_FILE_INFO *FoundFileList;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SHELL_FILE_INFO *TabLinePos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_SHELL_FILE_INFO *TempPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TabStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TabOutputStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN InQuotationMode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 *TempStr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN TabPos; // Start index of the string to search for TAB completion.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN TabUpdatePos; // Start index of the string updated by TAB stroke
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// UINTN Count;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN EventIndex;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONST CHAR16 *Cwd;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If buffer is not large enough to hold a CHAR16, return minimum buffer size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*BufferSize < sizeof (CHAR16) * 2) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *BufferSize = sizeof (CHAR16) * 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_BUFFER_TOO_SMALL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Done = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentString = Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringLen = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringCurPos = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OutputLength = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Update = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Delete = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LinePos = NewPos = (BUFFER_LIST*)(&ShellInfoObject.ViewingSettings.CommandHistory);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InScrolling = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InTabScrolling = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TabLinePos = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FoundFileList = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempPos = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TabPos = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TabUpdatePos = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate buffers
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TabStr = AllocateZeroPool (*BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TabStr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TabOutputStr = AllocateZeroPool (*BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TabOutputStr == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(TabStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_OUT_OF_RESOURCES;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the screen setting and the current cursor location
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Column = StartColumn = gST->ConOut->Mode->CursorColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row = gST->ConOut->Mode->CursorRow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->QueryMode (gST->ConOut, gST->ConOut->Mode->Mode, &TotalColumn, &TotalRow);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Limit the line length to the buffer size or the minimun size of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // screen. (The smaller takes effect)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MaxStr = TotalColumn * (TotalRow - 1) - StartColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (MaxStr > *BufferSize / sizeof (CHAR16)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MaxStr = *BufferSize / sizeof (CHAR16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ZeroMem (CurrentString, MaxStr * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Read a key
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Press PageUp or PageDown to scroll the history screen up or down.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Press any other key to quit scrolling.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Key.UnicodeChar == 0 && (Key.ScanCode == SCAN_PAGE_UP || Key.ScanCode == SCAN_PAGE_DOWN)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Key.ScanCode == SCAN_PAGE_UP) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConsoleLoggerDisplayHistory(FALSE, 0, ShellInfoObject.ConsoleInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else if (Key.ScanCode == SCAN_PAGE_DOWN) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConsoleLoggerDisplayHistory(TRUE, 0, ShellInfoObject.ConsoleInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InScrolling = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (InScrolling) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConsoleLoggerStopHistory(ShellInfoObject.ConsoleInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InScrolling = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If we are quitting TAB scrolling...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (InTabScrolling && Key.UnicodeChar != CHAR_TAB) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FoundFileList != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellInfoObject.NewEfiShellProtocol->FreeFileList (&FoundFileList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DEBUG_CODE(FoundFileList = NULL;);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InTabScrolling = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Key.UnicodeChar) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CHAR_CARRIAGE_RETURN:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // All done, print a newline at the end of the string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TailRow = Row + (StringLen - StringCurPos + Column) / TotalColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TailColumn = (StringLen - StringCurPos + Column) % TotalColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintEx ((INT32)TailColumn, (INT32)TailRow, L"%N\n");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Done = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CHAR_BACKSPACE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringCurPos != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If not move back beyond string beginning, move all characters behind
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // the current position one character forward
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringCurPos--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Update = StringCurPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Delete = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (CurrentString + StringCurPos, CurrentString + StringCurPos + 1, sizeof (CHAR16) * (StringLen - StringCurPos));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Adjust the current column and row
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MoveCursorBackward (TotalColumn, &Column, &Row);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case CHAR_TAB:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // handle auto complete of file and directory names...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (InTabScrolling) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(FoundFileList != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(TabLinePos != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TabLinePos = (EFI_SHELL_FILE_INFO*)GetNextNode(&(FoundFileList->Link), &TabLinePos->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNull(&(FoundFileList->Link), &TabLinePos->Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TabLinePos = (EFI_SHELL_FILE_INFO*)GetNextNode(&(FoundFileList->Link), &TabLinePos->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TabPos = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TabUpdatePos = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InQuotationMode = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (Index = 0; Index < StringLen; Index++) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentString[Index] == L'\"') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InQuotationMode = (BOOLEAN)(!InQuotationMode);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentString[Index] == L' ' && !InQuotationMode) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TabPos = Index + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TabUpdatePos = Index + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentString[Index] == L'\\') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TabUpdatePos = Index + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrStr(CurrentString + TabPos, L":") == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cwd = ShellInfoObject.NewEfiShellProtocol->GetCurDir(NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Cwd != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy(TabStr, Cwd);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TabStr[StrLen(TabStr)-1] == L'\\' && *(CurrentString + TabPos) == L'\\' ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TabStr[StrLen(TabStr)-1] = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCat(TabStr, CurrentString + TabPos, (StringLen - TabPos) * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy(TabStr, L"");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCat(TabStr, CurrentString + TabPos, (StringLen - TabPos) * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy(TabStr, CurrentString + TabPos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCat(TabStr, L"*");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FoundFileList = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// TabStr = PathCleanUpDirectories(TabStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellInfoObject.NewEfiShellProtocol->FindFiles(TabStr, &FoundFileList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( TempStr = CurrentString
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; *TempStr == L' '
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; TempStr++); // note the ';'... empty for loop
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // make sure we have a list before we do anything more...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status) || FoundFileList == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InTabScrolling = FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TabLinePos = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync continue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // enumerate through the list of files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( TempPos = (EFI_SHELL_FILE_INFO*)GetFirstNode(&(FoundFileList->Link))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; !IsNull(&FoundFileList->Link, &TempPos->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; TempPos = (EFI_SHELL_FILE_INFO*)GetNextNode(&(FoundFileList->Link), &(TempPos->Link))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If "cd" is typed, only directory name will be auto-complete filled
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // in either case . and .. will be removed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((((TempStr[0] == L'c' || TempStr[0] == L'C') &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (TempStr[1] == L'd' || TempStr[1] == L'D')
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) && ((ShellIsDirectory(TempPos->FullName) != EFI_SUCCESS)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ||(StrCmp(TempPos->FileName, L".") == 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ||(StrCmp(TempPos->FileName, L"..") == 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )) || ((StrCmp(TempPos->FileName, L".") == 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ||(StrCmp(TempPos->FileName, L"..") == 0))){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TabLinePos = TempPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempPos = (EFI_SHELL_FILE_INFO*)(RemoveEntryList(&(TempPos->Link))->BackLink);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InternalFreeShellFileInfoNode(TabLinePos);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FoundFileList != NULL && !IsListEmpty(&FoundFileList->Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TabLinePos = (EFI_SHELL_FILE_INFO*)GetFirstNode(&FoundFileList->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InTabScrolling = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(FoundFileList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FoundFileList = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync default:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Key.UnicodeChar >= ' ') {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If we are at the buffer's end, drop the key
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringLen == MaxStr - 1 && (ShellInfoObject.ViewingSettings.InsertMode || StringCurPos == StringLen)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If in insert mode, make space by moving each other character 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // space higher in the array
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellInfoObject.ViewingSettings.InsertMode) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem(CurrentString + StringCurPos + 1, CurrentString + StringCurPos, (StringLen - StringCurPos)*sizeof(CurrentString[0]));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentString[StringCurPos] = Key.UnicodeChar;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Update = StringCurPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringCurPos += 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OutputLength = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case 0:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync switch (Key.ScanCode) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case SCAN_DELETE:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Move characters behind current position one character forward
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringLen != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Update = StringCurPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Delete = 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (CurrentString + StringCurPos, CurrentString + StringCurPos + 1, sizeof (CHAR16) * (StringLen - StringCurPos));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case SCAN_UP:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Prepare to print the previous command
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = (BUFFER_LIST*)GetPreviousNode(&ShellInfoObject.ViewingSettings.CommandHistory.Link, &LinePos->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsNull(&ShellInfoObject.ViewingSettings.CommandHistory.Link, &LinePos->Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = (BUFFER_LIST*)GetPreviousNode(&ShellInfoObject.ViewingSettings.CommandHistory.Link, &LinePos->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case SCAN_DOWN:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Prepare to print the next command
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = (BUFFER_LIST*)GetNextNode(&ShellInfoObject.ViewingSettings.CommandHistory.Link, &LinePos->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewPos == (BUFFER_LIST*)(&ShellInfoObject.ViewingSettings.CommandHistory)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = (BUFFER_LIST*)GetNextNode(&ShellInfoObject.ViewingSettings.CommandHistory.Link, &LinePos->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case SCAN_LEFT:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Adjust current cursor position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringCurPos != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync --StringCurPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MoveCursorBackward (TotalColumn, &Column, &Row);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case SCAN_RIGHT:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Adjust current cursor position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringCurPos < StringLen) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ++StringCurPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MoveCursorForward (TotalColumn, TotalRow, &Column, &Row);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case SCAN_HOME:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Move current cursor position to the beginning of the command line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row -= (StringCurPos + StartColumn) / TotalColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Column = StartColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringCurPos = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case SCAN_END:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Move current cursor position to the end of the command line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TailRow = Row + (StringLen - StringCurPos + Column) / TotalColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TailColumn = (StringLen - StringCurPos + Column) % TotalColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row = TailRow;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Column = TailColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringCurPos = StringLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case SCAN_ESC:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Prepare to clear the current command line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentString[0] = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Update = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Delete = StringLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row -= (StringCurPos + StartColumn) / TotalColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Column = StartColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OutputLength = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case SCAN_INSERT:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Toggle the SEnvInsertMode flag
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellInfoObject.ViewingSettings.InsertMode = (BOOLEAN)!ShellInfoObject.ViewingSettings.InsertMode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync case SCAN_F7:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Print command history
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync PrintCommandHistory (TotalColumn, TotalRow, 4);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *CurrentString = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Done = TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Done) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If we are in auto-complete mode, we are preparing to print
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // the next file or directory name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (InTabScrolling) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Adjust the column and row to the start of TAB-completion string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Column = (StartColumn + TabUpdatePos) % TotalColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row -= (StartColumn + StringCurPos) / TotalColumn - (StartColumn + TabUpdatePos) / TotalColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OutputLength = StrLen (TabLinePos->FileName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // if the output string contains blank space, quotation marks L'\"'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // should be added to the output.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrStr(TabLinePos->FileName, L" ") != NULL){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TabOutputStr[0] = L'\"';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (TabOutputStr + 1, TabLinePos->FileName, OutputLength * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TabOutputStr[OutputLength + 1] = L'\"';
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TabOutputStr[OutputLength + 2] = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (TabOutputStr, TabLinePos->FileName, OutputLength * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TabOutputStr[OutputLength] = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OutputLength = StrLen (TabOutputStr) < MaxStr - 1 ? StrLen (TabOutputStr) : MaxStr - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (CurrentString + TabUpdatePos, TabOutputStr, OutputLength * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentString[TabUpdatePos + OutputLength] = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringCurPos = TabUpdatePos + OutputLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Update = TabUpdatePos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringLen > TabUpdatePos + OutputLength) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Delete = StringLen - TabUpdatePos - OutputLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If we have a new position, we are preparing to print a previous or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // next command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewPos != (BUFFER_LIST*)(&ShellInfoObject.ViewingSettings.CommandHistory)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Column = StartColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row -= (StringCurPos + StartColumn) / TotalColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LinePos = NewPos;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = (BUFFER_LIST*)(&ShellInfoObject.ViewingSettings.CommandHistory);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OutputLength = StrLen (LinePos->Buffer) < MaxStr - 1 ? StrLen (LinePos->Buffer) : MaxStr - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (CurrentString, LinePos->Buffer, OutputLength * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CurrentString[OutputLength] = CHAR_NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringCurPos = OutputLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Draw new input string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Update = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringLen > OutputLength) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If old string was longer, blank its tail
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Delete = StringLen - OutputLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If we need to update the output do so now
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Update != (UINTN) -1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintEx ((INT32)Column, (INT32)Row, L"%s%.*s", CurrentString + Update, Delete, L"");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringLen = StrLen (CurrentString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Delete != 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetMem (CurrentString + StringLen, Delete * sizeof (CHAR16), CHAR_NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringCurPos > StringLen) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StringCurPos = StringLen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Update = (UINTN) -1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // After using print to reflect newly updates, if we're not using
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // BACKSPACE and DELETE, we need to move the cursor position forward,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // so adjust row and column here.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Key.UnicodeChar != CHAR_BACKSPACE && !(Key.UnicodeChar == 0 && Key.ScanCode == SCAN_DELETE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Calulate row and column of the tail of current string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TailRow = Row + (StringLen - StringCurPos + Column + OutputLength) / TotalColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TailColumn = (StringLen - StringCurPos + Column + OutputLength) % TotalColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If the tail of string reaches screen end, screen rolls up, so if
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Row does not equal TailRow, Row should be decremented
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // (if we are recalling commands using UPPER and DOWN key, and if the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // old command is too long to fit the screen, TailColumn must be 79.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TailColumn == 0 && TailRow >= TotalRow && Row != TailRow) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Calculate the cursor position after current operation. If cursor
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // reaches line end, update both row and column, otherwise, only
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // column will be changed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Column + OutputLength >= TotalColumn) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SkipLength = OutputLength - (TotalColumn - Column);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row += SkipLength / TotalColumn + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Row > TotalRow - 1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row = TotalRow - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Column = SkipLength % TotalColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Column += OutputLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Delete = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set the cursor position for this key
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (!Done);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentString != NULL && StrLen(CurrentString) > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // add the line to the history buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AddLineToCommandHistory(CurrentString);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (TabStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (TabOutputStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Return the data to the caller
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *BufferSize = StringLen * sizeof (CHAR16);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // if this was used it should be deallocated by now...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // prevent memory leaks...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(FoundFileList == NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return EFI_SUCCESS;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// FILE sytle interfaces for StdIn/StdOut/StdErr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_FILE_PROTOCOL FileInterfaceStdIn = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_REVISION,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceOpenNotFound,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopGeneric,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopGeneric,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceStdInRead,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceStdInWrite,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopGetPosition,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopSetPosition,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopGetInfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopSetInfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopGeneric
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_FILE_PROTOCOL FileInterfaceStdOut = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_REVISION,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceOpenNotFound,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopGeneric,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopGeneric,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceStdOutRead,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceStdOutWrite,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopGetPosition,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopSetPosition,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopGetInfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopSetInfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopGeneric
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_FILE_PROTOCOL FileInterfaceStdErr = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_REVISION,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceOpenNotFound,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopGeneric,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopGeneric,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceStdErrRead,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceStdErrWrite,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopGetPosition,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopSetPosition,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopGetInfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopSetInfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopGeneric
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_FILE_PROTOCOL FileInterfaceNulFile = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_REVISION,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceOpenNotFound,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopGeneric,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopGeneric,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNulRead,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNulWrite,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopGetPosition,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopSetPosition,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopGetInfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopSetInfo,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterfaceNopGeneric
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// This is identical to EFI_FILE_PROTOCOL except for the additional member
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// for the name.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Revision;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_OPEN Open;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_CLOSE Close;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_DELETE Delete;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_READ Read;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_WRITE Write;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_GET_POSITION GetPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_SET_POSITION SetPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_GET_INFO GetInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_SET_INFO SetInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_FLUSH Flush;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR16 Name[1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} EFI_FILE_PROTOCOL_ENVIRONMENT;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//ANSI compliance helper to get size of the struct.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define SIZE_OF_EFI_FILE_PROTOCOL_ENVIRONMENT EFI_FIELD_OFFSET (EFI_FILE_PROTOCOL_ENVIRONMENT, Name)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for Environment Variable (Close).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Frees the memory for this object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This The pointer to the EFI_FILE_PROTOCOL object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceEnvClose(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool((EFI_FILE_PROTOCOL_ENVIRONMENT*)This);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for Environment Variable (Delete).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This The pointer to the EFI_FILE_PROTOCOL object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval The return value from FileInterfaceEnvClose().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceEnvDelete(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_DELETE_ENVIRONMENT_VARIABLE(((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (FileInterfaceEnvClose(This));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for Environment Variable (Read).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This The pointer to the EFI_FILE_PROTOCOL object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] BufferSize Size in bytes of Buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Buffer The pointer to the buffer to fill.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The data was read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceEnvRead(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_GET_ENVIRONMENT_VARIABLE(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for Volatile Environment Variable (Write).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This The pointer to the EFI_FILE_PROTOCOL object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] BufferSize Size in bytes of Buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Buffer The pointer to the buffer to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The data was read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceEnvVolWrite(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID* NewBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN NewSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewBuffer = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = SHELL_GET_ENVIRONMENT_VARIABLE(((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name, &NewSize, NewBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_BUFFER_TOO_SMALL){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewBuffer = AllocateZeroPool(NewSize + *BufferSize + sizeof(CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = SHELL_GET_ENVIRONMENT_VARIABLE(((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name, &NewSize, NewBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR(Status) && NewBuffer != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (((CHAR16*)NewBuffer)[NewSize/2] == CHAR_NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // We want to overwrite the CHAR_NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewSize -= 2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem((UINT8*)NewBuffer + NewSize + 2, Buffer, *BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = SHELL_SET_ENVIRONMENT_VARIABLE_V(((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name, StrSize(NewBuffer), NewBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(NewBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(NewBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_SET_ENVIRONMENT_VARIABLE_V(((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name, *BufferSize, Buffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for Non Volatile Environment Variable (Write).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This The pointer to the EFI_FILE_PROTOCOL object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] BufferSize Size in bytes of Buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Buffer The pointer to the buffer to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The data was read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceEnvNonVolWrite(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID* NewBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN NewSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewBuffer = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewSize = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = SHELL_GET_ENVIRONMENT_VARIABLE(((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name, &NewSize, NewBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Status == EFI_BUFFER_TOO_SMALL){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewBuffer = AllocateZeroPool(NewSize + *BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = SHELL_GET_ENVIRONMENT_VARIABLE(((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name, &NewSize, NewBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!EFI_ERROR(Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem((UINT8*)NewBuffer + NewSize, Buffer, *BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_SET_ENVIRONMENT_VARIABLE_NV(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewSize + *BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewBuffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (SHELL_SET_ENVIRONMENT_VARIABLE_NV(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Buffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Creates a EFI_FILE_PROTOCOL (almost) object for using to access
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync environment variables through file operations.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EnvName The name of the Environment Variable to be operated on.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL Memory could not be allocated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return other a pointer to an EFI_FILE_PROTOCOL structure
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_FILE_PROTOCOL*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCreateFileInterfaceEnv(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *EnvName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_PROTOCOL_ENVIRONMENT *EnvFileInterface;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EnvName == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get some memory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnvFileInterface = AllocateZeroPool(sizeof(EFI_FILE_PROTOCOL_ENVIRONMENT)+StrSize(EnvName));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EnvFileInterface == NULL){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Assign the generic members
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnvFileInterface->Revision = EFI_FILE_REVISION;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnvFileInterface->Open = FileInterfaceOpenNotFound;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnvFileInterface->Close = FileInterfaceEnvClose;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnvFileInterface->GetPosition = FileInterfaceNopGetPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnvFileInterface->SetPosition = FileInterfaceNopSetPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnvFileInterface->GetInfo = FileInterfaceNopGetInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnvFileInterface->SetInfo = FileInterfaceNopSetInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnvFileInterface->Flush = FileInterfaceNopGeneric;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnvFileInterface->Delete = FileInterfaceEnvDelete;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnvFileInterface->Read = FileInterfaceEnvRead;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrCpy(EnvFileInterface->Name, EnvName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Assign the different members for Volatile and Non-Volatile variables
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsVolatileEnv(EnvName)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnvFileInterface->Write = FileInterfaceEnvVolWrite;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnvFileInterface->Write = FileInterfaceEnvNonVolWrite;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ((EFI_FILE_PROTOCOL *)EnvFileInterface);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Move the cursor position one character backward.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] LineLength Length of a line. Get it by calling QueryMode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Column Current column of the cursor position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Row Current row of the cursor position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMoveCursorBackward (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN LineLength,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *Column,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *Row
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If current column is 0, move to the last column of the previous line,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // otherwise, just decrement column.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*Column == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Column = LineLength - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*Row > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*Row)--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*Column)--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Move the cursor position one character forward.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] LineLength Length of a line.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] TotalRow Total row of a screen
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Column Current column of the cursor position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] Row Current row of the cursor position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncMoveCursorForward (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN LineLength,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN TotalRow,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *Column,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *Row
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Increment Column.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If this puts column past the end of the line, move to first column
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // of the next row.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*Column)++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*Column >= LineLength) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*Column) = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((*Row) < TotalRow - 1) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*Row)++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Prints out each previously typed command in the command list history log.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync When each screen is full it will pause for a key before continuing.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] TotalCols How many columns are on the screen
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] TotalRows How many rows are on the screen
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] StartColumn which column to start at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPrintCommandHistory (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINTN TotalCols,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINTN TotalRows,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST UINTN StartColumn
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BUFFER_LIST *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Index;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN LineNumber;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN LineCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintEx (-1, -1, L"\n");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LineNumber = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // go through history list...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( Node = (BUFFER_LIST*)GetFirstNode(&ShellInfoObject.ViewingSettings.CommandHistory.Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; !IsNull(&ShellInfoObject.ViewingSettings.CommandHistory.Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; Node = (BUFFER_LIST*)GetNextNode(&ShellInfoObject.ViewingSettings.CommandHistory.Link, &Node->Link)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Index++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LineCount = ((StrLen (Node->Buffer) + StartColumn + 1) / TotalCols) + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (LineNumber + LineCount >= TotalRows) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPromptForResponseHii(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPromptResponseTypeEnterContinue,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync STRING_TOKEN (STR_SHELL_ENTER_TO_CONT),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellInfoObject.HiiHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LineNumber = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintEx (-1, -1, L"%2d. %s\n", Index, Node->Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LineNumber += LineCount;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// This is identical to EFI_FILE_PROTOCOL except for the additional members
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// for the buffer, size, and position.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Revision;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_OPEN Open;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_CLOSE Close;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_DELETE Delete;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_READ Read;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_WRITE Write;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_GET_POSITION GetPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_SET_POSITION SetPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_GET_INFO GetInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_SET_INFO SetInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_FLUSH Flush;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync VOID *Buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Position;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 BufferSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN Unicode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} EFI_FILE_PROTOCOL_MEM;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for Mem (SetPosition).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This The pointer to the EFI_FILE_PROTOCOL object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Position The position to set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The position was successfully changed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER The Position was invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceMemSetPosition(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT64 Position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Position <= ((EFI_FILE_PROTOCOL_MEM*)This)->BufferSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((EFI_FILE_PROTOCOL_MEM*)This)->Position = Position;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_INVALID_PARAMETER);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for Mem (GetPosition).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This The pointer to the EFI_FILE_PROTOCOL object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Position The pointer to the position.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The position was retrieved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceMemGetPosition(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT64 *Position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Position = ((EFI_FILE_PROTOCOL_MEM*)This)->Position;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for Mem (Write).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This The pointer to the EFI_FILE_PROTOCOL object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] BufferSize Size in bytes of Buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Buffer The pointer to the buffer to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES The operation failed due to lack of resources.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The data was written.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceMemWrite(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *AsciiBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((EFI_FILE_PROTOCOL_MEM*)This)->Unicode) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Unicode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((UINTN)(((EFI_FILE_PROTOCOL_MEM*)This)->Position + (*BufferSize)) > (UINTN)(((EFI_FILE_PROTOCOL_MEM*)This)->BufferSize)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((EFI_FILE_PROTOCOL_MEM*)This)->Buffer = ReallocatePool((UINTN)(((EFI_FILE_PROTOCOL_MEM*)This)->BufferSize), (UINTN)(((EFI_FILE_PROTOCOL_MEM*)This)->BufferSize) + (*BufferSize) + 10, ((EFI_FILE_PROTOCOL_MEM*)This)->Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((EFI_FILE_PROTOCOL_MEM*)This)->BufferSize += (*BufferSize) + 10;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem(((UINT8*)((EFI_FILE_PROTOCOL_MEM*)This)->Buffer) + ((EFI_FILE_PROTOCOL_MEM*)This)->Position, Buffer, *BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((EFI_FILE_PROTOCOL_MEM*)This)->Position += (*BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Ascii
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AsciiBuffer = AllocateZeroPool(*BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (AsciiBuffer == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_OUT_OF_RESOURCES);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AsciiSPrint(AsciiBuffer, *BufferSize, "%S", Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((UINTN)(((EFI_FILE_PROTOCOL_MEM*)This)->Position + AsciiStrSize(AsciiBuffer)) > (UINTN)(((EFI_FILE_PROTOCOL_MEM*)This)->BufferSize)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((EFI_FILE_PROTOCOL_MEM*)This)->Buffer = ReallocatePool((UINTN)(((EFI_FILE_PROTOCOL_MEM*)This)->BufferSize), (UINTN)(((EFI_FILE_PROTOCOL_MEM*)This)->BufferSize) + AsciiStrSize(AsciiBuffer) + 10, ((EFI_FILE_PROTOCOL_MEM*)This)->Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((EFI_FILE_PROTOCOL_MEM*)This)->BufferSize += AsciiStrSize(AsciiBuffer) + 10;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem(((UINT8*)((EFI_FILE_PROTOCOL_MEM*)This)->Buffer) + ((EFI_FILE_PROTOCOL_MEM*)This)->Position, AsciiBuffer, AsciiStrSize(AsciiBuffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((EFI_FILE_PROTOCOL_MEM*)This)->Position += AsciiStrSize(AsciiBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(AsciiBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for Mem (Read).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This The pointer to the EFI_FILE_PROTOCOL object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] BufferSize Size in bytes of Buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Buffer The pointer to the buffer to fill.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The data was read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceMemRead(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*BufferSize > (UINTN)((((EFI_FILE_PROTOCOL_MEM*)This)->BufferSize) - (UINTN)(((EFI_FILE_PROTOCOL_MEM*)This)->Position))) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*BufferSize) = (UINTN)((((EFI_FILE_PROTOCOL_MEM*)This)->BufferSize) - (UINTN)(((EFI_FILE_PROTOCOL_MEM*)This)->Position));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem(Buffer, ((UINT8*)((EFI_FILE_PROTOCOL_MEM*)This)->Buffer) + ((EFI_FILE_PROTOCOL_MEM*)This)->Position, (*BufferSize));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((EFI_FILE_PROTOCOL_MEM*)This)->Position = ((EFI_FILE_PROTOCOL_MEM*)This)->Position + (*BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for Mem (Close).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Frees all memory associated with this object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This The pointer to the EFI_FILE_PROTOCOL object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The 'file' was closed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceMemClose(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(((EFI_FILE_PROTOCOL_MEM*)This)->Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(This);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_SUCCESS);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Creates a EFI_FILE_PROTOCOL (almost) object for using to access
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a file entirely in memory through file operations.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Unicode Boolean value with TRUE for Unicode and FALSE for Ascii.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL Memory could not be allocated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return other A pointer to an EFI_FILE_PROTOCOL structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_FILE_PROTOCOL*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCreateFileInterfaceMem(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN Unicode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_PROTOCOL_MEM *FileInterface;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get some memory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterface = AllocateZeroPool(sizeof(EFI_FILE_PROTOCOL_MEM));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FileInterface == NULL){
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Assign the generic members
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterface->Revision = EFI_FILE_REVISION;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterface->Open = FileInterfaceOpenNotFound;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterface->Close = FileInterfaceMemClose;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterface->GetPosition = FileInterfaceMemGetPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterface->SetPosition = FileInterfaceMemSetPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterface->GetInfo = FileInterfaceNopGetInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterface->SetInfo = FileInterfaceNopSetInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterface->Flush = FileInterfaceNopGeneric;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterface->Delete = FileInterfaceNopGeneric;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterface->Read = FileInterfaceMemRead;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterface->Write = FileInterfaceMemWrite;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterface->Unicode = Unicode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(FileInterface->Buffer == NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(FileInterface->BufferSize == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT(FileInterface->Position == 0);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ((EFI_FILE_PROTOCOL *)FileInterface);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT64 Revision;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_OPEN Open;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_CLOSE Close;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_DELETE Delete;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_READ Read;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_WRITE Write;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_GET_POSITION GetPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_SET_POSITION SetPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_GET_INFO GetInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_SET_INFO SetInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_FLUSH Flush;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN Unicode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_PROTOCOL *Orig;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} EFI_FILE_PROTOCOL_FILE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Set a files current position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Protocol instance pointer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Position Byte position from the start of the file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Data was written.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceFileSetPosition(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ((EFI_FILE_PROTOCOL_FILE*)This)->Orig->SetPosition(((EFI_FILE_PROTOCOL_FILE*)This)->Orig, Position);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get a file's current position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Protocol instance pointer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Position Byte position from the start of the file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Data was written.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceFileGetPosition(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINT64 *Position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ((EFI_FILE_PROTOCOL_FILE*)This)->Orig->GetPosition(((EFI_FILE_PROTOCOL_FILE*)This)->Orig, Position);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get information about a file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Protocol instance pointer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param InformationType Type of information to return in Buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param BufferSize On input size of buffer, on output amount of data in buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer The buffer to return data.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Data was returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORT InformationType is not supported.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NO_MEDIA The device has no media.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR The device reported an error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_WRITE_PROTECTED The device is write protected.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ACCESS_DENIED The file was open for read only.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BUFFER_TOO_SMALL Buffer was too small; required size returned in BufferSize.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceFileGetInfo(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GUID *InformationType,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ((EFI_FILE_PROTOCOL_FILE*)This)->Orig->GetInfo(((EFI_FILE_PROTOCOL_FILE*)This)->Orig, InformationType, BufferSize, Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Set information about a file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Protocol instance pointer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param InformationType Type of information in Buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param BufferSize Size of buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer The data to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Data was returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORT InformationType is not supported.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NO_MEDIA The device has no media.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR The device reported an error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_WRITE_PROTECTED The device is write protected.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ACCESS_DENIED The file was open for read only.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceFileSetInfo(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_GUID *InformationType,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ((EFI_FILE_PROTOCOL_FILE*)This)->Orig->SetInfo(((EFI_FILE_PROTOCOL_FILE*)This)->Orig, InformationType, BufferSize, Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Flush data back for the file handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Protocol instance pointer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Data was written.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORT Writes to Open directory are not supported.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NO_MEDIA The device has no media.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR The device reported an error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_WRITE_PROTECTED The device is write protected.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ACCESS_DENIED The file was open for read only.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_FULL The volume is full.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceFileFlush(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ((EFI_FILE_PROTOCOL_FILE*)This)->Orig->Flush(((EFI_FILE_PROTOCOL_FILE*)This)->Orig);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Read data from the file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Protocol instance pointer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param BufferSize On input size of buffer, on output amount of data in buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Buffer The buffer in which data is read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Data was read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NO_MEDIA The device has no media.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR The device reported an error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_BUFFER_TO_SMALL BufferSize is too small. BufferSize contains required size.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceFileRead(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *AsciiBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((EFI_FILE_PROTOCOL_FILE*)This)->Unicode) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Unicode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (((EFI_FILE_PROTOCOL_FILE*)This)->Orig->Read(((EFI_FILE_PROTOCOL_FILE*)This)->Orig, BufferSize, Buffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Ascii
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AsciiBuffer = AllocateZeroPool((Size = *BufferSize));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = (((EFI_FILE_PROTOCOL_FILE*)This)->Orig->Read(((EFI_FILE_PROTOCOL_FILE*)This)->Orig, &Size, AsciiBuffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UnicodeSPrint(Buffer, *BufferSize, L"%a", AsciiBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(AsciiBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Opens a new file relative to the source file's location.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This The protocol instance pointer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] NewHandle Returns File Handle for FileName.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] FileName Null terminated string. "\", ".", and ".." are supported.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] OpenMode Open mode for file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Attributes Only used for EFI_FILE_MODE_CREATE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The device was opened.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NOT_FOUND The specified file could not be found on the device.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_NO_MEDIA The device has no media.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_MEDIA_CHANGED The media has changed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_DEVICE_ERROR The device reported an error.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_ACCESS_DENIED The service denied access to the file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_OUT_OF_RESOURCES The volume was not opened due to lack of resources.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_VOLUME_FULL The volume is full.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceFileOpen (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT EFI_FILE_PROTOCOL **NewHandle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CHAR16 *FileName,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 OpenMode,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT64 Attributes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ((EFI_FILE_PROTOCOL_FILE*)This)->Orig->Open(((EFI_FILE_PROTOCOL_FILE*)This)->Orig, NewHandle, FileName, OpenMode, Attributes);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Close and delete the file handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Protocol instance pointer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The device was opened.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_WARN_DELETE_FAILURE The handle was closed but the file was not deleted.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceFileDelete(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ((EFI_FILE_PROTOCOL_FILE*)This)->Orig->Delete(((EFI_FILE_PROTOCOL_FILE*)This)->Orig);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(This);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for File (Close).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This The pointer to the EFI_FILE_PROTOCOL object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The file was closed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceFileClose(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ((EFI_FILE_PROTOCOL_FILE*)This)->Orig->Close(((EFI_FILE_PROTOCOL_FILE*)This)->Orig);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(This);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for File (Write).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the file was opened with ASCII mode the data will be processed through
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AsciiSPrint before writing.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This The pointer to the EFI_FILE_PROTOCOL object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] BufferSize Size in bytes of Buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Buffer The pointer to the buffer to write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The data was written.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_STATUS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileInterfaceFileWrite(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_FILE_PROTOCOL *This,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT UINTN *BufferSize,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN VOID *Buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CHAR8 *AsciiBuffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (((EFI_FILE_PROTOCOL_FILE*)This)->Unicode) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Unicode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (((EFI_FILE_PROTOCOL_FILE*)This)->Orig->Write(((EFI_FILE_PROTOCOL_FILE*)This)->Orig, BufferSize, Buffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Ascii
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AsciiBuffer = AllocateZeroPool(*BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AsciiSPrint(AsciiBuffer, *BufferSize, "%S", Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = AsciiStrSize(AsciiBuffer) - 1; // (we dont need the null terminator)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = (((EFI_FILE_PROTOCOL_FILE*)This)->Orig->Write(((EFI_FILE_PROTOCOL_FILE*)This)->Orig, &Size, AsciiBuffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool(AsciiBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (Status);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Create a file interface with unicode information.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This will create a new EFI_FILE_PROTOCOL identical to the Templace
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync except that the new one has Unicode and Ascii knowledge.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Template A pointer to the EFI_FILE_PROTOCOL object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Unicode TRUE for UCS-2, FALSE for ASCII.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return a new EFI_FILE_PROTOCOL object to be used instead of the template.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_FILE_PROTOCOL*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCreateFileInterfaceFile(
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_FILE_PROTOCOL *Template,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST BOOLEAN Unicode
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_PROTOCOL_FILE *NewOne;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOne = AllocateZeroPool(sizeof(EFI_FILE_PROTOCOL_FILE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewOne == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem(NewOne, Template, sizeof(EFI_FILE_PROTOCOL_FILE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOne->Orig = (EFI_FILE_PROTOCOL *)Template;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOne->Unicode = Unicode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOne->Open = FileInterfaceFileOpen;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOne->Close = FileInterfaceFileClose;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOne->Delete = FileInterfaceFileDelete;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOne->Read = FileInterfaceFileRead;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOne->Write = FileInterfaceFileWrite;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOne->GetPosition = FileInterfaceFileGetPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOne->SetPosition = FileInterfaceFileSetPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOne->GetInfo = FileInterfaceFileGetInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOne->SetInfo = FileInterfaceFileSetInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOne->Flush = FileInterfaceFileFlush;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ((EFI_FILE_PROTOCOL *)NewOne);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}