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-2009, Intel Corporation
7 All rights reserved. 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 <Library/UefiApplicationEntryPoint.h>
19 #include <Library/UefiLib.h>
20 #include <Library/ShellLib.h>
21 #include <Library/DebugLib.h>
22 #include <Library/MemoryAllocationLib.h>
24 SHELL_PARAM_ITEM ParamList
[] = {
25 {L
"/Param1", TypeFlag
},
26 {L
"/Param2", TypeValue
},
30 as the real entry point for the application.
32 @param[in] ImageHandle The firmware allocated handle for the EFI image.
33 @param[in] SystemTable A pointer to the EFI System Table.
35 @retval EFI_SUCCESS The entry point is executed successfully.
36 @retval other Some error occurs when executing this entry point.
42 IN EFI_HANDLE ImageHandle
,
43 IN EFI_SYSTEM_TABLE
*SystemTable
46 EFI_FILE_HANDLE FileHandle
;
52 EFI_FILE_INFO
*pFileInfo
;
55 EFI_SHELL_FILE_INFO
*pShellFileInfo
;
59 StrCpy(FileName
, L
"testfile.txt");
64 pShellFileInfo
= NULL
;
67 ASSERT(ShellGetExecutionBreakFlag() == FALSE
);
68 ASSERT(StrCmp(ShellGetCurrentDir(NULL
), L
"f8:\\") == 0);
69 Print(L
"execution break and get cur dir - pass\r\n");
71 ShellSetPageBreakMode(TRUE
);
73 Status
= ShellOpenFileByName(FileName
,
75 EFI_FILE_MODE_CREATE
|EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
78 ASSERT_EFI_ERROR(Status
);
80 BufferSize
= StrSize(FileName
);
81 Status
= ShellWriteFile(FileHandle
, &BufferSize
, FileName
);
82 ASSERT_EFI_ERROR(Status
);
83 Status
= ShellGetFilePosition(FileHandle
, &Position
);
84 ASSERT_EFI_ERROR(Status
);
85 ASSERT(Position
== 0x1A);
86 Status
= ShellSetFilePosition(FileHandle
, 0);
87 ASSERT_EFI_ERROR(Status
);
88 BufferSize
= sizeof(Buffer
) * sizeof(Buffer
[0]);
89 Status
= ShellReadFile(FileHandle
, &BufferSize
, Buffer
);
90 ASSERT_EFI_ERROR(Status
);
91 ASSERT(BufferSize
== 0x1A);
92 ASSERT(StrCmp((CHAR16
*)Buffer
, FileName
) == 0);
93 pFileInfo
= ShellGetFileInfo(FileHandle
);
94 ASSERT(pFileInfo
!= NULL
);
95 ASSERT(StrCmp(pFileInfo
->FileName
, FileName
) == 0);
96 ASSERT(pFileInfo
->FileSize
== 0x1A);
99 Status
= ShellCloseFile(&FileHandle
);
100 ASSERT_EFI_ERROR(Status
);
101 Print(L
"read, write, create, getinfo - pass\r\n");
103 Status
= ShellOpenFileByName(FileName
,
105 EFI_FILE_MODE_CREATE
|EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
108 ASSERT_EFI_ERROR(Status
);
109 pFileInfo
= ShellGetFileInfo(FileHandle
);
110 ASSERT(pFileInfo
!= NULL
);
111 pFileInfo
->FileSize
= 0x20;
112 Status
= ShellSetFileInfo(FileHandle
, pFileInfo
);
115 ASSERT_EFI_ERROR(Status
);
116 pFileInfo
= ShellGetFileInfo(FileHandle
);
117 ASSERT(pFileInfo
!= NULL
);
118 ASSERT(StrCmp(pFileInfo
->FileName
, FileName
) == 0);
119 ASSERT(pFileInfo
->PhysicalSize
== 0x20);
120 ASSERT(pFileInfo
->FileSize
== 0x20);
121 ASSERT((pFileInfo
->Attribute
&EFI_FILE_DIRECTORY
)==0);
123 Status
= ShellGetFileSize(FileHandle
, &Size
);
124 ASSERT(Size
== 0x20);
125 ASSERT_EFI_ERROR(Status
);
126 Status
= ShellCloseFile(&FileHandle
);
127 ASSERT_EFI_ERROR(Status
);
128 Print(L
"setinfo and change size, getsize - pass\r\n");
130 Status
= ShellOpenFileByName(FileName
,
132 EFI_FILE_MODE_CREATE
|EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
135 ASSERT_EFI_ERROR(Status
);
137 pFileInfo
= ShellGetFileInfo(FileHandle
);
138 ASSERT(pFileInfo
!= NULL
);
139 ASSERT(StrCmp(pFileInfo
->FileName
, FileName
) == 0);
140 ASSERT(pFileInfo
->PhysicalSize
== 0x20);
141 ASSERT(pFileInfo
->FileSize
== 0x20);
142 ASSERT((pFileInfo
->Attribute
&EFI_FILE_DIRECTORY
)==0);
145 Status
= ShellDeleteFile(&FileHandle
);
146 ASSERT_EFI_ERROR(Status
);
147 Print(L
"reopen file - pass\r\n");
149 Status
= ShellOpenFileByName(FileName
,
151 EFI_FILE_MODE_CREATE
|EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
154 ASSERT_EFI_ERROR(Status
);
155 pFileInfo
= ShellGetFileInfo(FileHandle
);
156 ASSERT(pFileInfo
!= NULL
);
157 ASSERT(StrCmp(pFileInfo
->FileName
, FileName
) == 0);
158 ASSERT(pFileInfo
->PhysicalSize
== 0x0);
159 ASSERT(pFileInfo
->FileSize
== 0x0);
160 ASSERT((pFileInfo
->Attribute
&EFI_FILE_DIRECTORY
)==0);
162 Status
= ShellDeleteFile(&FileHandle
);
163 ASSERT_EFI_ERROR(Status
);
164 Print(L
"size of empty - pass\r\n");
166 Status
= ShellOpenFileByName(FileName
,
168 EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
171 ASSERT(Status
== EFI_NOT_FOUND
);
172 ASSERT(FileHandle
== NULL
);
174 Status
= ShellCreateDirectory(FileName
, &FileHandle
);
175 ASSERT_EFI_ERROR(Status
);
176 ASSERT(FileHandle
!= NULL
);
177 pFileInfo
= ShellGetFileInfo(FileHandle
);
178 ASSERT(pFileInfo
!= NULL
);
179 ASSERT(StrCmp(pFileInfo
->FileName
, FileName
) == 0);
180 ASSERT(pFileInfo
->Attribute
&EFI_FILE_DIRECTORY
);
181 Status
= ShellDeleteFile(&FileHandle
);
182 ASSERT_EFI_ERROR(Status
);
183 Print(L
"Directory create - pass\r\n");
185 // FindFirst and FindNext
186 StrCpy(FileName
, L
"testDir");
187 Status
= ShellCreateDirectory(FileName
, &FileHandle
);
188 Status
= ShellCloseFile(&FileHandle
);
189 StrCat(FileName
, L
"\\File.txt");
190 Status
= ShellOpenFileByName(FileName
,
192 EFI_FILE_MODE_CREATE
|EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
195 ASSERT_EFI_ERROR(Status
);
196 Status
= ShellCloseFile(&FileHandle
);
197 StrCpy(FileName
, L
"testDir");
198 Status
= ShellOpenFileByName(FileName
,
200 EFI_FILE_MODE_CREATE
|EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
203 ASSERT_EFI_ERROR(Status
);
204 Status
= ShellFindFirstFile(FileHandle
, &pFileInfo
);
205 ASSERT_EFI_ERROR(Status
);
206 Status
= ShellFindNextFile(FileHandle
, pFileInfo
, &NoFile
);
207 ASSERT_EFI_ERROR(Status
);
208 ASSERT(NoFile
== FALSE
);
209 Status
= ShellFindNextFile(FileHandle
, pFileInfo
, &NoFile
);
210 ASSERT_EFI_ERROR(Status
);
211 ASSERT(NoFile
== FALSE
);
212 Status
= ShellFindNextFile(FileHandle
, pFileInfo
, &NoFile
);
213 ASSERT_EFI_ERROR(Status
);
214 ///@todo - why is NoFile never set? limitation of NT32 file system?
215 Status
= ShellDeleteFile(&FileHandle
);
216 ASSERT(Status
== RETURN_WARN_DELETE_FAILURE
);
217 Print(L
"FindFirst - pass\r\n");
218 Print(L
"FindNext - Verify with real EFI system. Cant verify NoFile under NT32\r\n");
220 // open and close meta arg
221 Status
= ShellOpenFileMetaArg(L
"testDir\\*.*", EFI_FILE_MODE_READ
, &pShellFileInfo
);
222 ASSERT_EFI_ERROR(Status
);
223 ASSERT(pShellFileInfo
->Status
== 0);
224 ASSERT(StrCmp(pShellFileInfo
->FileName
, L
"File.txt") == 0);
225 ASSERT(pShellFileInfo
->Handle
);
226 ASSERT(pShellFileInfo
->Info
);
227 ASSERT(pShellFileInfo
->Info
->FileSize
== 0);
228 ASSERT(StrCmp(pShellFileInfo
->Info
->FileName
, L
"File.txt") == 0);
229 ASSERT(pShellFileInfo
->Info
->Attribute
== 0);
231 Status
= ShellCloseFileMetaArg(&pShellFileInfo
);
232 ASSERT_EFI_ERROR(Status
);
233 Print(L
"Open/Close Meta Arg - pass\r\n");
235 // now delete that file and that directory
236 StrCat(FileName
, L
"\\File.txt");
237 Status
= ShellOpenFileByName(FileName
,
239 EFI_FILE_MODE_CREATE
|EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
242 ASSERT_EFI_ERROR(Status
);
243 Status
= ShellDeleteFile(&FileHandle
);
244 StrCpy(FileName
, L
"testDir");
245 ASSERT_EFI_ERROR(Status
);
246 Status
= ShellOpenFileByName(FileName
,
248 EFI_FILE_MODE_CREATE
|EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
251 Status
= ShellDeleteFile(&FileHandle
);
252 ASSERT_EFI_ERROR(Status
);
254 // get environment variable
255 // made for testing under nt32
256 ASSERT(StrCmp(ShellGetEnvironmentVariable(L
"path"), L
".;f8:\\efi\\tools;f8:\\efi\\boot;f8:\\;f9:\\efi\\tools;f9:\\efi\\boot;f9:\\") == 0);
257 Print(L
"ShellGetEnvironmentVariable - pass\r\n");
259 // set environment variable
260 Status
= ShellSetEnvironmentVariable(L
"", L
"", FALSE
);
261 ASSERT(Status
== EFI_UNSUPPORTED
);
262 Print(L
"ShellSetEnvironmentVariable - pass\r\n");
265 Status
= ShellExecute(&ImageHandle
, L
"EmptyApplication.efi", TRUE
, NULL
, NULL
);
266 ASSERT_EFI_ERROR(Status
);
267 // the pass printout for this is performed by EmptyApplication
270 // command line param functions
271 Status
= ShellCommandLineParse(ParamList
, &List
, NULL
, FALSE
);
272 // if you put an invalid parameter you SHOULD hit this assert.
273 ASSERT_EFI_ERROR(Status
);
275 ASSERT(ShellCommandLineGetFlag(List
, L
"/Param5") == FALSE
);
276 ASSERT(ShellCommandLineGetFlag(List
, L
"/Param1") != FALSE
);
277 ASSERT(StrCmp(ShellCommandLineGetValue(List
, L
"/Param2"), L
"Val1")==0);
278 ASSERT(StrCmp(ShellCommandLineGetRawValue(List
, 0), L
"SimpleApplication.efi")==0);
280 ShellCommandLineFreeVarList(List
);
282 Print(L
"param checking skipped.\r\n");
285 // page break mode (done last so we can see the results)
286 // we set this true at the begining of the program
287 // this is enough lines to trigger the page...
288 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");
289 ShellSetPageBreakMode(FALSE
);
290 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");
297 done - ShellGetFileInfo
298 done - ShellSetFileInfo
299 done - ShellOpenFileByDevicePath
300 done - ShellOpenFileByName
301 done - ShellCreateDirectory
303 done - ShellWriteFile
304 done - ShellCloseFile
305 done - ShellDeleteFile
306 done - ShellSetFilePosition
307 done - ShellGetFilePosition
308 ???? - ShellFlushFile
309 done - ShellFindFirstFile
310 done - ShellFindNextFile
311 done - ShellGetFileSize
312 done - ShellGetExecutionBreakFlag
313 done - ShellGetEnvironmentVariable
314 done - ShellSetEnvironmentVariable
316 done - ShellGetCurrentDir
317 done - ShellSetPageBreakMode
318 done - ShellOpenFileMetaArg
319 done - ShellCloseFileMetaArg
320 done - ShellCommandLineParse
321 done - ShellCommandLineFreeVarList
322 done - ShellCommandLineGetFlag
323 done - ShellCommandLineGetValue
324 done - ShellCommandLineGetRawValue