mirror of
				https://git.proxmox.com/git/mirror_edk2
				synced 2025-11-04 02:40:26 +00:00 
			
		
		
		
	ShellPkg: Change StdIn redirection
This changes how StdIn redirection works such that the file is opened and parsed for length up front and not each time. This prevents TPL issues. Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jaben Carsey <jaben.carsey@intel.com> Reviewed-by: Erik Bjorge <erik.c.bjorge@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@15140 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
		
							parent
							
								
									d91e3ba5e7
								
							
						
					
					
						commit
						2c86b6b785
					
				@ -2,7 +2,7 @@
 | 
			
		||||
  Function definitions for shell simple text in and out on top of file handles.
 | 
			
		||||
 | 
			
		||||
  Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
 | 
			
		||||
  Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
 | 
			
		||||
  Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
 | 
			
		||||
  This program and the accompanying materials
 | 
			
		||||
  are licensed and made available under the terms and conditions of the BSD License
 | 
			
		||||
  which accompanies this distribution.  The full text of the license may be found at
 | 
			
		||||
@ -19,6 +19,7 @@ typedef struct {
 | 
			
		||||
  EFI_SIMPLE_TEXT_INPUT_PROTOCOL  SimpleTextIn;
 | 
			
		||||
  SHELL_FILE_HANDLE               FileHandle;
 | 
			
		||||
  EFI_HANDLE                      TheHandle;
 | 
			
		||||
  UINT64                          RemainingBytesOfInputFile;
 | 
			
		||||
} SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL;
 | 
			
		||||
 | 
			
		||||
typedef struct {
 | 
			
		||||
@ -43,19 +44,7 @@ ConInWaitForKey (
 | 
			
		||||
  IN  VOID            *Context
 | 
			
		||||
  )
 | 
			
		||||
{
 | 
			
		||||
  UINT64 Position;
 | 
			
		||||
  UINT64 Size;
 | 
			
		||||
  //
 | 
			
		||||
  // Someone is waiting on the keystroke event, if there's
 | 
			
		||||
  // a key pending, signal the event
 | 
			
		||||
  //
 | 
			
		||||
  // Context is the pointer to EFI_SIMPLE_TEXT_INPUT_PROTOCOL
 | 
			
		||||
  //
 | 
			
		||||
  ShellInfoObject.NewEfiShellProtocol->GetFilePosition(((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)Context)->FileHandle, &Position);
 | 
			
		||||
  ShellInfoObject.NewEfiShellProtocol->GetFileSize    (((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)Context)->FileHandle, &Size    );
 | 
			
		||||
  if (Position < Size) {
 | 
			
		||||
    gBS->SignalEvent (Event);
 | 
			
		||||
  }
 | 
			
		||||
  gBS->SignalEvent (Event);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@ -92,10 +81,32 @@ FileBasedSimpleTextInReadKeyStroke(
 | 
			
		||||
  )
 | 
			
		||||
{
 | 
			
		||||
  UINTN Size;
 | 
			
		||||
  Size = sizeof(CHAR16);
 | 
			
		||||
 | 
			
		||||
  //
 | 
			
		||||
  // Verify the parameters
 | 
			
		||||
  //
 | 
			
		||||
  if (Key == NULL || This == NULL) {
 | 
			
		||||
    return (EFI_INVALID_PARAMETER);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  //
 | 
			
		||||
  // Check if we have any characters left in the stream.
 | 
			
		||||
  //
 | 
			
		||||
  if (((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)This)->RemainingBytesOfInputFile == 0) {
 | 
			
		||||
    return (EFI_NOT_READY);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Size = sizeof(CHAR16);
 | 
			
		||||
 | 
			
		||||
  //
 | 
			
		||||
  // Decrement the amount of free space by Size or set to zero (for odd length files)
 | 
			
		||||
  //
 | 
			
		||||
  if (((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)This)->RemainingBytesOfInputFile > Size) {
 | 
			
		||||
    ((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)This)->RemainingBytesOfInputFile -= Size;
 | 
			
		||||
  } else {
 | 
			
		||||
    ((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)This)->RemainingBytesOfInputFile = 0;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  Key->ScanCode = 0;
 | 
			
		||||
  return (ShellInfoObject.NewEfiShellProtocol->ReadFile(
 | 
			
		||||
    ((SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL *)This)->FileHandle,
 | 
			
		||||
@ -122,6 +133,8 @@ CreateSimpleTextInOnFile(
 | 
			
		||||
{
 | 
			
		||||
  SHELL_EFI_SIMPLE_TEXT_INPUT_PROTOCOL  *ProtocolToReturn;
 | 
			
		||||
  EFI_STATUS                            Status;
 | 
			
		||||
  UINT64                                CurrentPosition;
 | 
			
		||||
  UINT64                                FileSize;
 | 
			
		||||
 | 
			
		||||
  if (HandleLocation == NULL || FileHandleToUse == NULL) {
 | 
			
		||||
    return (NULL);
 | 
			
		||||
@ -131,7 +144,15 @@ CreateSimpleTextInOnFile(
 | 
			
		||||
  if (ProtocolToReturn == NULL) {
 | 
			
		||||
    return (NULL);
 | 
			
		||||
  }
 | 
			
		||||
  ProtocolToReturn->FileHandle                  = FileHandleToUse;
 | 
			
		||||
 | 
			
		||||
  ShellGetFileSize    (FileHandleToUse, &FileSize);
 | 
			
		||||
  ShellGetFilePosition(FileHandleToUse, &CurrentPosition);
 | 
			
		||||
 | 
			
		||||
  //
 | 
			
		||||
  // Initialize the protocol members
 | 
			
		||||
  //
 | 
			
		||||
  ProtocolToReturn->RemainingBytesOfInputFile  = FileSize - CurrentPosition;
 | 
			
		||||
  ProtocolToReturn->FileHandle                 = FileHandleToUse;
 | 
			
		||||
  ProtocolToReturn->SimpleTextIn.Reset         = FileBasedSimpleTextInReset;
 | 
			
		||||
  ProtocolToReturn->SimpleTextIn.ReadKeyStroke = FileBasedSimpleTextInReadKeyStroke;
 | 
			
		||||
  
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user