]> git.proxmox.com Git - mirror_edk2.git/blame - MdeModulePkg/Application/CapsuleApp/AppSupport.c
MdeModulePkg/CapsuleApp: Enhance Capsule-On-Disk related functions.
[mirror_edk2.git] / MdeModulePkg / Application / CapsuleApp / AppSupport.c
CommitLineData
592bad04
JY
1/** @file\r
2 A shell application that triggers capsule update process.\r
3\r
8165570e 4 Copyright (c) 2016 - 2019, Intel Corporation. All rights reserved.<BR>\r
9d510e61 5 SPDX-License-Identifier: BSD-2-Clause-Patent\r
592bad04
JY
6\r
7**/\r
8\r
8165570e 9#include "CapsuleApp.h"\r
592bad04
JY
10\r
11UINTN Argc;\r
12CHAR16 **Argv;\r
8b17683a 13EFI_SHELL_PROTOCOL *mShellProtocol = NULL;\r
592bad04
JY
14\r
15/**\r
16\r
17 This function parse application ARG.\r
18\r
19 @return Status\r
20**/\r
21EFI_STATUS\r
22GetArg (\r
23 VOID\r
24 )\r
25{\r
26 EFI_STATUS Status;\r
27 EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters;\r
28\r
29 Status = gBS->HandleProtocol (\r
30 gImageHandle,\r
31 &gEfiShellParametersProtocolGuid,\r
32 (VOID**)&ShellParameters\r
33 );\r
34 if (EFI_ERROR(Status)) {\r
35 return Status;\r
36 }\r
37\r
38 Argc = ShellParameters->Argc;\r
39 Argv = ShellParameters->Argv;\r
40 return EFI_SUCCESS;\r
41}\r
42\r
43/**\r
8b17683a 44 Get shell protocol.\r
592bad04 45\r
8b17683a 46 @return Pointer to shell protocol.\r
592bad04 47**/\r
8b17683a
SZ
48EFI_SHELL_PROTOCOL *\r
49GetShellProtocol (\r
592bad04
JY
50 VOID\r
51 )\r
52{\r
8b17683a 53 EFI_STATUS Status;\r
592bad04 54\r
8b17683a
SZ
55 if (mShellProtocol == NULL) {\r
56 Status = gBS->LocateProtocol (\r
57 &gEfiShellProtocolGuid,\r
58 NULL,\r
59 (VOID **) &mShellProtocol\r
60 );\r
61 if (EFI_ERROR (Status)) {\r
62 mShellProtocol = NULL;\r
63 }\r
592bad04
JY
64 }\r
65\r
8b17683a 66 return mShellProtocol;\r
592bad04
JY
67}\r
68\r
69/**\r
8b17683a 70 Read a file.\r
592bad04 71\r
592bad04
JY
72 @param[in] FileName The file to be read.\r
73 @param[out] BufferSize The file buffer size\r
74 @param[out] Buffer The file buffer\r
75\r
76 @retval EFI_SUCCESS Read file successfully\r
8b17683a
SZ
77 @retval EFI_NOT_FOUND Shell protocol or file not found\r
78 @retval others Read file failed\r
592bad04
JY
79**/\r
80EFI_STATUS\r
8b17683a
SZ
81ReadFileToBuffer (\r
82 IN CHAR16 *FileName,\r
83 OUT UINTN *BufferSize,\r
84 OUT VOID **Buffer\r
592bad04
JY
85 )\r
86{\r
87 EFI_STATUS Status;\r
8b17683a
SZ
88 EFI_SHELL_PROTOCOL *ShellProtocol;\r
89 SHELL_FILE_HANDLE Handle;\r
90 UINT64 FileSize;\r
592bad04
JY
91 UINTN TempBufferSize;\r
92 VOID *TempBuffer;\r
93\r
8b17683a
SZ
94 ShellProtocol = GetShellProtocol();\r
95 if (ShellProtocol == NULL) {\r
96 return EFI_NOT_FOUND;\r
592bad04
JY
97 }\r
98\r
99 //\r
8b17683a 100 // Open file by FileName.\r
592bad04 101 //\r
8b17683a
SZ
102 Status = ShellProtocol->OpenFileByName (\r
103 FileName,\r
104 &Handle,\r
105 EFI_FILE_MODE_READ\r
106 );\r
592bad04 107 if (EFI_ERROR (Status)) {\r
592bad04
JY
108 return Status;\r
109 }\r
110\r
592bad04 111 //\r
8b17683a 112 // Get the file size.\r
592bad04 113 //\r
8b17683a 114 Status = ShellProtocol->GetFileSize (Handle, &FileSize);\r
8ecb1e9b 115 if (EFI_ERROR (Status)) {\r
8b17683a 116 ShellProtocol->CloseFile (Handle);\r
592bad04
JY
117 return Status;\r
118 }\r
119\r
8b17683a 120 TempBufferSize = (UINTN) FileSize;\r
592bad04
JY
121 TempBuffer = AllocateZeroPool (TempBufferSize);\r
122 if (TempBuffer == NULL) {\r
8b17683a
SZ
123 ShellProtocol->CloseFile (Handle);\r
124 return EFI_OUT_OF_RESOURCES;\r
592bad04
JY
125 }\r
126\r
592bad04
JY
127 //\r
128 // Read the file data to the buffer\r
129 //\r
8b17683a
SZ
130 Status = ShellProtocol->ReadFile (\r
131 Handle,\r
132 &TempBufferSize,\r
133 TempBuffer\r
134 );\r
592bad04 135 if (EFI_ERROR (Status)) {\r
8b17683a 136 ShellProtocol->CloseFile (Handle);\r
592bad04
JY
137 return Status;\r
138 }\r
139\r
8b17683a 140 ShellProtocol->CloseFile (Handle);\r
592bad04
JY
141\r
142 *BufferSize = TempBufferSize;\r
143 *Buffer = TempBuffer;\r
144 return EFI_SUCCESS;\r
145}\r
146\r
592bad04
JY
147/**\r
148 Write a file.\r
149\r
150 @param[in] FileName The file to be written.\r
151 @param[in] BufferSize The file buffer size\r
152 @param[in] Buffer The file buffer\r
153\r
154 @retval EFI_SUCCESS Write file successfully\r
8b17683a
SZ
155 @retval EFI_NOT_FOUND Shell protocol not found\r
156 @retval others Write file failed\r
592bad04
JY
157**/\r
158EFI_STATUS\r
159WriteFileFromBuffer (\r
160 IN CHAR16 *FileName,\r
161 IN UINTN BufferSize,\r
162 IN VOID *Buffer\r
163 )\r
164{\r
165 EFI_STATUS Status;\r
8b17683a
SZ
166 EFI_SHELL_PROTOCOL *ShellProtocol;\r
167 SHELL_FILE_HANDLE Handle;\r
168 EFI_FILE_INFO *FileInfo;\r
592bad04 169 UINTN TempBufferSize;\r
592bad04 170\r
8b17683a
SZ
171 ShellProtocol = GetShellProtocol();\r
172 if (ShellProtocol == NULL) {\r
592bad04
JY
173 return EFI_NOT_FOUND;\r
174 }\r
175\r
176 //\r
8b17683a 177 // Open file by FileName.\r
592bad04 178 //\r
8b17683a
SZ
179 Status = ShellProtocol->OpenFileByName (\r
180 FileName,\r
181 &Handle,\r
182 EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE\r
183 );\r
592bad04
JY
184 if (EFI_ERROR (Status)) {\r
185 return Status;\r
186 }\r
187\r
188 //\r
8b17683a 189 // Empty the file contents.\r
592bad04 190 //\r
8b17683a
SZ
191 FileInfo = ShellProtocol->GetFileInfo (Handle);\r
192 if (FileInfo == NULL) {\r
193 ShellProtocol->CloseFile (Handle);\r
194 return EFI_DEVICE_ERROR;\r
592bad04
JY
195 }\r
196\r
197 //\r
8b17683a 198 // If the file size is already 0, then it has been empty.\r
592bad04 199 //\r
8b17683a
SZ
200 if (FileInfo->FileSize != 0) {\r
201 //\r
202 // Set the file size to 0.\r
203 //\r
204 FileInfo->FileSize = 0;\r
205 Status = ShellProtocol->SetFileInfo (Handle, FileInfo);\r
206 if (EFI_ERROR (Status)) {\r
207 FreePool (FileInfo);\r
208 ShellProtocol->CloseFile (Handle);\r
209 return Status;\r
210 }\r
592bad04 211 }\r
8b17683a 212 FreePool (FileInfo);\r
592bad04
JY
213\r
214 //\r
215 // Write the file data from the buffer\r
216 //\r
217 TempBufferSize = BufferSize;\r
8b17683a
SZ
218 Status = ShellProtocol->WriteFile (\r
219 Handle,\r
220 &TempBufferSize,\r
221 Buffer\r
222 );\r
592bad04 223 if (EFI_ERROR (Status)) {\r
8b17683a 224 ShellProtocol->CloseFile (Handle);\r
592bad04
JY
225 return Status;\r
226 }\r
227\r
8b17683a 228 ShellProtocol->CloseFile (Handle);\r
592bad04
JY
229\r
230 return EFI_SUCCESS;\r
231}\r
232\r