4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Device Path services. The thing to remember is device paths are built out of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync nodes. The device path is terminated by an end node that is length
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync sizeof(EFI_DEVICE_PATH_PROTOCOL). That would be why there is sizeof(EFI_DEVICE_PATH_PROTOCOL)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync all over this file.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The only place where multi-instance device paths are supported is in
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync environment varibles. Multi-instance device paths should never be placed
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync on a Handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are licensed and made available under the terms and conditions of the BSD License
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync which accompanies this distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.php.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Uefi.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/DevicePathLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/BaseMemoryLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/DebugLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/MemoryAllocationLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/UefiBootServicesTableLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Library/BaseLib.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// Template for an end-of-device path node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGLOBAL_REMOVE_IF_UNREFERENCED CONST EFI_DEVICE_PATH_PROTOCOL mUefiDevicePathLibEndDevicePath = {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync END_DEVICE_PATH_TYPE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync END_ENTIRE_DEVICE_PATH_SUBTYPE,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync END_DEVICE_PATH_LENGTH,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Returns the Type field of a device path node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Returns the Type field of the device path node specified by Node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Node is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Node A pointer to a device path node data structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The Type field of the device path node specified by Node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDevicePathType (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST VOID *Node
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Node != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ((EFI_DEVICE_PATH_PROTOCOL *)(Node))->Type;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Returns the SubType field of a device path node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Returns the SubType field of the device path node specified by Node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Node is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Node A pointer to a device path node data structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The SubType field of the device path node specified by Node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT8
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDevicePathSubType (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST VOID *Node
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Node != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ((EFI_DEVICE_PATH_PROTOCOL *)(Node))->SubType;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Returns the 16-bit Length field of a device path node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Returns the 16-bit Length field of the device path node specified by Node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node is not required to be aligned on a 16-bit boundary, so it is recommended
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync that a function such as ReadUnaligned16() be used to extract the contents of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the Length field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Node is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Node A pointer to a device path node data structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The 16-bit Length field of the device path node specified by Node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDevicePathNodeLength (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST VOID *Node
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Node != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ReadUnaligned16 ((UINT16 *)&((EFI_DEVICE_PATH_PROTOCOL *)(Node))->Length[0]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Returns a pointer to the next node in a device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Returns a pointer to the device path node that follows the device path node
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync specified by Node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Node is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Node A pointer to a device path node data structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return a pointer to the device path node that follows the device path node
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync specified by Node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_DEVICE_PATH_PROTOCOL *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncNextDevicePathNode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST VOID *Node
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Node != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (EFI_DEVICE_PATH_PROTOCOL *)((UINT8 *)(Node) + DevicePathNodeLength(Node));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Determines if a device path node is an end node of a device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This includes nodes that are the end of a device path instance and nodes that
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync are the end of an entire device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Determines if the device path node specified by Node is an end node of a device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This includes nodes that are the end of a device path instance and nodes that are the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync end of an entire device path. If Node represents an end node of a device path,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync then TRUE is returned. Otherwise, FALSE is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Node is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Node A pointer to a device path node data structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE The device path node specified by Node is an end node of a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE The device path node specified by Node is not an end node of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIsDevicePathEndType (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST VOID *Node
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Node != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (BOOLEAN) (DevicePathType (Node) == END_DEVICE_PATH_TYPE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Determines if a device path node is an end node of an entire device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Determines if a device path node specified by Node is an end node of an entire
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync device path. If Node represents the end of an entire device path, then TRUE is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned. Otherwise, FALSE is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Node is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Node A pointer to a device path node data structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE The device path node specified by Node is the end of an entire
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE The device path node specified by Node is not the end of an
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync entire device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIsDevicePathEnd (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST VOID *Node
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Node != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (BOOLEAN) (IsDevicePathEndType (Node) && DevicePathSubType(Node) == END_ENTIRE_DEVICE_PATH_SUBTYPE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Determines if a device path node is an end node of a device path instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Determines if a device path node specified by Node is an end node of a device
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync path instance. If Node represents the end of a device path instance, then TRUE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is returned. Otherwise, FALSE is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Node is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Node A pointer to a device path node data structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE The device path node specified by Node is the end of a device
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync path instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE The device path node specified by Node is not the end of a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync device path instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIsDevicePathEndInstance (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST VOID *Node
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Node != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return (BOOLEAN) (IsDevicePathEndType (Node) && DevicePathSubType(Node) == END_INSTANCE_DEVICE_PATH_SUBTYPE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Sets the length, in bytes, of a device path node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Sets the length of the device path node specified by Node to the value specified
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync by NodeLength. NodeLength is returned. Node is not required to be aligned on
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync a 16-bit boundary, so it is recommended that a function such as WriteUnaligned16()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync be used to set the contents of the Length field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Node is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If NodeLength >= 0x10000, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Node A pointer to a device path node data structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Length The length, in bytes, of the device path node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return Length
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINT16
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSetDevicePathNodeLength (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT VOID *Node,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINTN Length
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Node != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Length < 0x10000);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return WriteUnaligned16 ((UINT16 *)&((EFI_DEVICE_PATH_PROTOCOL *)(Node))->Length[0], (UINT16)(Length));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Fills in all the fields of a device path node that is the end of an entire device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Fills in all the fields of a device path node specified by Node so Node represents
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the end of an entire device path. The Type field of Node is set to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync END_DEVICE_PATH_TYPE, the SubType field of Node is set to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync END_ENTIRE_DEVICE_PATH_SUBTYPE, and the Length field of Node is set to
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync END_DEVICE_PATH_LENGTH. Node is not required to be aligned on a 16-bit boundary,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync so it is recommended that a function such as WriteUnaligned16() be used to set
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the contents of the Length field.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Node is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Node A pointer to a device path node data structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncVOID
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncSetDevicePathEndNode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT VOID *Node
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Node != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (Node, &mUefiDevicePathLibEndDevicePath, sizeof (mUefiDevicePathLibEndDevicePath));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Returns the size of a device path in bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function returns the size, in bytes, of the device path data structure
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync specified by DevicePath including the end of device path node. If DevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is NULL, then 0 is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DevicePath A pointer to a device path data structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval 0 If DevicePath is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others The size of a device path in bytes.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncUINTN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGetDevicePathSize (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONST EFI_DEVICE_PATH_PROTOCOL *Start;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DevicePath == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Search for the end of the device path structure
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Start = DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsDevicePathEnd (DevicePath)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath = NextDevicePathNode (DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Compute the size and add back in the size of the end device path structure
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ((UINTN) DevicePath - (UINTN) Start) + DevicePathNodeLength (DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Creates a new copy of an existing device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function allocates space for a new copy of the device path specified by DevicePath.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If DevicePath is NULL, then NULL is returned. If the memory is successfully
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync allocated, then the contents of DevicePath are copied to the newly allocated
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync buffer, and a pointer to that buffer is returned. Otherwise, NULL is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The memory for the new device path is allocated from EFI boot services memory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync It is the responsibility of the caller to free the memory allocated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DevicePath A pointer to a device path data structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL If DevicePath is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others A pointer to the duplicated device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_DEVICE_PATH_PROTOCOL *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDuplicateDevicePath (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Compute the size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = GetDevicePathSize (DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Size == 0) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate space for duplicate device path
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return AllocateCopyPool (Size, DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Creates a new device path by appending a second device path to a first device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function creates a new device path by appending a copy of SecondDevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync to a copy of FirstDevicePath in a newly allocated buffer. Only the end-of-device-path
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync device node from SecondDevicePath is retained. The newly created device path is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync returned. If FirstDevicePath is NULL, then it is ignored, and a duplicate of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SecondDevicePath is returned. If SecondDevicePath is NULL, then it is ignored,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and a duplicate of FirstDevicePath is returned. If both FirstDevicePath and
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SecondDevicePath are NULL, then a copy of an end-of-device-path is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If there is not enough memory for the newly allocated buffer, then NULL is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The memory for the new device path is allocated from EFI boot services memory.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync It is the responsibility of the caller to free the memory allocated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FirstDevicePath A pointer to a device path data structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param SecondDevicePath A pointer to a device path data structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL If there is not enough memory for the newly allocated buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others A pointer to the new device path if success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Or a copy an end-of-device-path if both FirstDevicePath and SecondDevicePath are NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_DEVICE_PATH_PROTOCOL *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncAppendDevicePath (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_DEVICE_PATH_PROTOCOL *FirstDevicePath, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_DEVICE_PATH_PROTOCOL *SecondDevicePath OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Size2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *DevicePath2;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If there's only 1 path, just duplicate it.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FirstDevicePath == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return DuplicateDevicePath ((SecondDevicePath != NULL) ? SecondDevicePath : &mUefiDevicePathLibEndDevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (SecondDevicePath == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return DuplicateDevicePath (FirstDevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Allocate space for the combined device path. It only has one end node of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // length EFI_DEVICE_PATH_PROTOCOL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size1 = GetDevicePathSize (FirstDevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size2 = GetDevicePathSize (SecondDevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = Size1 + Size2 - END_DEVICE_PATH_LENGTH;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewDevicePath = AllocatePool (Size);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewDevicePath != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewDevicePath = CopyMem (NewDevicePath, FirstDevicePath, Size1);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Over write FirstDevicePath EndNode and do the copy
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath2 = (EFI_DEVICE_PATH_PROTOCOL *) ((CHAR8 *) NewDevicePath +
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (Size1 - END_DEVICE_PATH_LENGTH));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (DevicePath2, SecondDevicePath, Size2);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NewDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Creates a new path by appending the device node to the device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function creates a new device path by appending a copy of the device node
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync specified by DevicePathNode to a copy of the device path specified by DevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync in an allocated buffer. The end-of-device-path device node is moved after the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync end of the appended device node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If DevicePathNode is NULL then a copy of DevicePath is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If DevicePath is NULL then a copy of DevicePathNode, followed by an end-of-device
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync path device node is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If both DevicePathNode and DevicePath are NULL then a copy of an end-of-device-path
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync device node is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If there is not enough memory to allocate space for the new device path, then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The memory is allocated from EFI boot services memory. It is the responsibility
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the caller to free the memory allocated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DevicePath A pointer to a device path data structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DevicePathNode A pointer to a single device path node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval NULL If there is not enough memory for the new device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval Others A pointer to the new device path if success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync A copy of DevicePathNode followed by an end-of-device-path node
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if both FirstDevicePath and SecondDevicePath are NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync A copy of an end-of-device-path node if both FirstDevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync and SecondDevicePath are NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_DEVICE_PATH_PROTOCOL *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncAppendDevicePathNode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePathNode OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *NextNode;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN NodeLength;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DevicePathNode == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return DuplicateDevicePath ((DevicePath != NULL) ? DevicePath : &mUefiDevicePathLibEndDevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Build a Node that has a terminator on it
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NodeLength = DevicePathNodeLength (DevicePathNode);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempDevicePath = AllocatePool (NodeLength + END_DEVICE_PATH_LENGTH);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (TempDevicePath == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempDevicePath = CopyMem (TempDevicePath, DevicePathNode, NodeLength);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Add and end device path node to convert Node to device path
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NextNode = NextDevicePathNode (TempDevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetDevicePathEndNode (NextNode);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Append device paths
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewDevicePath = AppendDevicePath (DevicePath, TempDevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (TempDevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NewDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Creates a new device path by appending the specified device path instance to the specified device
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function creates a new device path by appending a copy of the device path
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync instance specified by DevicePathInstance to a copy of the device path specified
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync by DevicePath in a allocated buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The end-of-device-path device node is moved after the end of the appended device
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync path instance and a new end-of-device-path-instance node is inserted between.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If DevicePath is NULL, then a copy if DevicePathInstance is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If DevicePathInstance is NULL, then NULL is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If there is not enough memory to allocate space for the new device path, then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The memory is allocated from EFI boot services memory. It is the responsibility
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the caller to free the memory allocated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DevicePath A pointer to a device path data structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DevicePathInstance A pointer to a device path instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return A pointer to the new device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_DEVICE_PATH_PROTOCOL *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncAppendDevicePathInstance (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePathInstance OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN SrcSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN InstanceSize;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DevicePath == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return DuplicateDevicePath (DevicePathInstance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DevicePathInstance == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SrcSize = GetDevicePathSize (DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync InstanceSize = GetDevicePathSize (DevicePathInstance);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NewDevicePath = AllocatePool (SrcSize + InstanceSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NewDevicePath != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempDevicePath = CopyMem (NewDevicePath, DevicePath, SrcSize);;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsDevicePathEnd (TempDevicePath)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempDevicePath = NextDevicePathNode (TempDevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempDevicePath->SubType = END_INSTANCE_DEVICE_PATH_SUBTYPE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync TempDevicePath = NextDevicePathNode (TempDevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (TempDevicePath, DevicePathInstance, InstanceSize);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NewDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Creates a copy of the current device path instance and returns a pointer to the next device path
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function creates a copy of the current device path instance. It also updates
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath to point to the next device path instance in the device path (or NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if no more) and updates Size to hold the size of the device path instance copy.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If DevicePath is NULL, then NULL is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If there is not enough memory to allocate space for the new device path, then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The memory is allocated from EFI boot services memory. It is the responsibility
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the caller to free the memory allocated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Size is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DevicePath On input, this holds the pointer to the current
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync device path instance. On output, this holds
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the pointer to the next device path instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync or NULL if there are no more device path
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync instances in the device path pointer to a
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync device path data structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Size On output, this holds the size of the device
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync path instance, in bytes or zero, if DevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return A pointer to the current device path instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_DEVICE_PATH_PROTOCOL *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncGetNextDevicePathInstance (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync OUT UINTN *Size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *DevPath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *ReturnValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT8 Temp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ASSERT (Size != NULL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DevicePath == NULL || *DevicePath == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Size = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Find the end of the device path instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevPath = *DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsDevicePathEndType (DevPath)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevPath = NextDevicePathNode (DevPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Compute the size of the device path instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *Size = ((UINTN) DevPath - (UINTN) (*DevicePath)) + sizeof (EFI_DEVICE_PATH_PROTOCOL);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Make a copy and return the device path instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Temp = DevPath->SubType;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevPath->SubType = END_ENTIRE_DEVICE_PATH_SUBTYPE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ReturnValue = DuplicateDevicePath (*DevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevPath->SubType = Temp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // If DevPath is the end of an entire device path, then another instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // does not follow, so *DevicePath is set to NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DevicePathSubType (DevPath) == END_ENTIRE_DEVICE_PATH_SUBTYPE) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *DevicePath = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *DevicePath = NextDevicePathNode (DevPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return ReturnValue;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Creates a device node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function creates a new device node in a newly allocated buffer of size
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NodeLength and initializes the device path node header with NodeType and NodeSubType.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The new device path node is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If NodeLength is smaller than a device path header, then NULL is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If there is not enough memory to allocate space for the new device path, then
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NULL is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The memory is allocated from EFI boot services memory. It is the responsibility
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the caller to free the memory allocated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param NodeType The device node type for the new device node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param NodeSubType The device node sub-type for the new device node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param NodeLength The length of the new device node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The new device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_DEVICE_PATH_PROTOCOL *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncCreateDeviceNode (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 NodeType,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT8 NodeSubType,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN UINT16 NodeLength
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (NodeLength < sizeof (EFI_DEVICE_PATH_PROTOCOL)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // NodeLength is less than the size of the header.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync //
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath = AllocateZeroPool (NodeLength);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DevicePath != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath->Type = NodeType;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath->SubType = NodeSubType;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetDevicePathNodeLength (DevicePath, NodeLength);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Determines if a device path is single or multi-instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function returns TRUE if the device path specified by DevicePath is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync multi-instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Otherwise, FALSE is returned. If DevicePath is NULL, then FALSE is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param DevicePath A pointer to a device path data structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval TRUE DevicePath is multi-instance.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @retval FALSE DevicePath is not multi-instance or DevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncBOOLEAN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncIsDevicePathMultiInstance (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CONST EFI_DEVICE_PATH_PROTOCOL *Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (DevicePath == NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node = DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync while (!IsDevicePathEnd (Node)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (IsDevicePathEndInstance (Node)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return TRUE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Node = NextDevicePathNode (Node);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return FALSE;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Retrieves the device path protocol from a handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This function returns the device path protocol from the handle specified by Handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Handle is NULL or Handle does not contain a device path protocol, then NULL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Handle The handle from which to retrieve the device
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync path protocol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The device path protocol from the handle specified by Handle.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_DEVICE_PATH_PROTOCOL *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncDevicePathFromHandle (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_STATUS Status;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Status = gBS->HandleProtocol (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Handle,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync &gEfiDevicePathProtocolGuid,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (VOID *) &DevicePath
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (EFI_ERROR (Status)) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/**
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Allocates a device path for a file and appends it to an existing device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If Device is a valid device handle that contains a device path protocol, then a device path for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync the file specified by FileName is allocated and appended to the device path associated with the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync handle Device. The allocated device path is returned. If Device is NULL or Device is a handle
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync that does not support the device path protocol, then a device path containing a single device
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync path node for the file specified by FileName is allocated and returned.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The memory for the new device path is allocated from EFI boot services memory. It is the responsibility
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync of the caller to free the memory allocated.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If FileName is NULL, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync If FileName is not aligned on a 16-bit boundary, then ASSERT().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param Device A pointer to a device handle. This parameter
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync is optional and may be NULL.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @param FileName A pointer to a Null-terminated Unicode string.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync @return The allocated device path.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFI_DEVICE_PATH_PROTOCOL *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncEFIAPI
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncFileDevicePath (
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN EFI_HANDLE Device, OPTIONAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync IN CONST CHAR16 *FileName
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FILEPATH_DEVICE_PATH *FilePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_DEVICE_PATH_PROTOCOL *FileDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Size = (UINT16) StrSize (FileName);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FileDevicePath = AllocatePool (Size + SIZE_OF_FILEPATH_DEVICE_PATH + END_DEVICE_PATH_LENGTH);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (FileDevicePath != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FilePath = (FILEPATH_DEVICE_PATH *) FileDevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FilePath->Header.Type = MEDIA_DEVICE_PATH;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FilePath->Header.SubType = MEDIA_FILEPATH_DP;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync CopyMem (&FilePath->PathName, FileName, Size);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetDevicePathNodeLength (&FilePath->Header, Size + SIZE_OF_FILEPATH_DEVICE_PATH);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync SetDevicePathEndNode (NextDevicePathNode (&FilePath->Header));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (Device != NULL) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath = DevicePathFromHandle (Device);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync DevicePath = AppendDevicePath (DevicePath, FileDevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FreePool (FileDevicePath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return DevicePath;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync