]> git.proxmox.com Git - mirror_edk2.git/blob - ShellPkg/Library/UefiShellDebug1CommandsLib/MemMap.c
pointer verification (not NULL) and buffer overrun fixes.
[mirror_edk2.git] / ShellPkg / Library / UefiShellDebug1CommandsLib / MemMap.c
1 /** @file
2 Main file for Mode shell Debug1 function.
3
4 Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
5 This program and the acModeanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which acModeanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 STATIC CONST CHAR16 NameEfiReservedMemoryType[] = L"Reserved";
16 STATIC CONST CHAR16 NameEfiLoaderCode[] = L"LoaderCode";
17 STATIC CONST CHAR16 NameEfiLoaderData[] = L"LoaderData";
18 STATIC CONST CHAR16 NameEfiBootServicesCode[] = L"BS_Code";
19 STATIC CONST CHAR16 NameEfiBootServicesData[] = L"BS_Data";
20 STATIC CONST CHAR16 NameEfiRuntimeServicesCode[] = L"RT_Code";
21 STATIC CONST CHAR16 NameEfiRuntimeServicesData[] = L"RT_Data";
22 STATIC CONST CHAR16 NameEfiConventionalMemory[] = L"Available";
23 STATIC CONST CHAR16 NameEfiUnusableMemory[] = L"Unusable";
24 STATIC CONST CHAR16 NameEfiACPIReclaimMemory[] = L"ACPIRec";
25 STATIC CONST CHAR16 NameEfiACPIMemoryNVS[] = L"ACPI_NVS";
26 STATIC CONST CHAR16 NameEfiMemoryMappedIO[] = L"MMIO";
27 STATIC CONST CHAR16 NameEfiMemoryMappedIOPortSpace[] = L"MMIOPort";
28 STATIC CONST CHAR16 NameEfiPalCode[] = L"PalCode";
29
30 #include "UefiShellDebug1CommandsLib.h"
31
32 /**
33 Function for 'memmap' command.
34
35 @param[in] ImageHandle Handle to the Image (NULL if Internal).
36 @param[in] SystemTable Pointer to the System Table (NULL if Internal).
37 **/
38 SHELL_STATUS
39 EFIAPI
40 ShellCommandRunMemMap (
41 IN EFI_HANDLE ImageHandle,
42 IN EFI_SYSTEM_TABLE *SystemTable
43 )
44 {
45 EFI_STATUS Status;
46 LIST_ENTRY *Package;
47 CHAR16 *ProblemParam;
48 SHELL_STATUS ShellStatus;
49 UINTN Size;
50 EFI_MEMORY_DESCRIPTOR *Buffer;
51 UINTN MapKey;
52 UINTN ItemSize;
53 UINT32 Version;
54 UINT8 *Walker;
55 UINT64 ReservedPages;
56 UINT64 LoadCodePages;
57 UINT64 LoadDataPages;
58 UINT64 BSCodePages;
59 UINT64 BSDataPages;
60 UINT64 RTDataPages;
61 UINT64 RTCodePages;
62 UINT64 AvailPages;
63 UINT64 TotalPages;
64 UINT64 ReservedPagesSize;
65 UINT64 LoadCodePagesSize;
66 UINT64 LoadDataPagesSize;
67 UINT64 BSCodePagesSize;
68 UINT64 BSDataPagesSize;
69 UINT64 RTDataPagesSize;
70 UINT64 RTCodePagesSize;
71 UINT64 AvailPagesSize;
72 UINT64 TotalPagesSize;
73 UINT64 AcpiReclaimPages;
74 UINT64 AcpiNvsPages;
75 UINT64 MmioSpacePages;
76 UINT64 AcpiReclaimPagesSize;
77 UINT64 AcpiNvsPagesSize;
78 UINT64 MmioSpacePagesSize;
79 BOOLEAN Sfo;
80
81 AcpiReclaimPages = 0;
82 AcpiNvsPages = 0;
83 MmioSpacePages = 0;
84 TotalPages = 0;
85 ReservedPages = 0;
86 LoadCodePages = 0;
87 LoadDataPages = 0;
88 BSCodePages = 0;
89 BSDataPages = 0;
90 RTDataPages = 0;
91 RTCodePages = 0;
92 AvailPages = 0;
93 Size = 0;
94 Buffer = NULL;
95 ShellStatus = SHELL_SUCCESS;
96 Status = EFI_SUCCESS;
97
98 //
99 // initialize the shell lib (we must be in non-auto-init...)
100 //
101 Status = ShellInitialize();
102 ASSERT_EFI_ERROR(Status);
103
104 Status = CommandInit();
105 ASSERT_EFI_ERROR(Status);
106
107 //
108 // parse the command line
109 //
110 Status = ShellCommandLineParse (SfoParamList, &Package, &ProblemParam, TRUE);
111 if (EFI_ERROR(Status)) {
112 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {
113 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDebug1HiiHandle, ProblemParam);
114 FreePool(ProblemParam);
115 ShellStatus = SHELL_INVALID_PARAMETER;
116 } else {
117 ASSERT(FALSE);
118 }
119 } else {
120 if (ShellCommandLineGetCount(Package) > 1) {
121 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDebug1HiiHandle);
122 ShellStatus = SHELL_INVALID_PARAMETER;
123 } else {
124 Status = gBS->GetMemoryMap(&Size, Buffer, &MapKey, &ItemSize, &Version);
125 if (Status == EFI_BUFFER_TOO_SMALL){
126 Size += SIZE_1KB;
127 Buffer = AllocateZeroPool(Size);
128 Status = gBS->GetMemoryMap(&Size, Buffer, &MapKey, &ItemSize, &Version);
129 }
130 if (EFI_ERROR(Status)) {
131 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_GET_FAILED), gShellDebug1HiiHandle, Status);
132 ShellStatus = SHELL_ACCESS_DENIED;
133 } else {
134 ASSERT(Version == EFI_MEMORY_DESCRIPTOR_VERSION);
135 Sfo = ShellCommandLineGetFlag(Package, L"-sfo");
136 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_LIST_HEAD), gShellDebug1HiiHandle);
137 for (Walker = (UINT8*)Buffer; Walker < (((UINT8*)Buffer)+Size) && Walker != NULL; Walker += ItemSize){
138 switch (((EFI_MEMORY_DESCRIPTOR*)Walker)->Type) {
139 // replaced ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages) with 0000
140 case EfiReservedMemoryType:
141 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiReservedMemoryType, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
142 ReservedPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
143 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
144 break;
145 case EfiLoaderCode:
146 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiLoaderCode, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
147 LoadCodePages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
148 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
149 break;
150 case EfiLoaderData:
151 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiLoaderData, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
152 LoadDataPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
153 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
154 break;
155 case EfiBootServicesCode:
156 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiBootServicesCode, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
157 BSCodePages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
158 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
159 break;
160 case EfiBootServicesData:
161 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiBootServicesData, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
162 BSDataPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
163 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
164 break;
165 case EfiRuntimeServicesCode:
166 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiRuntimeServicesCode, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
167 RTCodePages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
168 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
169 break;
170 case EfiRuntimeServicesData:
171 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiRuntimeServicesData, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
172 RTDataPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
173 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
174 break;
175 case EfiConventionalMemory:
176 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiConventionalMemory, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
177 AvailPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
178 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
179 break;
180 case EfiUnusableMemory:
181 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiUnusableMemory, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
182 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
183 break;
184 case EfiACPIReclaimMemory:
185 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiACPIReclaimMemory, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
186 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
187 AcpiReclaimPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
188 break;
189 case EfiACPIMemoryNVS:
190 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiACPIMemoryNVS, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
191 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
192 AcpiNvsPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
193 break;
194 case EfiMemoryMappedIO:
195 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiMemoryMappedIO, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
196 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
197 MmioSpacePages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
198 break;
199 case EfiMemoryMappedIOPortSpace:
200 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiMemoryMappedIOPortSpace, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
201 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
202 break;
203 case EfiPalCode:
204 ShellPrintHiiEx(-1, -1, NULL, (EFI_STRING_ID)(!Sfo?STRING_TOKEN (STR_MEMMAP_LIST_ITEM):STRING_TOKEN (STR_MEMMAP_LIST_ITEM_SFO)), gShellDebug1HiiHandle, NameEfiPalCode, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart, ((EFI_MEMORY_DESCRIPTOR*)Walker)->PhysicalStart+MultU64x64(SIZE_4KB,((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages)-1, ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages, ((EFI_MEMORY_DESCRIPTOR*)Walker)->Attribute);
205 TotalPages += ((EFI_MEMORY_DESCRIPTOR*)Walker)->NumberOfPages;
206 break;
207 default:
208 ASSERT(FALSE);
209 }
210 }
211 //
212 // print the summary
213 //
214 ReservedPagesSize = MultU64x64(SIZE_4KB,ReservedPages);
215 LoadCodePagesSize = MultU64x64(SIZE_4KB,LoadCodePages);
216 LoadDataPagesSize = MultU64x64(SIZE_4KB,LoadDataPages);
217 BSCodePagesSize = MultU64x64(SIZE_4KB,BSCodePages);
218 BSDataPagesSize = MultU64x64(SIZE_4KB,BSDataPages);
219 RTDataPagesSize = MultU64x64(SIZE_4KB,RTDataPages);
220 RTCodePagesSize = MultU64x64(SIZE_4KB,RTCodePages);
221 AvailPagesSize = MultU64x64(SIZE_4KB,AvailPages);
222 TotalPagesSize = MultU64x64(SIZE_4KB,TotalPages);
223 AcpiReclaimPagesSize = MultU64x64(SIZE_4KB,AcpiReclaimPages);
224 AcpiNvsPagesSize = MultU64x64(SIZE_4KB,AcpiNvsPages);
225 MmioSpacePagesSize = MultU64x64(SIZE_4KB,MmioSpacePages);
226 if (!Sfo) {
227 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_LIST_SUMM), gShellDebug1HiiHandle,
228 ReservedPages, ReservedPagesSize,
229 LoadCodePages, LoadCodePagesSize,
230 LoadDataPages, LoadDataPagesSize,
231 BSCodePages, BSCodePagesSize,
232 BSDataPages, BSDataPagesSize,
233 RTCodePages, RTCodePagesSize,
234 RTDataPages, RTDataPagesSize,
235 AcpiReclaimPages, AcpiReclaimPagesSize,
236 AcpiNvsPages, AcpiNvsPagesSize,
237 MmioSpacePages, MmioSpacePagesSize,
238 AvailPages, AvailPagesSize,
239 DivU64x32(MultU64x64(SIZE_4KB,TotalPages), SIZE_1MB), TotalPagesSize
240 );
241 } else {
242 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_MEMMAP_LIST_SUMM_SFO), gShellDebug1HiiHandle,
243 TotalPagesSize,
244 MultU64x64(SIZE_4KB,ReservedPages),
245 BSCodePagesSize,
246 BSDataPagesSize,
247 RTCodePagesSize,
248 RTDataPagesSize,
249 LoadCodePagesSize,
250 LoadDataPagesSize,
251 AvailPages, AvailPagesSize
252 );
253 }
254 }
255 }
256 ShellCommandLineFreeVarList (Package);
257 }
258
259 if (Buffer != NULL) {
260 FreePool(Buffer);
261 }
262
263 return (ShellStatus);
264 }
265