2 This is a simple shell application
4 This should be executed with "/Param2 Val1" and "/Param1" as the 2 command line options!
6 Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR>
7 This program and the accompanying materials
8 are licensed and made available under the terms and conditions of the BSD License
9 which accompanies this distribution. The full text of the license may be found at
10 http://opensource.org/licenses/bsd-license.php
12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
18 #include <Guid/FileInfo.h>
19 #include <Protocol/SimpleFileSystem.h>
20 #include <Protocol/LoadedImage.h>
21 #include <Protocol/EfiShellInterface.h>
22 #include <Protocol/EfiShellEnvironment2.h>
23 #include <Protocol/EfiShell.h>
24 #include <Protocol/EfiShellParameters.h>
25 #include <Library/UefiApplicationEntryPoint.h>
26 #include <Library/UefiLib.h>
27 #include <Library/ShellLib.h>
28 #include <Library/DebugLib.h>
29 #include <Library/MemoryAllocationLib.h>
31 SHELL_PARAM_ITEM ParamList
[] = {
32 {L
"/Param1", TypeFlag
},
33 {L
"/Param2", TypeValue
},
34 {L
"/Param3", TypeDoubleValue
},
35 {L
"/Param4", TypeMaxValue
},
39 as the real entry point for the application.
41 @param[in] ImageHandle The firmware allocated handle for the EFI image.
42 @param[in] SystemTable A pointer to the EFI System Table.
44 @retval EFI_SUCCESS The entry point is executed successfully.
45 @retval other Some error occurs when executing this entry point.
51 IN EFI_HANDLE ImageHandle
,
52 IN EFI_SYSTEM_TABLE
*SystemTable
55 SHELL_FILE_HANDLE FileHandle
;
61 EFI_FILE_INFO
*pFileInfo
;
64 EFI_SHELL_FILE_INFO
*pShellFileInfo
;
66 // CONST CHAR16 *Tester;
69 StrCpy(FileName
, L
"testfile.txt");
74 pShellFileInfo
= NULL
;
77 // command line param functions
78 Status
= ShellCommandLineParse(ParamList
, &List
, NULL
, FALSE
);
79 // if you put an invalid parameter you SHOULD hit this assert.
80 ASSERT_EFI_ERROR(Status
);
82 ASSERT(ShellCommandLineGetFlag(List
, L
"/Param5") == FALSE
);
83 ASSERT(ShellCommandLineGetFlag(List
, L
"/Param1") != FALSE
);
84 ASSERT(StrCmp(ShellCommandLineGetValue(List
, L
"/Param2"), L
"Val1")==0);
85 ASSERT(StrCmp(ShellCommandLineGetRawValue(List
, 0), L
"SimpleApplication.efi")==0);
86 // Tester = ShellCommandLineGetValue(List, L"/Param3");
87 // Tester = ShellCommandLineGetValue(List, L"/Param4");
89 ShellCommandLineFreeVarList(List
);
91 Print(L
"param checking skipped.\r\n");
94 // return (EFI_SUCCESS);
97 ASSERT(ShellGetExecutionBreakFlag() == FALSE
);
98 ASSERT(StrCmp(ShellGetCurrentDir(NULL
), L
"f10:\\") == 0);
99 Print(L
"execution break and get cur dir - pass\r\n");
101 ShellSetPageBreakMode(TRUE
);
103 Status
= ShellOpenFileByName(FileName
,
105 EFI_FILE_MODE_CREATE
|EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
108 ASSERT_EFI_ERROR(Status
);
110 BufferSize
= StrSize(FileName
);
111 Status
= ShellWriteFile(FileHandle
, &BufferSize
, FileName
);
112 ASSERT_EFI_ERROR(Status
);
113 Status
= ShellGetFilePosition(FileHandle
, &Position
);
114 ASSERT_EFI_ERROR(Status
);
115 ASSERT(Position
== 0x1A);
116 Status
= ShellSetFilePosition(FileHandle
, 0);
117 ASSERT_EFI_ERROR(Status
);
118 BufferSize
= sizeof(Buffer
) * sizeof(Buffer
[0]);
119 Status
= ShellReadFile(FileHandle
, &BufferSize
, Buffer
);
120 ASSERT_EFI_ERROR(Status
);
121 ASSERT(BufferSize
== 0x1A);
122 ASSERT(StrCmp((CHAR16
*)Buffer
, FileName
) == 0);
123 pFileInfo
= ShellGetFileInfo(FileHandle
);
124 ASSERT(pFileInfo
!= NULL
);
125 ASSERT(StrCmp(pFileInfo
->FileName
, FileName
) == 0);
126 ASSERT(pFileInfo
->FileSize
== 0x1A);
129 Status
= ShellCloseFile(&FileHandle
);
130 ASSERT_EFI_ERROR(Status
);
131 Print(L
"read, write, create, getinfo - pass\r\n");
133 Status
= ShellOpenFileByName(FileName
,
135 EFI_FILE_MODE_CREATE
|EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
138 ASSERT_EFI_ERROR(Status
);
139 pFileInfo
= ShellGetFileInfo(FileHandle
);
140 ASSERT(pFileInfo
!= NULL
);
141 pFileInfo
->FileSize
= 0x20;
142 Status
= ShellSetFileInfo(FileHandle
, pFileInfo
);
145 ASSERT_EFI_ERROR(Status
);
146 pFileInfo
= ShellGetFileInfo(FileHandle
);
147 ASSERT(pFileInfo
!= NULL
);
148 ASSERT(StrCmp(pFileInfo
->FileName
, FileName
) == 0);
149 ASSERT(pFileInfo
->PhysicalSize
== 0x20);
150 ASSERT(pFileInfo
->FileSize
== 0x20);
151 ASSERT((pFileInfo
->Attribute
&EFI_FILE_DIRECTORY
)==0);
153 Status
= ShellGetFileSize(FileHandle
, &Size
);
154 ASSERT(Size
== 0x20);
155 ASSERT_EFI_ERROR(Status
);
156 Status
= ShellCloseFile(&FileHandle
);
157 ASSERT_EFI_ERROR(Status
);
158 Print(L
"setinfo and change size, getsize - pass\r\n");
160 Status
= ShellOpenFileByName(FileName
,
162 EFI_FILE_MODE_CREATE
|EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
165 ASSERT_EFI_ERROR(Status
);
167 pFileInfo
= ShellGetFileInfo(FileHandle
);
168 ASSERT(pFileInfo
!= NULL
);
169 ASSERT(StrCmp(pFileInfo
->FileName
, FileName
) == 0);
170 ASSERT(pFileInfo
->PhysicalSize
== 0x20);
171 ASSERT(pFileInfo
->FileSize
== 0x20);
172 ASSERT((pFileInfo
->Attribute
&EFI_FILE_DIRECTORY
)==0);
175 Status
= ShellDeleteFile(&FileHandle
);
176 ASSERT_EFI_ERROR(Status
);
177 Print(L
"reopen file - pass\r\n");
179 Status
= ShellOpenFileByName(FileName
,
181 EFI_FILE_MODE_CREATE
|EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
184 ASSERT_EFI_ERROR(Status
);
185 pFileInfo
= ShellGetFileInfo(FileHandle
);
186 ASSERT(pFileInfo
!= NULL
);
187 ASSERT(StrCmp(pFileInfo
->FileName
, FileName
) == 0);
188 ASSERT(pFileInfo
->PhysicalSize
== 0x0);
189 ASSERT(pFileInfo
->FileSize
== 0x0);
190 ASSERT((pFileInfo
->Attribute
&EFI_FILE_DIRECTORY
)==0);
192 Status
= ShellDeleteFile(&FileHandle
);
193 ASSERT_EFI_ERROR(Status
);
194 Print(L
"size of empty - pass\r\n");
196 Status
= ShellOpenFileByName(FileName
,
198 EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
201 ASSERT(Status
== EFI_NOT_FOUND
);
202 ASSERT(FileHandle
== NULL
);
204 Status
= ShellCreateDirectory(FileName
, &FileHandle
);
205 ASSERT_EFI_ERROR(Status
);
206 ASSERT(FileHandle
!= NULL
);
207 pFileInfo
= ShellGetFileInfo(FileHandle
);
208 ASSERT(pFileInfo
!= NULL
);
209 ASSERT(StrCmp(pFileInfo
->FileName
, FileName
) == 0);
210 ASSERT(pFileInfo
->Attribute
&EFI_FILE_DIRECTORY
);
211 Status
= ShellDeleteFile(&FileHandle
);
212 ASSERT_EFI_ERROR(Status
);
213 Print(L
"Directory create - pass\r\n");
215 // FindFirst and FindNext
216 StrCpy(FileName
, L
"testDir");
217 Status
= ShellCreateDirectory(FileName
, &FileHandle
);
218 Status
= ShellCloseFile(&FileHandle
);
219 StrCat(FileName
, L
"\\File.txt");
220 Status
= ShellOpenFileByName(FileName
,
222 EFI_FILE_MODE_CREATE
|EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
225 ASSERT_EFI_ERROR(Status
);
226 Status
= ShellCloseFile(&FileHandle
);
227 StrCpy(FileName
, L
"testDir");
228 Status
= ShellOpenFileByName(FileName
,
230 EFI_FILE_MODE_CREATE
|EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
233 ASSERT_EFI_ERROR(Status
);
234 Status
= ShellFindFirstFile(FileHandle
, &pFileInfo
);
235 ASSERT_EFI_ERROR(Status
);
236 Status
= ShellFindNextFile(FileHandle
, pFileInfo
, &NoFile
);
237 ASSERT_EFI_ERROR(Status
);
238 ASSERT(NoFile
== FALSE
);
239 Status
= ShellFindNextFile(FileHandle
, pFileInfo
, &NoFile
);
240 ASSERT_EFI_ERROR(Status
);
241 ASSERT(NoFile
== FALSE
);
242 Status
= ShellFindNextFile(FileHandle
, pFileInfo
, &NoFile
);
243 ASSERT_EFI_ERROR(Status
);
244 ///@todo - why is NoFile never set? limitation of NT32 file system?
245 Status
= ShellDeleteFile(&FileHandle
);
246 ASSERT(Status
== RETURN_WARN_DELETE_FAILURE
);
247 Print(L
"FindFirst - pass\r\n");
248 Print(L
"FindNext - Verify with real EFI system. Cant verify NoFile under NT32\r\n");
250 // open and close meta arg
251 Status
= ShellOpenFileMetaArg(L
"testDir\\*.*", EFI_FILE_MODE_READ
, &pShellFileInfo
);
252 ASSERT_EFI_ERROR(Status
);
253 ASSERT(pShellFileInfo
->Status
== 0);
254 ASSERT(StrCmp(pShellFileInfo
->FileName
, L
"File.txt") == 0);
255 ASSERT(pShellFileInfo
->Handle
);
256 ASSERT(pShellFileInfo
->Info
);
257 ASSERT(pShellFileInfo
->Info
->FileSize
== 0);
258 ASSERT(StrCmp(pShellFileInfo
->Info
->FileName
, L
"File.txt") == 0);
259 ASSERT(pShellFileInfo
->Info
->Attribute
== 0);
261 Status
= ShellCloseFileMetaArg(&pShellFileInfo
);
262 ASSERT_EFI_ERROR(Status
);
263 Print(L
"Open/Close Meta Arg - pass\r\n");
265 // now delete that file and that directory
266 StrCat(FileName
, L
"\\File.txt");
267 Status
= ShellOpenFileByName(FileName
,
269 EFI_FILE_MODE_CREATE
|EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
272 ASSERT_EFI_ERROR(Status
);
273 Status
= ShellDeleteFile(&FileHandle
);
274 StrCpy(FileName
, L
"testDir");
275 ASSERT_EFI_ERROR(Status
);
276 Status
= ShellOpenFileByName(FileName
,
278 EFI_FILE_MODE_CREATE
|EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
281 Status
= ShellDeleteFile(&FileHandle
);
282 ASSERT_EFI_ERROR(Status
);
284 // get environment variable
285 // made for testing under nt32
286 ASSERT(StrCmp(ShellGetEnvironmentVariable(L
"path"), L
".;f10:\\efi\\tools;f10:\\efi\\boot;f10:\\;f9:\\efi\\tools;f9:\\efi\\boot;f9:\\") == 0);
287 Print(L
"ShellGetEnvironmentVariable - pass\r\n");
289 // set environment variable
290 Status
= ShellSetEnvironmentVariable(L
"", L
"", FALSE
);
291 ASSERT(Status
== EFI_UNSUPPORTED
);
292 Print(L
"ShellSetEnvironmentVariable - pass\r\n");
295 Status
= ShellExecute(&ImageHandle
, L
"EmptyApplication.efi", TRUE
, NULL
, NULL
);
296 ASSERT_EFI_ERROR(Status
);
297 // the pass printout for this is performed by EmptyApplication
300 // page break mode (done last so we can see the results)
301 // we set this true at the begining of the program
302 // this is enough lines to trigger the page...
303 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");
304 ShellSetPageBreakMode(FALSE
);
305 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");
312 done - ShellGetFileInfo
313 done - ShellSetFileInfo
314 done - ShellOpenFileByDevicePath
315 done - ShellOpenFileByName
316 done - ShellCreateDirectory
318 done - ShellWriteFile
319 done - ShellCloseFile
320 done - ShellDeleteFile
321 done - ShellSetFilePosition
322 done - ShellGetFilePosition
323 ???? - ShellFlushFile
324 done - ShellFindFirstFile
325 done - ShellFindNextFile
326 done - ShellGetFileSize
327 done - ShellGetExecutionBreakFlag
328 done - ShellGetEnvironmentVariable
329 done - ShellSetEnvironmentVariable
331 done - ShellGetCurrentDir
332 done - ShellSetPageBreakMode
333 done - ShellOpenFileMetaArg
334 done - ShellCloseFileMetaArg
335 done - ShellCommandLineParse
336 done - ShellCommandLineFreeVarList
337 done - ShellCommandLineGetFlag
338 done - ShellCommandLineGetValue
339 done - ShellCommandLineGetRawValue