mirror of https://github.com/acidanthera/audk.git
275 lines
8.4 KiB
C
275 lines
8.4 KiB
C
/** @file
|
|
UEFI Device Path Library.
|
|
|
|
Copyright (c) 2006, Intel Corporation<BR>
|
|
All rights reserved. This program and the accompanying materials
|
|
are licensed and made available under the terms and conditions of the BSD License
|
|
which accompanies this distribution. The full text of the license may be found at
|
|
http://opensource.org/licenses/bsd-license.php
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
Module Name: UefiDevicePathLib.c
|
|
|
|
**/
|
|
|
|
STATIC EFI_DEVICE_PATH_UTILITIES_PROTOCOL *mDevicePathUtilities = NULL;
|
|
|
|
/**
|
|
The constructor function caches the pointer to DevicePathUtilites protocol.
|
|
|
|
The constructor function locates DevicePathUtilities protocol from protocol database.
|
|
It will ASSERT() if that operation fails and it will always return EFI_SUCCESS.
|
|
|
|
@param ImageHandle The firmware allocated handle for the EFI image.
|
|
@param SystemTable A pointer to the EFI System Table.
|
|
|
|
@retval EFI_SUCCESS The constructor always returns EFI_SUCCESS.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
DevicePathLibConstructor (
|
|
IN EFI_HANDLE ImageHandle,
|
|
IN EFI_SYSTEM_TABLE *SystemTable
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
|
|
Status = gBS->LocateProtocol (
|
|
&gEfiDevicePathUtilitiesProtocolGuid,
|
|
NULL,
|
|
(VOID**) &mDevicePathUtilities
|
|
);
|
|
ASSERT_EFI_ERROR (Status);
|
|
ASSERT (mDevicePathUtilities != NULL);
|
|
|
|
return Status;
|
|
}
|
|
|
|
/**
|
|
This function returns the size, in bytes,
|
|
of the device path data structure specified by DevicePath.
|
|
If DevicePath is NULL, then 0 is returned.
|
|
|
|
@param DevicePath A pointer to a device path data structure.
|
|
|
|
@return The size of a device path in bytes.
|
|
|
|
**/
|
|
UINTN
|
|
EFIAPI
|
|
GetDevicePathSize (
|
|
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath
|
|
)
|
|
{
|
|
return mDevicePathUtilities->GetDevicePathSize (DevicePath);
|
|
}
|
|
|
|
/**
|
|
This function allocates space for a new copy of the device path
|
|
specified by DevicePath.
|
|
|
|
@param DevicePath A pointer to a device path data structure.
|
|
|
|
@return The duplicated device path.
|
|
|
|
**/
|
|
EFI_DEVICE_PATH_PROTOCOL *
|
|
EFIAPI
|
|
DuplicateDevicePath (
|
|
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath
|
|
)
|
|
{
|
|
return mDevicePathUtilities->DuplicateDevicePath (DevicePath);
|
|
}
|
|
|
|
/**
|
|
This function appends the device path SecondDevicePath
|
|
to every device path instance in FirstDevicePath.
|
|
|
|
@param FirstDevicePath A pointer to a device path data structure.
|
|
|
|
@param SecondDevicePath A pointer to a device path data structure.
|
|
|
|
@return A pointer to the new device path is returned.
|
|
NULL is returned if space for the new device path could not be allocated from pool.
|
|
It is up to the caller to free the memory used by FirstDevicePath and SecondDevicePath
|
|
if they are no longer needed.
|
|
|
|
**/
|
|
EFI_DEVICE_PATH_PROTOCOL *
|
|
EFIAPI
|
|
AppendDevicePath (
|
|
IN CONST EFI_DEVICE_PATH_PROTOCOL *FirstDevicePath,
|
|
IN CONST EFI_DEVICE_PATH_PROTOCOL *SecondDevicePath
|
|
)
|
|
{
|
|
return mDevicePathUtilities->AppendDevicePath (FirstDevicePath, SecondDevicePath);
|
|
}
|
|
|
|
/**
|
|
This function appends the device path node SecondDevicePath
|
|
to every device path instance in FirstDevicePath.
|
|
|
|
@param FirstDevicePath A pointer to a device path data structure.
|
|
|
|
@param SecondDevicePath A pointer to a single device path node.
|
|
|
|
@return A pointer to the new device path.
|
|
If there is not enough temporary pool memory available to complete this function,
|
|
then NULL is returned.
|
|
|
|
**/
|
|
EFI_DEVICE_PATH_PROTOCOL *
|
|
EFIAPI
|
|
AppendDevicePathNode (
|
|
IN CONST EFI_DEVICE_PATH_PROTOCOL *FirstDevicePath,
|
|
IN CONST EFI_DEVICE_PATH_PROTOCOL *SecondDevicePath
|
|
)
|
|
{
|
|
return mDevicePathUtilities->AppendDeviceNode (FirstDevicePath, SecondDevicePath);
|
|
}
|
|
|
|
/**
|
|
This function appends the device path instance Instance to the device path Source.
|
|
If Source is NULL, then a new device path with one instance is created.
|
|
|
|
@param Source A pointer to a device path data structure.
|
|
@param Instance A pointer to a device path instance.
|
|
|
|
@return A pointer to the new device path.
|
|
If there is not enough temporary pool memory available to complete this function,
|
|
then NULL is returned.
|
|
|
|
**/
|
|
EFI_DEVICE_PATH_PROTOCOL *
|
|
EFIAPI
|
|
AppendDevicePathInstance (
|
|
IN CONST EFI_DEVICE_PATH_PROTOCOL *Source,
|
|
IN CONST EFI_DEVICE_PATH_PROTOCOL *Instance
|
|
)
|
|
{
|
|
return mDevicePathUtilities->AppendDevicePathInstance (Source, Instance);
|
|
}
|
|
|
|
/**
|
|
Function retrieves the next device path instance from a device path data structure.
|
|
|
|
@param DevicePath A pointer to a device path data structure.
|
|
|
|
@param Size A pointer to the size of a device path instance in bytes.
|
|
|
|
@return This function returns a pointer to the current device path instance.
|
|
In addition, it returns the size in bytes of the current device path instance in Size,
|
|
and a pointer to the next device path instance in DevicePath.
|
|
If there are no more device path instances in DevicePath, then DevicePath will be set to NULL.
|
|
|
|
**/
|
|
EFI_DEVICE_PATH_PROTOCOL *
|
|
EFIAPI
|
|
GetNextDevicePathInstance (
|
|
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath,
|
|
OUT UINTN *Size
|
|
)
|
|
{
|
|
ASSERT (DevicePath != NULL);
|
|
ASSERT (Size != NULL);
|
|
return mDevicePathUtilities->GetNextDevicePathInstance (DevicePath, Size);
|
|
}
|
|
|
|
/**
|
|
Return TRUE is this is a multi instance device path.
|
|
|
|
@param DevicePath A pointer to a device path data structure.
|
|
|
|
@retval TRUE If DevicePath is multi-instance.
|
|
@retval FALSE If DevicePath is not multi-instance or DevicePath is NULL.
|
|
|
|
**/
|
|
BOOLEAN
|
|
EFIAPI
|
|
IsDevicePathMultiInstance (
|
|
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath
|
|
)
|
|
{
|
|
return mDevicePathUtilities->IsDevicePathMultiInstance (DevicePath);
|
|
}
|
|
|
|
/**
|
|
This function retrieves the device path protocol from a handle.
|
|
|
|
@param Handle The handle from which to retrieve the device path protocol.
|
|
|
|
@return This function returns the device path protocol from the handle specified by Handle.
|
|
If Handle is NULL or Handle does not contain a device path protocol, then NULL is returned.
|
|
|
|
**/
|
|
EFI_DEVICE_PATH_PROTOCOL *
|
|
EFIAPI
|
|
DevicePathFromHandle (
|
|
IN EFI_HANDLE Handle
|
|
)
|
|
{
|
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
|
EFI_STATUS Status;
|
|
|
|
Status = gBS->HandleProtocol (
|
|
Handle,
|
|
&gEfiDevicePathProtocolGuid,
|
|
(VOID *) &DevicePath
|
|
);
|
|
if (EFI_ERROR (Status)) {
|
|
DevicePath = NULL;
|
|
}
|
|
return DevicePath;
|
|
}
|
|
|
|
/**
|
|
This function allocates a device path for a file and appends it to an existing device path.
|
|
|
|
@param Device A pointer to a device handle. This parameter is optional and may be NULL.
|
|
@param FileName A pointer to a Null-terminated Unicode string.
|
|
|
|
@return If Device is a valid device handle that contains a device path protocol,
|
|
then a device path for the file specified by FileName is allocated
|
|
and appended to the device path associated with the handle Device. The allocated device path is returned.
|
|
If Device is NULL or Device is a handle that does not support the device path protocol,
|
|
then a device path containing a single device path node for the file specified by FileName
|
|
is allocated and returned.
|
|
|
|
**/
|
|
EFI_DEVICE_PATH_PROTOCOL *
|
|
EFIAPI
|
|
FileDevicePath (
|
|
IN EFI_HANDLE Device, OPTIONAL
|
|
IN CONST CHAR16 *FileName
|
|
)
|
|
{
|
|
UINTN Size;
|
|
FILEPATH_DEVICE_PATH *FilePath;
|
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
|
EFI_DEVICE_PATH_PROTOCOL *FileDevicePathNode;
|
|
|
|
DevicePath = NULL;
|
|
|
|
Size = StrSize (FileName);
|
|
FileDevicePathNode = mDevicePathUtilities->CreateDeviceNode (
|
|
MEDIA_DEVICE_PATH,
|
|
MEDIA_FILEPATH_DP,
|
|
(UINT16) (Size + SIZE_OF_FILEPATH_DEVICE_PATH)
|
|
);
|
|
if (FileDevicePathNode != NULL) {
|
|
FilePath = (FILEPATH_DEVICE_PATH *) FileDevicePathNode;
|
|
CopyMem (&FilePath->PathName, FileName, Size);
|
|
if (Device != NULL) {
|
|
DevicePath = DevicePathFromHandle (Device);
|
|
}
|
|
DevicePath = AppendDevicePathNode (DevicePath, FileDevicePathNode);
|
|
FreePool (FileDevicePathNode);
|
|
}
|
|
return DevicePath;
|
|
}
|
|
|