31 EFI_DEVICE_PATH_PROTOCOL *DevicePath
34 EFI_DEVICE_PATH_PROTOCOL *Previous;
35 EFI_DEVICE_PATH_PROTOCOL *Node;
37 for ( Previous = NULL, Node = DevicePath
38 ; !IsDevicePathEnd (Node)
39 ; Node = NextDevicePathNode (Node))
44 if ( (Previous != NULL)
45 && (DevicePathType (Previous) == MESSAGING_DEVICE_PATH)
46 && (DevicePathSubType (Previous) == MSG_URI_DP)
80 IN BOOLEAN OnlySearchForFromExt
93 if (!OnlySearchForFromExt) {
99 UriLen = AsciiStrLen (Uri);
100 if (UriLen > MAX_INTN - 1) {
102 return EFI_INVALID_PARAMETER;
105 FromExtLen = AsciiStrLen (FromExt);
106 if (FromExtLen > MAX_INTN - 1) {
108 return EFI_INVALID_PARAMETER;
111 if (UriLen < FromExtLen) {
112 return EFI_NOT_FOUND;
115 if (OnlySearchForFromExt) {
118 ToExtLen = AsciiStrLen (ToExt);
119 if (ToExtLen > MAX_INTN - 1) {
121 return EFI_INVALID_PARAMETER;
124 if (BaseOverflowSubSN ((INTN)ToExtLen, (INTN)FromExtLen, &SizeChange)) {
125 return EFI_INVALID_PARAMETER;
128 if (BaseOverflowAddSN ((INTN)UriLen, SizeChange, (INTN *)&OtherUriLen)) {
129 return EFI_INVALID_PARAMETER;
132 if (OtherUriLen > MAX_INTN - 1) {
134 return EFI_INVALID_PARAMETER;
137 *OtherUri = AllocatePool (
MAX (UriLen, OtherUriLen) + 1);
138 if (*OtherUri == NULL) {
139 return EFI_OUT_OF_RESOURCES;
142 CopyMem (*OtherUri, Uri, UriLen + 1);
143 SearchUri = *OtherUri;
146 if (AsciiStrnCmp (&SearchUri[UriLen - FromExtLen], FromExt, FromExtLen) == 0) {
147 if (!OnlySearchForFromExt) {
148 CopyMem (&SearchUri[UriLen - FromExtLen], ToExt, ToExtLen + 1);
149 if (SizeChange < -1) {
150 ZeroMem (&SearchUri[UriLen + SizeChange + 1], -(SizeChange + 1));
157 ParamsStart = AsciiStrStr (SearchUri,
"?");
158 if ( (ParamsStart != NULL)
159 && (AsciiStrnCmp (ParamsStart - FromExtLen, FromExt, FromExtLen) == 0))
161 if (!OnlySearchForFromExt) {
162 CopyMem (ParamsStart + SizeChange, ParamsStart, &SearchUri[UriLen] - ParamsStart + 1);
163 CopyMem (ParamsStart - FromExtLen, ToExt, ToExtLen);
164 if (SizeChange < -1) {
165 ZeroMem (&SearchUri[UriLen + SizeChange + 1], -(SizeChange + 1));
172 if (!OnlySearchForFromExt) {
173 FreePool (*OtherUri);
177 return EFI_NOT_FOUND;
232 EFI_DEVICE_PATH_PROTOCOL *DevicePath,
235 EFI_DEVICE_PATH_PROTOCOL **UriDevicePath
241 EFI_DEVICE_PATH_PROTOCOL *Previous;
242 EFI_DEVICE_PATH_PROTOCOL *Node;
243 EFI_DEVICE_PATH_PROTOCOL *TmpDevicePath;
245 ASSERT (UriDevicePath != NULL);
246 *UriDevicePath = NULL;
248 TmpDevicePath = DuplicateDevicePath (DevicePath);
249 if (TmpDevicePath == NULL) {
250 return EFI_OUT_OF_RESOURCES;
257 if (Previous == NULL) {
258 FreePool (TmpDevicePath);
259 return EFI_INVALID_PARAMETER;
269 UriSize = StrSize (Uri);
270 Uri = AllocatePool (UriSize *
sizeof (CHAR8));
272 return EFI_OUT_OF_RESOURCES;
275 UnicodeStrToAsciiStrS (OriginalUri, Uri, UriSize);
278 UriSize = AsciiStrSize (Uri);
281 Length =
sizeof (EFI_DEVICE_PATH_PROTOCOL) + UriSize;
282 Node = AllocatePool (
Length);
284 FreePool (TmpDevicePath);
285 return EFI_OUT_OF_RESOURCES;
288 Node->Type = MESSAGING_DEVICE_PATH;
289 Node->SubType = MSG_URI_DP;
290 SetDevicePathNodeLength (Node,
Length);
291 CopyMem ((UINT8 *)Node +
sizeof (EFI_DEVICE_PATH_PROTOCOL), Uri, UriSize);
292 if (OriginalUri != NULL) {
296 *UriDevicePath = AppendDevicePathNode (TmpDevicePath, Node);
298 FreePool (TmpDevicePath);
299 if (*UriDevicePath == NULL) {
300 return EFI_OUT_OF_RESOURCES;
STATIC EFI_STATUS ExtractOtherUriFromUri(IN CHAR8 *Uri, IN CHAR8 *FromExt, IN CHAR8 *ToExt, OUT CHAR8 **OtherUri, IN BOOLEAN OnlySearchForFromExt)
EFI_STATUS HttpBootAddUri(EFI_DEVICE_PATH_PROTOCOL *DevicePath, VOID *Uri, OC_STRING_FORMAT StringFormat, EFI_DEVICE_PATH_PROTOCOL **UriDevicePath)
EFI_STATUS ExtractOtherUriFromDevicePath(IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN CHAR8 *FromExt, IN CHAR8 *ToExt, OUT CHAR8 **OtherUri, IN BOOLEAN OnlySearchForFromExt)