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, 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
, *pShellFileInfo2
;
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(FileHandle
== NULL
);
101 ASSERT_EFI_ERROR(Status
);
102 Print(L
"read, write, create, getinfo - pass\r\n");
104 Status
= ShellOpenFileByName(FileName
,
106 EFI_FILE_MODE_CREATE
|EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
109 ASSERT_EFI_ERROR(Status
);
110 pFileInfo
= ShellGetFileInfo(FileHandle
);
111 ASSERT(pFileInfo
!= NULL
);
112 pFileInfo
->FileSize
= 0x20;
113 Status
= ShellSetFileInfo(FileHandle
, pFileInfo
);
116 ASSERT_EFI_ERROR(Status
);
117 pFileInfo
= ShellGetFileInfo(FileHandle
);
118 ASSERT(pFileInfo
!= NULL
);
119 ASSERT(StrCmp(pFileInfo
->FileName
, FileName
) == 0);
120 ASSERT(pFileInfo
->PhysicalSize
== 0x20);
121 ASSERT(pFileInfo
->FileSize
== 0x20);
122 ASSERT((pFileInfo
->Attribute
&EFI_FILE_DIRECTORY
)==0);
124 Status
= ShellGetFileSize(FileHandle
, &Size
);
125 ASSERT(Size
== 0x20);
126 ASSERT_EFI_ERROR(Status
);
127 Status
= ShellCloseFile(&FileHandle
);
128 ASSERT(FileHandle
== NULL
);
129 ASSERT_EFI_ERROR(Status
);
130 Print(L
"setinfo and change size, getsize - pass\r\n");
132 Status
= ShellOpenFileByName(FileName
,
134 EFI_FILE_MODE_CREATE
|EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
137 ASSERT_EFI_ERROR(Status
);
139 pFileInfo
= ShellGetFileInfo(FileHandle
);
140 ASSERT(pFileInfo
!= NULL
);
141 ASSERT(StrCmp(pFileInfo
->FileName
, FileName
) == 0);
142 ASSERT(pFileInfo
->PhysicalSize
== 0x20);
143 ASSERT(pFileInfo
->FileSize
== 0x20);
144 ASSERT((pFileInfo
->Attribute
&EFI_FILE_DIRECTORY
)==0);
147 Status
= ShellDeleteFile(&FileHandle
);
148 ASSERT(FileHandle
== NULL
);
149 ASSERT_EFI_ERROR(Status
);
150 Print(L
"reopen file - pass\r\n");
152 Status
= ShellOpenFileByName(FileName
,
154 EFI_FILE_MODE_CREATE
|EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
157 ASSERT_EFI_ERROR(Status
);
158 pFileInfo
= ShellGetFileInfo(FileHandle
);
159 ASSERT(pFileInfo
!= NULL
);
160 ASSERT(StrCmp(pFileInfo
->FileName
, FileName
) == 0);
161 ASSERT(pFileInfo
->PhysicalSize
== 0x0);
162 ASSERT(pFileInfo
->FileSize
== 0x0);
163 ASSERT((pFileInfo
->Attribute
&EFI_FILE_DIRECTORY
)==0);
165 Status
= ShellDeleteFile(&FileHandle
);
166 ASSERT(FileHandle
== NULL
);
167 ASSERT_EFI_ERROR(Status
);
168 Print(L
"size of empty - pass\r\n");
170 Status
= ShellOpenFileByName(FileName
,
172 EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
175 ASSERT(Status
== EFI_NOT_FOUND
);
176 ASSERT(FileHandle
== NULL
);
178 Status
= ShellCreateDirectory(FileName
, &FileHandle
);
179 ASSERT_EFI_ERROR(Status
);
180 ASSERT(FileHandle
!= NULL
);
181 pFileInfo
= ShellGetFileInfo(FileHandle
);
182 ASSERT(pFileInfo
!= NULL
);
183 ASSERT(StrCmp(pFileInfo
->FileName
, FileName
) == 0);
184 ASSERT(pFileInfo
->Attribute
&EFI_FILE_DIRECTORY
);
185 Status
= ShellDeleteFile(&FileHandle
);
186 ASSERT(FileHandle
== NULL
);
187 ASSERT_EFI_ERROR(Status
);
188 Print(L
"Directory create - pass\r\n");
190 // FindFirst and FindNext
191 StrCpy(FileName
, L
"testDir");
192 Status
= ShellCreateDirectory(FileName
, &FileHandle
);
193 Status
= ShellCloseFile(&FileHandle
);
194 StrCat(FileName
, L
"\\File.txt");
195 Status
= ShellOpenFileByName(FileName
,
197 EFI_FILE_MODE_CREATE
|EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
200 ASSERT_EFI_ERROR(Status
);
201 Status
= ShellCloseFile(&FileHandle
);
202 StrCpy(FileName
, L
"testDir");
203 Status
= ShellOpenFileByName(FileName
,
205 EFI_FILE_MODE_CREATE
|EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
208 ASSERT_EFI_ERROR(Status
);
209 Status
= ShellFindFirstFile(FileHandle
, pFileInfo
);
210 ASSERT_EFI_ERROR(Status
);
211 Status
= ShellFindNextFile(FileHandle
, pFileInfo
, &NoFile
);
212 ASSERT_EFI_ERROR(Status
);
213 ASSERT(NoFile
== FALSE
);
214 Status
= ShellFindNextFile(FileHandle
, pFileInfo
, &NoFile
);
215 ASSERT_EFI_ERROR(Status
);
216 ASSERT(NoFile
== FALSE
);
217 Status
= ShellFindNextFile(FileHandle
, pFileInfo
, &NoFile
);
218 ASSERT_EFI_ERROR(Status
);
219 /// @todo - why is NoFile never set? limitation of NT32 file system?
220 Status
= ShellDeleteFile(&FileHandle
);
221 ASSERT(FileHandle
== NULL
);
222 ASSERT(Status
== RETURN_WARN_DELETE_FAILURE
);
223 Print(L
"FindFirst - pass\r\n");
224 Print(L
"FindNext - Verify with real EFI system. Cant verify NoFile under NT32\r\n");
226 // open and close meta arg
227 Status
= ShellOpenFileMetaArg(L
"testDir\\*.*", EFI_FILE_MODE_READ
, &pShellFileInfo
);
228 ASSERT_EFI_ERROR(Status
);
229 ASSERT(pShellFileInfo
->Status
== 0);
230 ASSERT(StrCmp(pShellFileInfo
->FileName
, L
"File.txt") == 0);
231 ASSERT(pShellFileInfo
->Handle
);
232 ASSERT(pShellFileInfo
->Info
);
233 ASSERT(pShellFileInfo
->Info
->FileSize
== 0);
234 ASSERT(StrCmp(pShellFileInfo
->Info
->FileName
, L
"File.txt") == 0);
235 ASSERT(pShellFileInfo
->Info
->Attribute
== 0);
236 pShellFileInfo2
= (EFI_SHELL_FILE_INFO
*)0x12345678;
237 Status
= ShellOpenFileMetaArg(L
"testDir\\*.*", EFI_FILE_MODE_READ
, &pShellFileInfo2
);
238 ASSERT(pShellFileInfo2
== NULL
);
239 ASSERT(Status
== EFI_UNSUPPORTED
);
240 Status
= ShellCloseFileMetaArg(&pShellFileInfo
);
241 ASSERT_EFI_ERROR(Status
);
242 Print(L
"Open/Close Meta Arg - pass\r\n");
244 // now delete that file and that directory
245 StrCat(FileName
, L
"\\File.txt");
246 Status
= ShellOpenFileByName(FileName
,
248 EFI_FILE_MODE_CREATE
|EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
251 ASSERT_EFI_ERROR(Status
);
252 Status
= ShellDeleteFile(&FileHandle
);
253 ASSERT(FileHandle
== NULL
);
254 StrCpy(FileName
, L
"testDir");
255 ASSERT_EFI_ERROR(Status
);
256 Status
= ShellOpenFileByName(FileName
,
258 EFI_FILE_MODE_CREATE
|EFI_FILE_MODE_READ
|EFI_FILE_MODE_WRITE
,
261 Status
= ShellDeleteFile(&FileHandle
);
262 ASSERT(FileHandle
== NULL
);
263 ASSERT_EFI_ERROR(Status
);
265 // get environment variable
266 // made for testing under nt32
267 ASSERT(StrCmp(ShellGetEnvironmentVariable(L
"path"), L
".;f8:\\efi\\tools;f8:\\efi\\boot;f8:\\;f9:\\efi\\tools;f9:\\efi\\boot;f9:\\") == 0);
268 Print(L
"ShellGetEnvironmentVariable - pass\r\n");
270 // set environment variable
271 Status
= ShellSetEnvironmentVariable(L
"", L
"", FALSE
);
272 ASSERT(Status
== EFI_UNSUPPORTED
);
273 Print(L
"ShellSetEnvironmentVariable - pass\r\n");
276 Status
= ShellExecute(&ImageHandle
, L
"EmptyApplication.efi", TRUE
, NULL
, NULL
);
277 ASSERT_EFI_ERROR(Status
);
278 // the pass printout for this is performed by EmptyApplication
281 // command line param functions
282 Status
= ShellCommandLineParse(ParamList
, &List
, NULL
, FALSE
);
283 // if you put an invalid parameter you SHOULD hit this assert.
284 ASSERT_EFI_ERROR(Status
);
286 ASSERT(ShellCommandLineGetFlag(List
, L
"/Param5") == FALSE
);
287 ASSERT(ShellCommandLineGetFlag(List
, L
"/Param1") != FALSE
);
288 ASSERT(StrCmp(ShellCommandLineGetValue(List
, L
"/Param2"), L
"Val1")==0);
289 ASSERT(StrCmp(ShellCommandLineGetRawValue(List
, 0), L
"SimpleApplication")==0);
291 ShellCommandLineFreeVarList(List
);
293 Print(L
"param checking skipped.\r\n");
296 // page break mode (done last so we can see the results)
297 // we set this true at the begining of the program
298 // this is enough lines to trigger the page...
299 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");
300 ShellSetPageBreakMode(FALSE
);
301 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");
308 done - ShellGetFileInfo
309 done - ShellSetFileInfo
310 done - ShellOpenFileByDevicePath
311 done - ShellOpenFileByName
312 done - ShellCreateDirectory
314 done - ShellWriteFile
315 done - ShellCloseFile
316 done - ShellDeleteFile
317 done - ShellSetFilePosition
318 done - ShellGetFilePosition
319 ???? - ShellFlushFile
320 done - ShellFindFirstFile
321 done - ShellFindNextFile
322 done - ShellGetFileSize
323 done - ShellGetExecutionBreakFlag
324 done - ShellGetEnvironmentVariable
325 done - ShellSetEnvironmentVariable
327 done - ShellGetCurrentDir
328 done - ShellSetPageBreakMode
329 done - ShellOpenFileMetaArg
330 done - ShellCloseFileMetaArg
331 done - ShellCommandLineParse
332 done - ShellCommandLineFreeVarList
333 done - ShellCommandLineGetFlag
334 done - ShellCommandLineGetValue
335 done - ShellCommandLineGetRawValue