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