Vishal Bhoj | 82c8071 | 2015-12-15 21:13:33 +0530 | [diff] [blame^] | 1 | /** @file
|
| 2 | Device Path services. The thing to remember is device paths are built out of
|
| 3 | nodes. The device path is terminated by an end node that is length
|
| 4 | sizeof(EFI_DEVICE_PATH_PROTOCOL). That would be why there is sizeof(EFI_DEVICE_PATH_PROTOCOL)
|
| 5 | all over this file.
|
| 6 |
|
| 7 | The only place where multi-instance device paths are supported is in
|
| 8 | environment varibles. Multi-instance device paths should never be placed
|
| 9 | on a Handle.
|
| 10 |
|
| 11 | Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
|
| 12 | This program and the accompanying materials
|
| 13 | are licensed and made available under the terms and conditions of the BSD License
|
| 14 | which accompanies this distribution. The full text of the license may be found at
|
| 15 | http://opensource.org/licenses/bsd-license.php.
|
| 16 |
|
| 17 | THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
| 18 | WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
| 19 |
|
| 20 | **/
|
| 21 |
|
| 22 |
|
| 23 | #include "UefiDevicePathLib.h"
|
| 24 |
|
| 25 | /**
|
| 26 | Returns the size of a device path in bytes.
|
| 27 |
|
| 28 | This function returns the size, in bytes, of the device path data structure
|
| 29 | specified by DevicePath including the end of device path node.
|
| 30 | If DevicePath is NULL or invalid, then 0 is returned.
|
| 31 |
|
| 32 | @param DevicePath A pointer to a device path data structure.
|
| 33 |
|
| 34 | @retval 0 If DevicePath is NULL or invalid.
|
| 35 | @retval Others The size of a device path in bytes.
|
| 36 |
|
| 37 | **/
|
| 38 | UINTN
|
| 39 | EFIAPI
|
| 40 | GetDevicePathSize (
|
| 41 | IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath
|
| 42 | )
|
| 43 | {
|
| 44 | return UefiDevicePathLibGetDevicePathSize (DevicePath);
|
| 45 | }
|
| 46 |
|
| 47 | /**
|
| 48 | Creates a new copy of an existing device path.
|
| 49 |
|
| 50 | This function allocates space for a new copy of the device path specified by DevicePath.
|
| 51 | If DevicePath is NULL, then NULL is returned. If the memory is successfully
|
| 52 | allocated, then the contents of DevicePath are copied to the newly allocated
|
| 53 | buffer, and a pointer to that buffer is returned. Otherwise, NULL is returned.
|
| 54 | The memory for the new device path is allocated from EFI boot services memory.
|
| 55 | It is the responsibility of the caller to free the memory allocated.
|
| 56 |
|
| 57 | @param DevicePath A pointer to a device path data structure.
|
| 58 |
|
| 59 | @retval NULL DevicePath is NULL or invalid.
|
| 60 | @retval Others A pointer to the duplicated device path.
|
| 61 |
|
| 62 | **/
|
| 63 | EFI_DEVICE_PATH_PROTOCOL *
|
| 64 | EFIAPI
|
| 65 | DuplicateDevicePath (
|
| 66 | IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath
|
| 67 | )
|
| 68 | {
|
| 69 | return UefiDevicePathLibDuplicateDevicePath (DevicePath);
|
| 70 | }
|
| 71 |
|
| 72 | /**
|
| 73 | Creates a new device path by appending a second device path to a first device path.
|
| 74 |
|
| 75 | This function creates a new device path by appending a copy of SecondDevicePath
|
| 76 | to a copy of FirstDevicePath in a newly allocated buffer. Only the end-of-device-path
|
| 77 | device node from SecondDevicePath is retained. The newly created device path is
|
| 78 | returned. If FirstDevicePath is NULL, then it is ignored, and a duplicate of
|
| 79 | SecondDevicePath is returned. If SecondDevicePath is NULL, then it is ignored,
|
| 80 | and a duplicate of FirstDevicePath is returned. If both FirstDevicePath and
|
| 81 | SecondDevicePath are NULL, then a copy of an end-of-device-path is returned.
|
| 82 |
|
| 83 | If there is not enough memory for the newly allocated buffer, then NULL is returned.
|
| 84 | The memory for the new device path is allocated from EFI boot services memory.
|
| 85 | It is the responsibility of the caller to free the memory allocated.
|
| 86 |
|
| 87 | @param FirstDevicePath A pointer to a device path data structure.
|
| 88 | @param SecondDevicePath A pointer to a device path data structure.
|
| 89 |
|
| 90 | @retval NULL If there is not enough memory for the newly allocated buffer.
|
| 91 | @retval NULL If FirstDevicePath or SecondDevicePath is invalid.
|
| 92 | @retval Others A pointer to the new device path if success.
|
| 93 | Or a copy an end-of-device-path if both FirstDevicePath and SecondDevicePath are NULL.
|
| 94 |
|
| 95 | **/
|
| 96 | EFI_DEVICE_PATH_PROTOCOL *
|
| 97 | EFIAPI
|
| 98 | AppendDevicePath (
|
| 99 | IN CONST EFI_DEVICE_PATH_PROTOCOL *FirstDevicePath, OPTIONAL
|
| 100 | IN CONST EFI_DEVICE_PATH_PROTOCOL *SecondDevicePath OPTIONAL
|
| 101 | )
|
| 102 | {
|
| 103 | return UefiDevicePathLibAppendDevicePath (FirstDevicePath, SecondDevicePath);
|
| 104 | }
|
| 105 |
|
| 106 | /**
|
| 107 | Creates a new path by appending the device node to the device path.
|
| 108 |
|
| 109 | This function creates a new device path by appending a copy of the device node
|
| 110 | specified by DevicePathNode to a copy of the device path specified by DevicePath
|
| 111 | in an allocated buffer. The end-of-device-path device node is moved after the
|
| 112 | end of the appended device node.
|
| 113 | If DevicePathNode is NULL then a copy of DevicePath is returned.
|
| 114 | If DevicePath is NULL then a copy of DevicePathNode, followed by an end-of-device
|
| 115 | path device node is returned.
|
| 116 | If both DevicePathNode and DevicePath are NULL then a copy of an end-of-device-path
|
| 117 | device node is returned.
|
| 118 | If there is not enough memory to allocate space for the new device path, then
|
| 119 | NULL is returned.
|
| 120 | The memory is allocated from EFI boot services memory. It is the responsibility
|
| 121 | of the caller to free the memory allocated.
|
| 122 |
|
| 123 | @param DevicePath A pointer to a device path data structure.
|
| 124 | @param DevicePathNode A pointer to a single device path node.
|
| 125 |
|
| 126 | @retval NULL If there is not enough memory for the new device path.
|
| 127 | @retval Others A pointer to the new device path if success.
|
| 128 | A copy of DevicePathNode followed by an end-of-device-path node
|
| 129 | if both FirstDevicePath and SecondDevicePath are NULL.
|
| 130 | A copy of an end-of-device-path node if both FirstDevicePath
|
| 131 | and SecondDevicePath are NULL.
|
| 132 |
|
| 133 | **/
|
| 134 | EFI_DEVICE_PATH_PROTOCOL *
|
| 135 | EFIAPI
|
| 136 | AppendDevicePathNode (
|
| 137 | IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, OPTIONAL
|
| 138 | IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePathNode OPTIONAL
|
| 139 | )
|
| 140 | {
|
| 141 | return UefiDevicePathLibAppendDevicePathNode (DevicePath, DevicePathNode);
|
| 142 | }
|
| 143 |
|
| 144 | /**
|
| 145 | Creates a new device path by appending the specified device path instance to the specified device
|
| 146 | path.
|
| 147 |
|
| 148 | This function creates a new device path by appending a copy of the device path
|
| 149 | instance specified by DevicePathInstance to a copy of the device path specified
|
| 150 | by DevicePath in a allocated buffer.
|
| 151 | The end-of-device-path device node is moved after the end of the appended device
|
| 152 | path instance and a new end-of-device-path-instance node is inserted between.
|
| 153 | If DevicePath is NULL, then a copy if DevicePathInstance is returned.
|
| 154 | If DevicePathInstance is NULL, then NULL is returned.
|
| 155 | If DevicePath or DevicePathInstance is invalid, then NULL is returned.
|
| 156 | If there is not enough memory to allocate space for the new device path, then
|
| 157 | NULL is returned.
|
| 158 | The memory is allocated from EFI boot services memory. It is the responsibility
|
| 159 | of the caller to free the memory allocated.
|
| 160 |
|
| 161 | @param DevicePath A pointer to a device path data structure.
|
| 162 | @param DevicePathInstance A pointer to a device path instance.
|
| 163 |
|
| 164 | @return A pointer to the new device path.
|
| 165 |
|
| 166 | **/
|
| 167 | EFI_DEVICE_PATH_PROTOCOL *
|
| 168 | EFIAPI
|
| 169 | AppendDevicePathInstance (
|
| 170 | IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, OPTIONAL
|
| 171 | IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePathInstance OPTIONAL
|
| 172 | )
|
| 173 | {
|
| 174 | return UefiDevicePathLibAppendDevicePathInstance (DevicePath, DevicePathInstance);
|
| 175 | }
|
| 176 |
|
| 177 | /**
|
| 178 | Creates a copy of the current device path instance and returns a pointer to the next device path
|
| 179 | instance.
|
| 180 |
|
| 181 | This function creates a copy of the current device path instance. It also updates
|
| 182 | DevicePath to point to the next device path instance in the device path (or NULL
|
| 183 | if no more) and updates Size to hold the size of the device path instance copy.
|
| 184 | If DevicePath is NULL, then NULL is returned.
|
| 185 | If DevicePath points to a invalid device path, then NULL is returned.
|
| 186 | If there is not enough memory to allocate space for the new device path, then
|
| 187 | NULL is returned.
|
| 188 | The memory is allocated from EFI boot services memory. It is the responsibility
|
| 189 | of the caller to free the memory allocated.
|
| 190 | If Size is NULL, then ASSERT().
|
| 191 |
|
| 192 | @param DevicePath On input, this holds the pointer to the current
|
| 193 | device path instance. On output, this holds
|
| 194 | the pointer to the next device path instance
|
| 195 | or NULL if there are no more device path
|
| 196 | instances in the device path pointer to a
|
| 197 | device path data structure.
|
| 198 | @param Size On output, this holds the size of the device
|
| 199 | path instance, in bytes or zero, if DevicePath
|
| 200 | is NULL.
|
| 201 |
|
| 202 | @return A pointer to the current device path instance.
|
| 203 |
|
| 204 | **/
|
| 205 | EFI_DEVICE_PATH_PROTOCOL *
|
| 206 | EFIAPI
|
| 207 | GetNextDevicePathInstance (
|
| 208 | IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath,
|
| 209 | OUT UINTN *Size
|
| 210 | )
|
| 211 | {
|
| 212 | return UefiDevicePathLibGetNextDevicePathInstance (DevicePath, Size);
|
| 213 | }
|
| 214 |
|
| 215 | /**
|
| 216 | Creates a device node.
|
| 217 |
|
| 218 | This function creates a new device node in a newly allocated buffer of size
|
| 219 | NodeLength and initializes the device path node header with NodeType and NodeSubType.
|
| 220 | The new device path node is returned.
|
| 221 | If NodeLength is smaller than a device path header, then NULL is returned.
|
| 222 | If there is not enough memory to allocate space for the new device path, then
|
| 223 | NULL is returned.
|
| 224 | The memory is allocated from EFI boot services memory. It is the responsibility
|
| 225 | of the caller to free the memory allocated.
|
| 226 |
|
| 227 | @param NodeType The device node type for the new device node.
|
| 228 | @param NodeSubType The device node sub-type for the new device node.
|
| 229 | @param NodeLength The length of the new device node.
|
| 230 |
|
| 231 | @return The new device path.
|
| 232 |
|
| 233 | **/
|
| 234 | EFI_DEVICE_PATH_PROTOCOL *
|
| 235 | EFIAPI
|
| 236 | CreateDeviceNode (
|
| 237 | IN UINT8 NodeType,
|
| 238 | IN UINT8 NodeSubType,
|
| 239 | IN UINT16 NodeLength
|
| 240 | )
|
| 241 | {
|
| 242 | return UefiDevicePathLibCreateDeviceNode (NodeType, NodeSubType, NodeLength);
|
| 243 | }
|
| 244 |
|
| 245 | /**
|
| 246 | Determines if a device path is single or multi-instance.
|
| 247 |
|
| 248 | This function returns TRUE if the device path specified by DevicePath is
|
| 249 | multi-instance.
|
| 250 | Otherwise, FALSE is returned.
|
| 251 | If DevicePath is NULL or invalid, then FALSE is returned.
|
| 252 |
|
| 253 | @param DevicePath A pointer to a device path data structure.
|
| 254 |
|
| 255 | @retval TRUE DevicePath is multi-instance.
|
| 256 | @retval FALSE DevicePath is not multi-instance, or DevicePath
|
| 257 | is NULL or invalid.
|
| 258 |
|
| 259 | **/
|
| 260 | BOOLEAN
|
| 261 | EFIAPI
|
| 262 | IsDevicePathMultiInstance (
|
| 263 | IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath
|
| 264 | )
|
| 265 | {
|
| 266 | return UefiDevicePathLibIsDevicePathMultiInstance (DevicePath);
|
| 267 | }
|
| 268 |
|
| 269 | /**
|
| 270 | Converts a device node to its string representation.
|
| 271 |
|
| 272 | @param DeviceNode A Pointer to the device node to be converted.
|
| 273 | @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation
|
| 274 | of the display node is used, where applicable. If DisplayOnly
|
| 275 | is FALSE, then the longer text representation of the display node
|
| 276 | is used.
|
| 277 | @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text
|
| 278 | representation for a device node can be used, where applicable.
|
| 279 |
|
| 280 | @return A pointer to the allocated text representation of the device node or NULL if DeviceNode
|
| 281 | is NULL or there was insufficient memory.
|
| 282 |
|
| 283 | **/
|
| 284 | CHAR16 *
|
| 285 | EFIAPI
|
| 286 | ConvertDeviceNodeToText (
|
| 287 | IN CONST EFI_DEVICE_PATH_PROTOCOL *DeviceNode,
|
| 288 | IN BOOLEAN DisplayOnly,
|
| 289 | IN BOOLEAN AllowShortcuts
|
| 290 | )
|
| 291 | {
|
| 292 | return UefiDevicePathLibConvertDeviceNodeToText (DeviceNode, DisplayOnly, AllowShortcuts);
|
| 293 | }
|
| 294 |
|
| 295 | /**
|
| 296 | Converts a device path to its text representation.
|
| 297 |
|
| 298 | @param DevicePath A Pointer to the device to be converted.
|
| 299 | @param DisplayOnly If DisplayOnly is TRUE, then the shorter text representation
|
| 300 | of the display node is used, where applicable. If DisplayOnly
|
| 301 | is FALSE, then the longer text representation of the display node
|
| 302 | is used.
|
| 303 | @param AllowShortcuts If AllowShortcuts is TRUE, then the shortcut forms of text
|
| 304 | representation for a device node can be used, where applicable.
|
| 305 |
|
| 306 | @return A pointer to the allocated text representation of the device path or
|
| 307 | NULL if DeviceNode is NULL or there was insufficient memory.
|
| 308 |
|
| 309 | **/
|
| 310 | CHAR16 *
|
| 311 | EFIAPI
|
| 312 | ConvertDevicePathToText (
|
| 313 | IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
| 314 | IN BOOLEAN DisplayOnly,
|
| 315 | IN BOOLEAN AllowShortcuts
|
| 316 | )
|
| 317 | {
|
| 318 | return UefiDevicePathLibConvertDevicePathToText (DevicePath, DisplayOnly, AllowShortcuts);
|
| 319 | }
|
| 320 |
|
| 321 | /**
|
| 322 | Convert text to the binary representation of a device node.
|
| 323 |
|
| 324 | @param TextDeviceNode TextDeviceNode points to the text representation of a device
|
| 325 | node. Conversion starts with the first character and continues
|
| 326 | until the first non-device node character.
|
| 327 |
|
| 328 | @return A pointer to the EFI device node or NULL if TextDeviceNode is NULL or there was
|
| 329 | insufficient memory or text unsupported.
|
| 330 |
|
| 331 | **/
|
| 332 | EFI_DEVICE_PATH_PROTOCOL *
|
| 333 | EFIAPI
|
| 334 | ConvertTextToDeviceNode (
|
| 335 | IN CONST CHAR16 *TextDeviceNode
|
| 336 | )
|
| 337 | {
|
| 338 | return UefiDevicePathLibConvertTextToDeviceNode (TextDeviceNode);
|
| 339 | }
|
| 340 |
|
| 341 | /**
|
| 342 | Convert text to the binary representation of a device path.
|
| 343 |
|
| 344 |
|
| 345 | @param TextDevicePath TextDevicePath points to the text representation of a device
|
| 346 | path. Conversion starts with the first character and continues
|
| 347 | until the first non-device node character.
|
| 348 |
|
| 349 | @return A pointer to the allocated device path or NULL if TextDeviceNode is NULL or
|
| 350 | there was insufficient memory.
|
| 351 |
|
| 352 | **/
|
| 353 | EFI_DEVICE_PATH_PROTOCOL *
|
| 354 | EFIAPI
|
| 355 | ConvertTextToDevicePath (
|
| 356 | IN CONST CHAR16 *TextDevicePath
|
| 357 | )
|
| 358 | {
|
| 359 | return UefiDevicePathLibConvertTextToDevicePath (TextDevicePath);
|
| 360 | }
|