/** @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-2009, 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 #include #include #include #include #include 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 */