Initial import.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@ -0,0 +1,274 @@
|
||||
/** @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;
|
||||
}
|
||||
|
Reference in New Issue
Block a user