4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_PROTOCOL wrappers for other items (Like Environment Variables,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StdIn, StdOut, StdErr, etc...).
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 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 File style interface for console (Open).
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 @retval EFI_NOT_FOUND
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for console (Close, Delete, & Flush)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for console (GetPosition).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Position Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for console (SetPosition).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Position Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for console (GetInfo).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] InformationType Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] BufferSize Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Buffer Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for console (SetInfo).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] InformationType Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] BufferSize Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Buffer Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for StdOut (Write).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Writes data to the screen.
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 @retval EFI_UNSUPPORTED No output console is supported.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return A return value from gST->ConOut->OutputString.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (ShellInfoObject.ShellInitSettings.BitUnion.Bits.NoConsoleOut) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (gST->ConOut->OutputString(gST->ConOut, Buffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for StdIn (Write).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] BufferSize Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Buffer Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for console StdErr (Write).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Writes error to the error output.
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 @return A return value from gST->StdErr->OutputString.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (gST->StdErr->OutputString(gST->StdErr, Buffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for console StdOut (Read).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] BufferSize Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Buffer Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for console StdErr (Read).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] BufferSize Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Buffer Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED Always.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for NUL file (Read).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] BufferSize Poiner to 0 upon return.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Buffer Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Always.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for NUL file (Write).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in, out] BufferSize Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Buffer Ignored.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for console (Read).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This will return a single line of input from the console.
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 @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 UINTN StartColumn; // Column at the beginning of the line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Delete; // Num of chars to delete from console after update
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN StringCurPos; // Line index corresponding to the cursor
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN TotalColumn; // Num of columns in the console
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync BOOLEAN InTabScrolling; // Whether in TAB-completion state
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 // If buffer is not large enough to hold a CHAR16, return minimum buffer size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LinePos = NewPos = (BUFFER_LIST*)(&ShellInfoObject.ViewingSettings.CommandHistory);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate buffers
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get the screen setting and the current cursor location
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Column = StartColumn = gST->ConOut->Mode->CursorColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->QueryMode (gST->ConOut, gST->ConOut->Mode->Mode, &TotalColumn, &TotalRow);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Limit the line length to the buffer size or the minimun size of the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // screen. (The smaller takes effect)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MaxStr = TotalColumn * (TotalRow - 1) - StartColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Read a key
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gBS->WaitForEvent (1, &gST->ConIn->WaitForKey, &EventIndex);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Press PageUp or PageDown to scroll the history screen up or down.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Press any other key to quit scrolling.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Key.UnicodeChar == 0 && (Key.ScanCode == SCAN_PAGE_UP || Key.ScanCode == SCAN_PAGE_DOWN)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConsoleLoggerDisplayHistory(FALSE, 0, ShellInfoObject.ConsoleInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConsoleLoggerDisplayHistory(TRUE, 0, ShellInfoObject.ConsoleInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ConsoleLoggerStopHistory(ShellInfoObject.ConsoleInfo);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If we are quitting TAB scrolling...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (InTabScrolling && Key.UnicodeChar != CHAR_TAB) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellInfoObject.NewEfiShellProtocol->FreeFileList (&FoundFileList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // All done, print a newline at the end of the string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TailRow = Row + (StringLen - StringCurPos + Column) / TotalColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TailColumn = (StringLen - StringCurPos + Column) % TotalColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintEx ((INT32)TailColumn, (INT32)TailRow, L"%N\n");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If not move back beyond string beginning, move all characters behind
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // the current position one character forward
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (CurrentString + StringCurPos, CurrentString + StringCurPos + 1, sizeof (CHAR16) * (StringLen - StringCurPos));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Adjust the current column and row
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // handle auto complete of file and directory names...
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 if (CurrentString[Index] == L' ' && !InQuotationMode) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StrStr(CurrentString + TabPos, L":") == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Cwd = ShellInfoObject.NewEfiShellProtocol->GetCurDir(NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TabStr[StrLen(TabStr)-1] == L'\\' && *(CurrentString + TabPos) == L'\\' ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCat(TabStr, CurrentString + TabPos, (StringLen - TabPos) * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync StrnCat(TabStr, CurrentString + TabPos, (StringLen - TabPos) * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// TabStr = PathCleanUpDirectories(TabStr);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ShellInfoObject.NewEfiShellProtocol->FindFiles(TabStr, &FoundFileList);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // make sure we have a list before we do anything more...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // enumerate through the list of files
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for ( TempPos = (EFI_SHELL_FILE_INFO*)GetFirstNode(&(FoundFileList->Link))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ; TempPos = (EFI_SHELL_FILE_INFO*)GetNextNode(&(FoundFileList->Link), &(TempPos->Link))
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If "cd" is typed, only directory name will be auto-complete filled
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // in either case . and .. will be removed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((((TempStr[0] == L'c' || TempStr[0] == L'C') &&
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ) && ((ShellIsDirectory(TempPos->FullName) != EFI_SUCCESS)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempPos = (EFI_SHELL_FILE_INFO*)(RemoveEntryList(&(TempPos->Link))->BackLink);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FoundFileList != NULL && !IsListEmpty(&FoundFileList->Link)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TabLinePos = (EFI_SHELL_FILE_INFO*)GetFirstNode(&FoundFileList->Link);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If we are at the buffer's end, drop the key
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (StringLen == MaxStr - 1 && (ShellInfoObject.ViewingSettings.InsertMode || StringCurPos == StringLen)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If in insert mode, make space by moving each other character 1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // space higher in the array
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem(CurrentString + StringCurPos + 1, CurrentString + StringCurPos, (StringLen - StringCurPos)*sizeof(CurrentString[0]));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Move characters behind current position one character forward
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (CurrentString + StringCurPos, CurrentString + StringCurPos + 1, sizeof (CHAR16) * (StringLen - StringCurPos));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Prepare to print the previous command
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 // Prepare to print the next command
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 // Adjust current cursor position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Adjust current cursor position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync MoveCursorForward (TotalColumn, TotalRow, &Column, &Row);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Move current cursor position to the beginning of the command line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Move current cursor position to the end of the command line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TailRow = Row + (StringLen - StringCurPos + Column) / TotalColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TailColumn = (StringLen - StringCurPos + Column) % TotalColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Prepare to clear the current command line
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Toggle the SEnvInsertMode flag
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellInfoObject.ViewingSettings.InsertMode = (BOOLEAN)!ShellInfoObject.ViewingSettings.InsertMode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Print command history
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If we are in auto-complete mode, we are preparing to print
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // the next file or directory name
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Adjust the column and row to the start of TAB-completion string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Column = (StartColumn + TabUpdatePos) % TotalColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Row -= (StartColumn + StringCurPos) / TotalColumn - (StartColumn + TabUpdatePos) / TotalColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // if the output string contains blank space, quotation marks L'\"'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // should be added to the output.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (TabOutputStr + 1, TabLinePos->FileName, OutputLength * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (TabOutputStr, TabLinePos->FileName, OutputLength * sizeof (CHAR16));
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 // If we have a new position, we are preparing to print a previous or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // next command.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewPos != (BUFFER_LIST*)(&ShellInfoObject.ViewingSettings.CommandHistory)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewPos = (BUFFER_LIST*)(&ShellInfoObject.ViewingSettings.CommandHistory);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OutputLength = StrLen (LinePos->Buffer) < MaxStr - 1 ? StrLen (LinePos->Buffer) : MaxStr - 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (CurrentString, LinePos->Buffer, OutputLength * sizeof (CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Draw new input string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If old string was longer, blank its tail
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If we need to update the output do so now
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintEx ((INT32)Column, (INT32)Row, L"%s%.*s", CurrentString + Update, Delete, L"");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetMem (CurrentString + StringLen, Delete * sizeof (CHAR16), CHAR_NULL);
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 if (Key.UnicodeChar != CHAR_BACKSPACE && !(Key.UnicodeChar == 0 && Key.ScanCode == SCAN_DELETE)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Calulate row and column of the tail of current string
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TailRow = Row + (StringLen - StringCurPos + Column + OutputLength) / TotalColumn;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TailColumn = (StringLen - StringCurPos + Column + OutputLength) % TotalColumn;
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 // (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 if (TailColumn == 0 && TailRow >= TotalRow && Row != TailRow) {
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 SkipLength = OutputLength - (TotalColumn - Column);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Set the cursor position for this key
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (!Done);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (CurrentString != NULL && StrLen(CurrentString) > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // add the line to the history buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Return the data to the caller
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // if this was used it should be deallocated by now...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // prevent memory leaks...
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// FILE sytle interfaces for StdIn/StdOut/StdErr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// This is identical to EFI_FILE_PROTOCOL except for the additional member
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// for the name.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
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 File style interface for Environment Variable (Close).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Frees the memory for this object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This The pointer to the EFI_FILE_PROTOCOL object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for Environment Variable (Delete).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This The pointer to the EFI_FILE_PROTOCOL object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval The return value from FileInterfaceEnvClose().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_DELETE_ENVIRONMENT_VARIABLE(((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for Environment Variable (Read).
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 @retval EFI_SUCCESS The data was read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for Volatile Environment Variable (Write).
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 @retval EFI_SUCCESS The data was read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = SHELL_GET_ENVIRONMENT_VARIABLE(((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name, &NewSize, NewBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewBuffer = AllocateZeroPool(NewSize + *BufferSize + sizeof(CHAR16));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = SHELL_GET_ENVIRONMENT_VARIABLE(((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name, &NewSize, NewBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (((CHAR16*)NewBuffer)[NewSize/2] == CHAR_NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // We want to overwrite the CHAR_NULL
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 return (SHELL_SET_ENVIRONMENT_VARIABLE_V(((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name, *BufferSize, Buffer));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for Non Volatile Environment Variable (Write).
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 @retval EFI_SUCCESS The data was read.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = SHELL_GET_ENVIRONMENT_VARIABLE(((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name, &NewSize, NewBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewBuffer = AllocateZeroPool(NewSize + *BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = SHELL_GET_ENVIRONMENT_VARIABLE(((EFI_FILE_PROTOCOL_ENVIRONMENT*)This)->Name, &NewSize, NewBuffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem((UINT8*)NewBuffer + NewSize, Buffer, *BufferSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Creates a EFI_FILE_PROTOCOL (almost) object for using to access
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync environment variables through file operations.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param EnvName The name of the Environment Variable to be operated on.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL Memory could not be allocated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return other a pointer to an EFI_FILE_PROTOCOL structure
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get some memory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnvFileInterface = AllocateZeroPool(sizeof(EFI_FILE_PROTOCOL_ENVIRONMENT)+StrSize(EnvName));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Assign the generic members
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnvFileInterface->Open = FileInterfaceOpenNotFound;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnvFileInterface->GetPosition = FileInterfaceNopGetPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnvFileInterface->SetPosition = FileInterfaceNopSetPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnvFileInterface->GetInfo = FileInterfaceNopGetInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnvFileInterface->SetInfo = FileInterfaceNopSetInfo;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Assign the different members for Volatile and Non-Volatile variables
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnvFileInterface->Write = FileInterfaceEnvVolWrite;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EnvFileInterface->Write = FileInterfaceEnvNonVolWrite;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Move the cursor position one character backward.
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 // If current column is 0, move to the last column of the previous line,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // otherwise, just decrement column.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*Column == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (*Row > 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Move the cursor position one character forward.
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 // Increment Column.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If this puts column past the end of the line, move to first column
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // of the next row.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Prints out each previously typed command in the command list history log.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync When each screen is full it will pause for a key before continuing.
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 // go through history list...
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 LineCount = ((StrLen (Node->Buffer) + StartColumn + 1) / TotalCols) + 1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ShellPrintEx (-1, -1, L"%2d. %s\n", Index, Node->Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// This is identical to EFI_FILE_PROTOCOL except for the additional members
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// for the buffer, size, and position.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for Mem (SetPosition).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This The pointer to the EFI_FILE_PROTOCOL object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Position The position to set.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The position was successfully changed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_INVALID_PARAMETER The Position was invalid.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Position <= ((EFI_FILE_PROTOCOL_MEM*)This)->BufferSize) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((EFI_FILE_PROTOCOL_MEM*)This)->Position = Position;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for Mem (GetPosition).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This The pointer to the EFI_FILE_PROTOCOL object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[out] Position The pointer to the position.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The position was retrieved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Position = ((EFI_FILE_PROTOCOL_MEM*)This)->Position;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for Mem (Write).
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 @retval EFI_OUT_OF_RESOURCES The operation failed due to lack of resources.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The data was written.
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 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 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 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 File style interface for Mem (Read).
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 @retval EFI_SUCCESS The data was read.
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 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 File style interface for Mem (Close).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Frees all memory associated with this object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This The pointer to the EFI_FILE_PROTOCOL object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The 'file' was closed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SHELL_FREE_NON_NULL(((EFI_FILE_PROTOCOL_MEM*)This)->Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Creates a EFI_FILE_PROTOCOL (almost) object for using to access
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a file entirely in memory through file operations.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Unicode Boolean value with TRUE for Unicode and FALSE for Ascii.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL Memory could not be allocated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return other A pointer to an EFI_FILE_PROTOCOL structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Get some memory
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterface = AllocateZeroPool(sizeof(EFI_FILE_PROTOCOL_MEM));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Assign the generic members
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterface->GetPosition = FileInterfaceMemGetPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileInterface->SetPosition = FileInterfaceMemSetPosition;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Set a files current position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Protocol instance pointer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Position Byte position from the start of the file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Data was written.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ((EFI_FILE_PROTOCOL_FILE*)This)->Orig->SetPosition(((EFI_FILE_PROTOCOL_FILE*)This)->Orig, Position);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get a file's current position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Protocol instance pointer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Position Byte position from the start of the file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS Data was written.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_UNSUPPORTED Seek request for non-zero is not valid on open..
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ((EFI_FILE_PROTOCOL_FILE*)This)->Orig->GetPosition(((EFI_FILE_PROTOCOL_FILE*)This)->Orig, Position);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Get information about a file.
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 @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 return ((EFI_FILE_PROTOCOL_FILE*)This)->Orig->GetInfo(((EFI_FILE_PROTOCOL_FILE*)This)->Orig, InformationType, BufferSize, Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Set information about a file
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 @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 return ((EFI_FILE_PROTOCOL_FILE*)This)->Orig->SetInfo(((EFI_FILE_PROTOCOL_FILE*)This)->Orig, InformationType, BufferSize, Buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Flush data back for the file handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Protocol instance pointer.
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 return ((EFI_FILE_PROTOCOL_FILE*)This)->Orig->Flush(((EFI_FILE_PROTOCOL_FILE*)This)->Orig);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Read data from the file.
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 @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 return (((EFI_FILE_PROTOCOL_FILE*)This)->Orig->Read(((EFI_FILE_PROTOCOL_FILE*)This)->Orig, BufferSize, Buffer));
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 Opens a new file relative to the source file's location.
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 @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 return ((EFI_FILE_PROTOCOL_FILE*)This)->Orig->Open(((EFI_FILE_PROTOCOL_FILE*)This)->Orig, NewHandle, FileName, OpenMode, Attributes);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Close and delete the file handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param This Protocol instance pointer.
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 Status = ((EFI_FILE_PROTOCOL_FILE*)This)->Orig->Delete(((EFI_FILE_PROTOCOL_FILE*)This)->Orig);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for File (Close).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] This The pointer to the EFI_FILE_PROTOCOL object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval EFI_SUCCESS The file was closed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = ((EFI_FILE_PROTOCOL_FILE*)This)->Orig->Close(((EFI_FILE_PROTOCOL_FILE*)This)->Orig);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync File style interface for File (Write).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If the file was opened with ASCII mode the data will be processed through
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync AsciiSPrint before writing.
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 @retval EFI_SUCCESS The data was written.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (((EFI_FILE_PROTOCOL_FILE*)This)->Orig->Write(((EFI_FILE_PROTOCOL_FILE*)This)->Orig, BufferSize, Buffer));
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 Create a file interface with unicode information.
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 @param[in] Template A pointer to the EFI_FILE_PROTOCOL object.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param[in] Unicode TRUE for UCS-2, FALSE for ASCII.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return a new EFI_FILE_PROTOCOL object to be used instead of the template.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOne = AllocateZeroPool(sizeof(EFI_FILE_PROTOCOL_FILE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem(NewOne, Template, sizeof(EFI_FILE_PROTOCOL_FILE));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewOne->GetPosition = FileInterfaceFileGetPosition;