Refactored some commands into FileHandleLib since they are used in many binaries. Added .h for GUID that was missing. Added PCD for initialization of shell apps and shell itself in shell library interaction. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8295 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			325 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			325 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  This is a simple shell application
 | 
						|
 | 
						|
  This should be executed with "/Param2 Val1" and "/Param1" as the 2 command line options!
 | 
						|
 | 
						|
  Copyright (c) 2008, Intel Corporation                                                         
 | 
						|
  All rights reserved. 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        
 | 
						|
  http://opensource.org/licenses/bsd-license.php                                            
 | 
						|
 | 
						|
  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
 | 
						|
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
 | 
						|
 | 
						|
**/
 | 
						|
 | 
						|
#include <Uefi.h>
 | 
						|
#include <Library/UefiApplicationEntryPoint.h>
 | 
						|
#include <Library/UefiLib.h>
 | 
						|
#include <Library/ShellLib.h>
 | 
						|
#include <Library/DebugLib.h>
 | 
						|
#include <Library/MemoryAllocationLib.h>
 | 
						|
 | 
						|
SHELL_PARAM_ITEM ParamList[] = {
 | 
						|
  {L"/Param1", TypeFlag},
 | 
						|
  {L"/Param2", TypeValue},
 | 
						|
  {NULL, TypeMax}};
 | 
						|
 | 
						|
/**
 | 
						|
  as the real entry point for the application.
 | 
						|
 | 
						|
  @param[in] ImageHandle    The firmware allocated handle for the EFI image.  
 | 
						|
  @param[in] SystemTable    A pointer to the EFI System Table.
 | 
						|
  
 | 
						|
  @retval EFI_SUCCESS       The entry point is executed successfully.
 | 
						|
  @retval other             Some error occurs when executing this entry point.
 | 
						|
 | 
						|
**/
 | 
						|
EFI_STATUS
 | 
						|
EFIAPI
 | 
						|
UefiMain (
 | 
						|
  IN EFI_HANDLE        ImageHandle,
 | 
						|
  IN EFI_SYSTEM_TABLE  *SystemTable
 | 
						|
  )
 | 
						|
{
 | 
						|
  EFI_FILE_HANDLE     FileHandle;
 | 
						|
  EFI_STATUS          Status;
 | 
						|
  CHAR16              FileName[100];
 | 
						|
  UINTN               BufferSize;
 | 
						|
  UINT64              Position;
 | 
						|
  UINT8               Buffer[200];
 | 
						|
  EFI_FILE_INFO       *pFileInfo;
 | 
						|
  UINT64              Size;
 | 
						|
  BOOLEAN             NoFile;
 | 
						|
  EFI_SHELL_FILE_INFO *pShellFileInfo;
 | 
						|
  LIST_ENTRY          *List;
 | 
						|
  
 | 
						|
  FileHandle = NULL;
 | 
						|
  StrCpy(FileName, L"testfile.txt");
 | 
						|
  Position = 0;
 | 
						|
  pFileInfo = NULL;
 | 
						|
  Size = 0;
 | 
						|
  NoFile = FALSE;
 | 
						|
  pShellFileInfo = NULL;
 | 
						|
  List = NULL;
 | 
						|
 | 
						|
  ASSERT(ShellGetExecutionBreakFlag() == FALSE);
 | 
						|
  ASSERT(StrCmp(ShellGetCurrentDir(NULL), L"f8:\\") == 0);
 | 
						|
  Print(L"execution break and get cur dir - pass\r\n");
 | 
						|
 | 
						|
  ShellSetPageBreakMode(TRUE);
 | 
						|
 | 
						|
  Status = ShellOpenFileByName(FileName, 
 | 
						|
                               &FileHandle, 
 | 
						|
                               EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE, 
 | 
						|
                               0
 | 
						|
                               );
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
 | 
						|
  BufferSize = StrSize(FileName);
 | 
						|
  Status = ShellWriteFile(FileHandle, &BufferSize, FileName);
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  Status = ShellGetFilePosition(FileHandle, &Position);
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  ASSERT(Position == 0x1A);
 | 
						|
  Status = ShellSetFilePosition(FileHandle, 0);
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  BufferSize = sizeof(Buffer) * sizeof(Buffer[0]);
 | 
						|
  Status = ShellReadFile(FileHandle, &BufferSize, Buffer);
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  ASSERT(BufferSize == 0x1A);
 | 
						|
  ASSERT(StrCmp((CHAR16*)Buffer, FileName) == 0);
 | 
						|
  pFileInfo = ShellGetFileInfo(FileHandle);
 | 
						|
  ASSERT(pFileInfo != NULL);
 | 
						|
  ASSERT(StrCmp(pFileInfo->FileName, FileName) == 0);
 | 
						|
  ASSERT(pFileInfo->FileSize == 0x1A);
 | 
						|
  FreePool(pFileInfo);
 | 
						|
  pFileInfo = NULL;
 | 
						|
  Status = ShellCloseFile(&FileHandle);
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  Print(L"read, write, create, getinfo - pass\r\n");
 | 
						|
 | 
						|
  Status = ShellOpenFileByName(FileName, 
 | 
						|
                               &FileHandle, 
 | 
						|
                               EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE, 
 | 
						|
                               0
 | 
						|
                               );
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  pFileInfo = ShellGetFileInfo(FileHandle);
 | 
						|
  ASSERT(pFileInfo != NULL);
 | 
						|
  pFileInfo->FileSize = 0x20;
 | 
						|
  Status = ShellSetFileInfo(FileHandle, pFileInfo);
 | 
						|
  FreePool(pFileInfo);
 | 
						|
  pFileInfo = NULL; 
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  pFileInfo = ShellGetFileInfo(FileHandle);
 | 
						|
  ASSERT(pFileInfo != NULL);
 | 
						|
  ASSERT(StrCmp(pFileInfo->FileName, FileName) == 0);
 | 
						|
  ASSERT(pFileInfo->PhysicalSize == 0x20);
 | 
						|
  ASSERT(pFileInfo->FileSize == 0x20);
 | 
						|
  ASSERT((pFileInfo->Attribute&EFI_FILE_DIRECTORY)==0);
 | 
						|
  FreePool(pFileInfo);
 | 
						|
  Status = ShellGetFileSize(FileHandle, &Size);
 | 
						|
  ASSERT(Size == 0x20);
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  Status = ShellCloseFile(&FileHandle);
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  Print(L"setinfo and change size, getsize - pass\r\n");
 | 
						|
  
 | 
						|
  Status = ShellOpenFileByName(FileName, 
 | 
						|
                               &FileHandle, 
 | 
						|
                               EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE, 
 | 
						|
                               0
 | 
						|
                               );
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
 | 
						|
  pFileInfo = ShellGetFileInfo(FileHandle);
 | 
						|
  ASSERT(pFileInfo != NULL);
 | 
						|
  ASSERT(StrCmp(pFileInfo->FileName, FileName) == 0);
 | 
						|
  ASSERT(pFileInfo->PhysicalSize == 0x20);
 | 
						|
  ASSERT(pFileInfo->FileSize == 0x20);
 | 
						|
  ASSERT((pFileInfo->Attribute&EFI_FILE_DIRECTORY)==0);
 | 
						|
  FreePool(pFileInfo);
 | 
						|
  pFileInfo = NULL;   
 | 
						|
  Status = ShellDeleteFile(&FileHandle);
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  Print(L"reopen file - pass\r\n");
 | 
						|
 | 
						|
  Status = ShellOpenFileByName(FileName, 
 | 
						|
                               &FileHandle, 
 | 
						|
                               EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE, 
 | 
						|
                               0
 | 
						|
                               );
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  pFileInfo = ShellGetFileInfo(FileHandle);
 | 
						|
  ASSERT(pFileInfo != NULL);
 | 
						|
  ASSERT(StrCmp(pFileInfo->FileName, FileName) == 0);
 | 
						|
  ASSERT(pFileInfo->PhysicalSize == 0x0);
 | 
						|
  ASSERT(pFileInfo->FileSize == 0x0);
 | 
						|
  ASSERT((pFileInfo->Attribute&EFI_FILE_DIRECTORY)==0);
 | 
						|
  FreePool(pFileInfo);
 | 
						|
  Status = ShellDeleteFile(&FileHandle);
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  Print(L"size of empty - pass\r\n");
 | 
						|
 | 
						|
  Status = ShellOpenFileByName(FileName, 
 | 
						|
                               &FileHandle, 
 | 
						|
                               EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE, 
 | 
						|
                               0
 | 
						|
                               );
 | 
						|
  ASSERT(Status == EFI_NOT_FOUND);
 | 
						|
  ASSERT(FileHandle == NULL);
 | 
						|
 | 
						|
  Status = ShellCreateDirectory(FileName, &FileHandle);
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  ASSERT(FileHandle != NULL);
 | 
						|
  pFileInfo = ShellGetFileInfo(FileHandle);
 | 
						|
  ASSERT(pFileInfo != NULL);
 | 
						|
  ASSERT(StrCmp(pFileInfo->FileName, FileName) == 0);
 | 
						|
  ASSERT(pFileInfo->Attribute&EFI_FILE_DIRECTORY);
 | 
						|
  Status = ShellDeleteFile(&FileHandle);
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  Print(L"Directory create - pass\r\n");
 | 
						|
  
 | 
						|
  // FindFirst and FindNext
 | 
						|
  StrCpy(FileName, L"testDir");
 | 
						|
  Status = ShellCreateDirectory(FileName, &FileHandle);
 | 
						|
  Status = ShellCloseFile(&FileHandle);
 | 
						|
  StrCat(FileName, L"\\File.txt");
 | 
						|
  Status = ShellOpenFileByName(FileName, 
 | 
						|
                               &FileHandle, 
 | 
						|
                               EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE, 
 | 
						|
                               0
 | 
						|
                               );
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  Status = ShellCloseFile(&FileHandle);
 | 
						|
  StrCpy(FileName, L"testDir");
 | 
						|
  Status = ShellOpenFileByName(FileName, 
 | 
						|
                               &FileHandle, 
 | 
						|
                               EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE, 
 | 
						|
                               0
 | 
						|
                               );
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  Status = ShellFindFirstFile(FileHandle, &pFileInfo);
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  Status = ShellFindNextFile(FileHandle, pFileInfo, &NoFile);
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  ASSERT(NoFile == FALSE);
 | 
						|
  Status = ShellFindNextFile(FileHandle, pFileInfo, &NoFile);
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  ASSERT(NoFile == FALSE);
 | 
						|
  Status = ShellFindNextFile(FileHandle, pFileInfo, &NoFile);
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  /// @todo - why is NoFile never set? limitation of NT32 file system?
 | 
						|
  Status = ShellDeleteFile(&FileHandle);
 | 
						|
  ASSERT(Status == RETURN_WARN_DELETE_FAILURE);
 | 
						|
  Print(L"FindFirst - pass\r\n");
 | 
						|
  Print(L"FindNext - Verify with real EFI system.  Cant verify NoFile under NT32\r\n");
 | 
						|
 | 
						|
  // open and close meta arg
 | 
						|
  Status = ShellOpenFileMetaArg(L"testDir\\*.*", EFI_FILE_MODE_READ, &pShellFileInfo);
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  ASSERT(pShellFileInfo->Status == 0);
 | 
						|
  ASSERT(StrCmp(pShellFileInfo->FileName, L"File.txt") == 0);
 | 
						|
  ASSERT(pShellFileInfo->Handle);
 | 
						|
  ASSERT(pShellFileInfo->Info);
 | 
						|
  ASSERT(pShellFileInfo->Info->FileSize == 0);
 | 
						|
  ASSERT(StrCmp(pShellFileInfo->Info->FileName, L"File.txt") == 0);
 | 
						|
  ASSERT(pShellFileInfo->Info->Attribute == 0);
 | 
						|
 | 
						|
  Status = ShellCloseFileMetaArg(&pShellFileInfo);
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  Print(L"Open/Close Meta Arg - pass\r\n");
 | 
						|
 | 
						|
  // now delete that file and that directory
 | 
						|
  StrCat(FileName, L"\\File.txt");
 | 
						|
  Status = ShellOpenFileByName(FileName, 
 | 
						|
                               &FileHandle, 
 | 
						|
                               EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE, 
 | 
						|
                               0
 | 
						|
                               );
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  Status = ShellDeleteFile(&FileHandle);
 | 
						|
  StrCpy(FileName, L"testDir");
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  Status = ShellOpenFileByName(FileName, 
 | 
						|
                               &FileHandle, 
 | 
						|
                               EFI_FILE_MODE_CREATE|EFI_FILE_MODE_READ|EFI_FILE_MODE_WRITE, 
 | 
						|
                               0
 | 
						|
                               );
 | 
						|
  Status = ShellDeleteFile(&FileHandle);
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
 | 
						|
  // get environment variable
 | 
						|
  // made for testing under nt32
 | 
						|
  ASSERT(StrCmp(ShellGetEnvironmentVariable(L"path"), L".;f8:\\efi\\tools;f8:\\efi\\boot;f8:\\;f9:\\efi\\tools;f9:\\efi\\boot;f9:\\") == 0);
 | 
						|
  Print(L"ShellGetEnvironmentVariable - pass\r\n");
 | 
						|
 | 
						|
  // set environment variable
 | 
						|
  Status = ShellSetEnvironmentVariable(L"", L"", FALSE);
 | 
						|
  ASSERT(Status == EFI_UNSUPPORTED);
 | 
						|
  Print(L"ShellSetEnvironmentVariable - pass\r\n");
 | 
						|
 | 
						|
  // ShellExecute
 | 
						|
  Status = ShellExecute(&ImageHandle, L"EmptyApplication.efi", TRUE, NULL, NULL);
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  // the pass printout for this is performed by EmptyApplication
 | 
						|
  Print(L"\r\n");
 | 
						|
    
 | 
						|
  // command line param functions
 | 
						|
  Status = ShellCommandLineParse(ParamList, &List, NULL, FALSE);
 | 
						|
  // if you put an invalid parameter you SHOULD hit this assert.
 | 
						|
  ASSERT_EFI_ERROR(Status);
 | 
						|
  if (List) {
 | 
						|
    ASSERT(ShellCommandLineGetFlag(List, L"/Param5") == FALSE);
 | 
						|
    ASSERT(ShellCommandLineGetFlag(List, L"/Param1") != FALSE);
 | 
						|
    ASSERT(StrCmp(ShellCommandLineGetValue(List, L"/Param2"), L"Val1")==0);
 | 
						|
    ASSERT(StrCmp(ShellCommandLineGetRawValue(List, 0), L"SimpleApplication.efi")==0);
 | 
						|
 | 
						|
    ShellCommandLineFreeVarList(List);
 | 
						|
  } else {
 | 
						|
    Print(L"param checking skipped.\r\n");
 | 
						|
  }
 | 
						|
 | 
						|
  // page break mode (done last so we can see the results)
 | 
						|
  // we set this true at the begining of the program
 | 
						|
  // this is enough lines to trigger the page...
 | 
						|
  Print(L"1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n12\r\n13\r\n14\r\n15\r\n16\r\n17\r\n18\r\n19\r\n20\r\n21\r\n22\r\n23\r\n24\r\n25\r\n26\r\n27\r\n28\r\n29\r\n30\r\n31\r\n");
 | 
						|
  ShellSetPageBreakMode(FALSE);
 | 
						|
  Print(L"1\r\n2\r\n3\r\n4\r\n5\r\n6\r\n7\r\n8\r\n9\r\n10\r\n11\r\n12\r\n13\r\n14\r\n15\r\n16\r\n17\r\n18\r\n19\r\n20\r\n21\r\n22\r\n23\r\n24\r\n25\r\n26\r\n27\r\n28\r\n29\r\n30\r\n31\r\n32\r\n33\r\n34\r\n35\r\n36\r\n37\r\n38\r\n39\r\n40\r\n41\r\n42\r\n43\r\n44\r\n45\r\n46\r\n47\r\n48\r\n49\r\n50\r\n51\r\n52\r\n53\r\n54\r\n55\r\n56\r\n57\r\n58\r\n59\r\n60\r\n");
 | 
						|
 | 
						|
  return EFI_SUCCESS;
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
/*
 | 
						|
done - ShellGetFileInfo
 | 
						|
done - ShellSetFileInfo
 | 
						|
done - ShellOpenFileByDevicePath
 | 
						|
done - ShellOpenFileByName
 | 
						|
done - ShellCreateDirectory
 | 
						|
done - ShellReadFile
 | 
						|
done - ShellWriteFile
 | 
						|
done - ShellCloseFile
 | 
						|
done - ShellDeleteFile
 | 
						|
done - ShellSetFilePosition
 | 
						|
done - ShellGetFilePosition
 | 
						|
???? - ShellFlushFile
 | 
						|
done - ShellFindFirstFile
 | 
						|
done - ShellFindNextFile
 | 
						|
done - ShellGetFileSize
 | 
						|
done - ShellGetExecutionBreakFlag
 | 
						|
done - ShellGetEnvironmentVariable
 | 
						|
done - ShellSetEnvironmentVariable
 | 
						|
done - ShellExecute
 | 
						|
done - ShellGetCurrentDir
 | 
						|
done - ShellSetPageBreakMode
 | 
						|
done - ShellOpenFileMetaArg
 | 
						|
done - ShellCloseFileMetaArg
 | 
						|
done - ShellCommandLineParse
 | 
						|
done - ShellCommandLineFreeVarList
 | 
						|
done - ShellCommandLineGetFlag
 | 
						|
done - ShellCommandLineGetValue
 | 
						|
done - ShellCommandLineGetRawValue
 | 
						|
*/ |