mirror of https://github.com/acidanthera/audk.git
Add new API IsDevicePathValid() to UefiDevicePathLib.
Signed-off-by: Ruiyu Ni<ruiyu.ni@intel.com> Reviewed-by: Liming Gao<liming.gao@intel.com> Reviewed-by: Kinney Michael D<michael.d.kinney@intel.com> git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13737 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
7f446eba26
commit
771729c77f
|
@ -4,7 +4,7 @@
|
||||||
This library provides defines, macros, and functions to help create and parse
|
This library provides defines, macros, and functions to help create and parse
|
||||||
EFI_DEVICE_PATH_PROTOCOL structures.
|
EFI_DEVICE_PATH_PROTOCOL structures.
|
||||||
|
|
||||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials are licensed and made available under
|
This program and the accompanying materials are licensed and made available under
|
||||||
the terms and conditions of the BSD License that accompanies this distribution.
|
the terms and conditions of the BSD License that accompanies this distribution.
|
||||||
The full text of the license may be found at
|
The full text of the license may be found at
|
||||||
|
@ -20,6 +20,28 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||||
|
|
||||||
#define END_DEVICE_PATH_LENGTH (sizeof (EFI_DEVICE_PATH_PROTOCOL))
|
#define END_DEVICE_PATH_LENGTH (sizeof (EFI_DEVICE_PATH_PROTOCOL))
|
||||||
|
|
||||||
|
/**
|
||||||
|
Determine whether a given device path is valid.
|
||||||
|
If DevicePath is NULL, then ASSERT().
|
||||||
|
|
||||||
|
@param DevicePath A pointer to a device path data structure.
|
||||||
|
@param MaxSize The maximum size of the device path data structure.
|
||||||
|
|
||||||
|
@retval TRUE DevicePath is valid.
|
||||||
|
@retval FALSE The length of any node node in the DevicePath is less
|
||||||
|
than sizeof (EFI_DEVICE_PATH_PROTOCOL).
|
||||||
|
@retval FALSE If MaxSize is not zero, the size of the DevicePath
|
||||||
|
exceeds MaxSize.
|
||||||
|
@retval FALSE If PcdMaximumDevicePathNodeCount is not zero, the node
|
||||||
|
count of the DevicePath exceeds PcdMaximumDevicePathNodeCount.
|
||||||
|
**/
|
||||||
|
BOOLEAN
|
||||||
|
EFIAPI
|
||||||
|
IsDevicePathValid (
|
||||||
|
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||||
|
IN UINTN MaxSize
|
||||||
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Returns the Type field of a device path node.
|
Returns the Type field of a device path node.
|
||||||
|
|
||||||
|
@ -123,7 +145,8 @@ IsDevicePathEndType (
|
||||||
Determines if a device path node is an end node of an entire device path.
|
Determines if a device path node is an end node of an entire device path.
|
||||||
|
|
||||||
Determines if a device path node specified by Node is an end node of an entire device path.
|
Determines if a device path node specified by Node is an end node of an entire device path.
|
||||||
If Node represents the end of an entire device path, then TRUE is returned. Otherwise, FALSE is returned.
|
If Node represents the end of an entire device path, then TRUE is returned.
|
||||||
|
Otherwise, FALSE is returned.
|
||||||
|
|
||||||
If Node is NULL, then ASSERT().
|
If Node is NULL, then ASSERT().
|
||||||
|
|
||||||
|
@ -143,7 +166,8 @@ IsDevicePathEnd (
|
||||||
Determines if a device path node is an end node of a device path instance.
|
Determines if a device path node is an end node of a device path instance.
|
||||||
|
|
||||||
Determines if a device path node specified by Node is an end node of a device path instance.
|
Determines if a device path node specified by Node is an end node of a device path instance.
|
||||||
If Node represents the end of a device path instance, then TRUE is returned. Otherwise, FALSE is returned.
|
If Node represents the end of a device path instance, then TRUE is returned.
|
||||||
|
Otherwise, FALSE is returned.
|
||||||
|
|
||||||
If Node is NULL, then ASSERT().
|
If Node is NULL, then ASSERT().
|
||||||
|
|
||||||
|
@ -169,6 +193,7 @@ IsDevicePathEndInstance (
|
||||||
|
|
||||||
If Node is NULL, then ASSERT().
|
If Node is NULL, then ASSERT().
|
||||||
If NodeLength >= 0x10000, then ASSERT().
|
If NodeLength >= 0x10000, then ASSERT().
|
||||||
|
If NodeLength < sizeof (EFI_DEVICE_PATH_PROTOCOL), then ASSERT().
|
||||||
|
|
||||||
@param Node A pointer to a device path node data structure.
|
@param Node A pointer to a device path node data structure.
|
||||||
@param Length The length, in bytes, of the device path node.
|
@param Length The length, in bytes, of the device path node.
|
||||||
|
@ -208,13 +233,14 @@ SetDevicePathEndNode (
|
||||||
/**
|
/**
|
||||||
Returns the size of a device path in bytes.
|
Returns the size of a device path in bytes.
|
||||||
|
|
||||||
This function returns the size, in bytes, of the device path data structure specified by
|
This function returns the size, in bytes, of the device path data structure
|
||||||
DevicePath including the end of device path node. If DevicePath is NULL, then 0 is returned.
|
specified by DevicePath including the end of device path node.
|
||||||
|
If DevicePath is NULL or invalid, then 0 is returned.
|
||||||
|
|
||||||
@param DevicePath A pointer to a device path data structure.
|
@param DevicePath A pointer to a device path data structure.
|
||||||
|
|
||||||
@retval 0 DevicePath is NULL.
|
@retval 0 If DevicePath is NULL or invalid.
|
||||||
@retval Others The size of a device path in bytes.
|
@retval Others The size of a device path in bytes.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
UINTN
|
UINTN
|
||||||
|
@ -235,7 +261,7 @@ GetDevicePathSize (
|
||||||
|
|
||||||
@param DevicePath A pointer to a device path data structure.
|
@param DevicePath A pointer to a device path data structure.
|
||||||
|
|
||||||
@retval NULL DevicePath is NULL.
|
@retval NULL DevicePath is NULL or invalid.
|
||||||
@retval Others A pointer to the duplicated device path.
|
@retval Others A pointer to the duplicated device path.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
@ -263,6 +289,7 @@ DuplicateDevicePath (
|
||||||
@param SecondDevicePath A pointer to a device path data structure.
|
@param SecondDevicePath A pointer to a device path data structure.
|
||||||
|
|
||||||
@retval NULL If there is not enough memory for the newly allocated buffer.
|
@retval NULL If there is not enough memory for the newly allocated buffer.
|
||||||
|
@retval NULL If FirstDevicePath or SecondDevicePath is invalid.
|
||||||
@retval Others A pointer to the new device path if success.
|
@retval Others A pointer to the new device path if success.
|
||||||
Or a copy an end-of-device-path if both FirstDevicePath and SecondDevicePath are NULL.
|
Or a copy an end-of-device-path if both FirstDevicePath and SecondDevicePath are NULL.
|
||||||
|
|
||||||
|
@ -316,6 +343,7 @@ AppendDevicePathNode (
|
||||||
and a new end-of-device-path-instance node is inserted between.
|
and a new end-of-device-path-instance node is inserted between.
|
||||||
If DevicePath is NULL, then a copy if DevicePathInstance is returned.
|
If DevicePath is NULL, then a copy if DevicePathInstance is returned.
|
||||||
If DevicePathInstance is NULL, then NULL is returned.
|
If DevicePathInstance is NULL, then NULL is returned.
|
||||||
|
If DevicePath or DevicePathInstance is invalid, then NULL is returned.
|
||||||
If there is not enough memory to allocate space for the new device path, then NULL is returned.
|
If there is not enough memory to allocate space for the new device path, then NULL is returned.
|
||||||
The memory is allocated from EFI boot services memory. It is the responsibility of the caller to
|
The memory is allocated from EFI boot services memory. It is the responsibility of the caller to
|
||||||
free the memory allocated.
|
free the memory allocated.
|
||||||
|
@ -341,6 +369,7 @@ AppendDevicePathInstance (
|
||||||
point to the next device path instance in the device path (or NULL if no more) and updates Size
|
point to the next device path instance in the device path (or NULL if no more) and updates Size
|
||||||
to hold the size of the device path instance copy.
|
to hold the size of the device path instance copy.
|
||||||
If DevicePath is NULL, then NULL is returned.
|
If DevicePath is NULL, then NULL is returned.
|
||||||
|
If DevicePath points to a invalid device path, then NULL is returned.
|
||||||
If there is not enough memory to allocate space for the new device path, then NULL is returned.
|
If there is not enough memory to allocate space for the new device path, then NULL is returned.
|
||||||
The memory is allocated from EFI boot services memory. It is the responsibility of the caller to
|
The memory is allocated from EFI boot services memory. It is the responsibility of the caller to
|
||||||
free the memory allocated.
|
free the memory allocated.
|
||||||
|
@ -394,12 +423,13 @@ CreateDeviceNode (
|
||||||
Determines if a device path is single or multi-instance.
|
Determines if a device path is single or multi-instance.
|
||||||
|
|
||||||
This function returns TRUE if the device path specified by DevicePath is multi-instance.
|
This function returns TRUE if the device path specified by DevicePath is multi-instance.
|
||||||
Otherwise, FALSE is returned. If DevicePath is NULL, then FALSE is returned.
|
Otherwise, FALSE is returned.
|
||||||
|
If DevicePath is NULL or invalid, then FALSE is returned.
|
||||||
|
|
||||||
@param DevicePath A pointer to a device path data structure.
|
@param DevicePath A pointer to a device path data structure.
|
||||||
|
|
||||||
@retval TRUE DevicePath is multi-instance.
|
@retval TRUE DevicePath is multi-instance.
|
||||||
@retval FALSE DevicePath is not multi-instance, or DevicePath is NULL.
|
@retval FALSE DevicePath is not multi-instance, or DevicePath is NULL or invalid.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
|
|
|
@ -8,7 +8,7 @@
|
||||||
environment varibles. Multi-instance device paths should never be placed
|
environment varibles. Multi-instance device paths should never be placed
|
||||||
on a Handle.
|
on a Handle.
|
||||||
|
|
||||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -28,6 +28,7 @@
|
||||||
#include <Library/MemoryAllocationLib.h>
|
#include <Library/MemoryAllocationLib.h>
|
||||||
#include <Library/UefiBootServicesTableLib.h>
|
#include <Library/UefiBootServicesTableLib.h>
|
||||||
#include <Library/BaseLib.h>
|
#include <Library/BaseLib.h>
|
||||||
|
#include <Library/PcdLib.h>
|
||||||
|
|
||||||
//
|
//
|
||||||
// Template for an end-of-device path node.
|
// Template for an end-of-device path node.
|
||||||
|
@ -41,6 +42,61 @@ GLOBAL_REMOVE_IF_UNREFERENCED CONST EFI_DEVICE_PATH_PROTOCOL mUefiDevicePathLib
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
Determine whether a given device path is valid.
|
||||||
|
If DevicePath is NULL, then ASSERT().
|
||||||
|
|
||||||
|
@param DevicePath A pointer to a device path data structure.
|
||||||
|
@param MaxSize The maximum size of the device path data structure.
|
||||||
|
|
||||||
|
@retval TRUE DevicePath is valid.
|
||||||
|
@retval FALSE The length of any node node in the DevicePath is less
|
||||||
|
than sizeof (EFI_DEVICE_PATH_PROTOCOL).
|
||||||
|
@retval FALSE If MaxSize is not zero, the size of the DevicePath
|
||||||
|
exceeds MaxSize.
|
||||||
|
@retval FALSE If PcdMaximumDevicePathNodeCount is not zero, the node
|
||||||
|
count of the DevicePath exceeds PcdMaximumDevicePathNodeCount.
|
||||||
|
**/
|
||||||
|
BOOLEAN
|
||||||
|
EFIAPI
|
||||||
|
IsDevicePathValid (
|
||||||
|
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||||
|
IN UINTN MaxSize
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINTN Count;
|
||||||
|
UINTN Size;
|
||||||
|
UINTN NodeLength;
|
||||||
|
|
||||||
|
ASSERT (DevicePath != NULL);
|
||||||
|
|
||||||
|
for (Count = 0, Size = 0; !IsDevicePathEnd (DevicePath); DevicePath = NextDevicePathNode (DevicePath)) {
|
||||||
|
NodeLength = DevicePathNodeLength (DevicePath);
|
||||||
|
if (NodeLength < sizeof (EFI_DEVICE_PATH_PROTOCOL)) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MaxSize > 0) {
|
||||||
|
Size += NodeLength;
|
||||||
|
if (Size + END_DEVICE_PATH_LENGTH > MaxSize) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PcdGet32 (PcdMaximumDevicePathNodeCount) > 0) {
|
||||||
|
Count++;
|
||||||
|
if (Count >= PcdGet32 (PcdMaximumDevicePathNodeCount)) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Only return TRUE when the End Device Path node is valid.
|
||||||
|
//
|
||||||
|
return (BOOLEAN) (DevicePathNodeLength (DevicePath) == END_DEVICE_PATH_LENGTH);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Returns the Type field of a device path node.
|
Returns the Type field of a device path node.
|
||||||
|
|
||||||
|
@ -106,8 +162,12 @@ DevicePathNodeLength (
|
||||||
IN CONST VOID *Node
|
IN CONST VOID *Node
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
UINTN Length;
|
||||||
|
|
||||||
ASSERT (Node != NULL);
|
ASSERT (Node != NULL);
|
||||||
return ReadUnaligned16 ((UINT16 *)&((EFI_DEVICE_PATH_PROTOCOL *)(Node))->Length[0]);
|
Length = ReadUnaligned16 ((UINT16 *)&((EFI_DEVICE_PATH_PROTOCOL *)(Node))->Length[0]);
|
||||||
|
ASSERT (Length >= sizeof (EFI_DEVICE_PATH_PROTOCOL));
|
||||||
|
return Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -227,7 +287,8 @@ IsDevicePathEndInstance (
|
||||||
be used to set the contents of the Length field.
|
be used to set the contents of the Length field.
|
||||||
|
|
||||||
If Node is NULL, then ASSERT().
|
If Node is NULL, then ASSERT().
|
||||||
If NodeLength >= 0x10000, then ASSERT().
|
If NodeLength >= SIZE_64KB, then ASSERT().
|
||||||
|
If NodeLength < sizeof (EFI_DEVICE_PATH_PROTOCOL), then ASSERT().
|
||||||
|
|
||||||
@param Node A pointer to a device path node data structure.
|
@param Node A pointer to a device path node data structure.
|
||||||
@param Length The length, in bytes, of the device path node.
|
@param Length The length, in bytes, of the device path node.
|
||||||
|
@ -243,7 +304,7 @@ SetDevicePathNodeLength (
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (Node != NULL);
|
ASSERT (Node != NULL);
|
||||||
ASSERT (Length < 0x10000);
|
ASSERT ((Length >= sizeof (EFI_DEVICE_PATH_PROTOCOL)) && (Length < SIZE_64KB));
|
||||||
return WriteUnaligned16 ((UINT16 *)&((EFI_DEVICE_PATH_PROTOCOL *)(Node))->Length[0], (UINT16)(Length));
|
return WriteUnaligned16 ((UINT16 *)&((EFI_DEVICE_PATH_PROTOCOL *)(Node))->Length[0], (UINT16)(Length));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -277,12 +338,12 @@ SetDevicePathEndNode (
|
||||||
Returns the size of a device path in bytes.
|
Returns the size of a device path in bytes.
|
||||||
|
|
||||||
This function returns the size, in bytes, of the device path data structure
|
This function returns the size, in bytes, of the device path data structure
|
||||||
specified by DevicePath including the end of device path node. If DevicePath
|
specified by DevicePath including the end of device path node.
|
||||||
is NULL, then 0 is returned.
|
If DevicePath is NULL or invalid, then 0 is returned.
|
||||||
|
|
||||||
@param DevicePath A pointer to a device path data structure.
|
@param DevicePath A pointer to a device path data structure.
|
||||||
|
|
||||||
@retval 0 If DevicePath is NULL.
|
@retval 0 If DevicePath is NULL or invalid.
|
||||||
@retval Others The size of a device path in bytes.
|
@retval Others The size of a device path in bytes.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
@ -298,6 +359,10 @@ GetDevicePathSize (
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!IsDevicePathValid (DevicePath, 0)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Search for the end of the device path structure
|
// Search for the end of the device path structure
|
||||||
//
|
//
|
||||||
|
@ -324,7 +389,7 @@ GetDevicePathSize (
|
||||||
|
|
||||||
@param DevicePath A pointer to a device path data structure.
|
@param DevicePath A pointer to a device path data structure.
|
||||||
|
|
||||||
@retval NULL If DevicePath is NULL.
|
@retval NULL DevicePath is NULL or invalid.
|
||||||
@retval Others A pointer to the duplicated device path.
|
@retval Others A pointer to the duplicated device path.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
@ -370,6 +435,7 @@ DuplicateDevicePath (
|
||||||
@param SecondDevicePath A pointer to a device path data structure.
|
@param SecondDevicePath A pointer to a device path data structure.
|
||||||
|
|
||||||
@retval NULL If there is not enough memory for the newly allocated buffer.
|
@retval NULL If there is not enough memory for the newly allocated buffer.
|
||||||
|
@retval NULL If FirstDevicePath or SecondDevicePath is invalid.
|
||||||
@retval Others A pointer to the new device path if success.
|
@retval Others A pointer to the new device path if success.
|
||||||
Or a copy an end-of-device-path if both FirstDevicePath and SecondDevicePath are NULL.
|
Or a copy an end-of-device-path if both FirstDevicePath and SecondDevicePath are NULL.
|
||||||
|
|
||||||
|
@ -398,6 +464,10 @@ AppendDevicePath (
|
||||||
return DuplicateDevicePath (FirstDevicePath);
|
return DuplicateDevicePath (FirstDevicePath);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!IsDevicePathValid (FirstDevicePath, 0) || !IsDevicePathValid (SecondDevicePath, 0)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Allocate space for the combined device path. It only has one end node of
|
// Allocate space for the combined device path. It only has one end node of
|
||||||
// length EFI_DEVICE_PATH_PROTOCOL.
|
// length EFI_DEVICE_PATH_PROTOCOL.
|
||||||
|
@ -500,6 +570,7 @@ AppendDevicePathNode (
|
||||||
path instance and a new end-of-device-path-instance node is inserted between.
|
path instance and a new end-of-device-path-instance node is inserted between.
|
||||||
If DevicePath is NULL, then a copy if DevicePathInstance is returned.
|
If DevicePath is NULL, then a copy if DevicePathInstance is returned.
|
||||||
If DevicePathInstance is NULL, then NULL is returned.
|
If DevicePathInstance is NULL, then NULL is returned.
|
||||||
|
If DevicePath or DevicePathInstance is invalid, then NULL is returned.
|
||||||
If there is not enough memory to allocate space for the new device path, then
|
If there is not enough memory to allocate space for the new device path, then
|
||||||
NULL is returned.
|
NULL is returned.
|
||||||
The memory is allocated from EFI boot services memory. It is the responsibility
|
The memory is allocated from EFI boot services memory. It is the responsibility
|
||||||
|
@ -531,6 +602,10 @@ AppendDevicePathInstance (
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!IsDevicePathValid (DevicePath, 0) || !IsDevicePathValid (DevicePathInstance, 0)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
SrcSize = GetDevicePathSize (DevicePath);
|
SrcSize = GetDevicePathSize (DevicePath);
|
||||||
InstanceSize = GetDevicePathSize (DevicePathInstance);
|
InstanceSize = GetDevicePathSize (DevicePathInstance);
|
||||||
|
|
||||||
|
@ -559,6 +634,7 @@ AppendDevicePathInstance (
|
||||||
DevicePath to point to the next device path instance in the device path (or NULL
|
DevicePath to point to the next device path instance in the device path (or NULL
|
||||||
if no more) and updates Size to hold the size of the device path instance copy.
|
if no more) and updates Size to hold the size of the device path instance copy.
|
||||||
If DevicePath is NULL, then NULL is returned.
|
If DevicePath is NULL, then NULL is returned.
|
||||||
|
If DevicePath points to a invalid device path, then NULL is returned.
|
||||||
If there is not enough memory to allocate space for the new device path, then
|
If there is not enough memory to allocate space for the new device path, then
|
||||||
NULL is returned.
|
NULL is returned.
|
||||||
The memory is allocated from EFI boot services memory. It is the responsibility
|
The memory is allocated from EFI boot services memory. It is the responsibility
|
||||||
|
@ -596,6 +672,10 @@ GetNextDevicePathInstance (
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!IsDevicePathValid (*DevicePath, 0)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// Find the end of the device path instance
|
// Find the end of the device path instance
|
||||||
//
|
//
|
||||||
|
@ -681,13 +761,14 @@ CreateDeviceNode (
|
||||||
|
|
||||||
This function returns TRUE if the device path specified by DevicePath is
|
This function returns TRUE if the device path specified by DevicePath is
|
||||||
multi-instance.
|
multi-instance.
|
||||||
Otherwise, FALSE is returned. If DevicePath is NULL, then FALSE is returned.
|
Otherwise, FALSE is returned.
|
||||||
|
If DevicePath is NULL or invalid, then FALSE is returned.
|
||||||
|
|
||||||
@param DevicePath A pointer to a device path data structure.
|
@param DevicePath A pointer to a device path data structure.
|
||||||
|
|
||||||
@retval TRUE DevicePath is multi-instance.
|
@retval TRUE DevicePath is multi-instance.
|
||||||
@retval FALSE DevicePath is not multi-instance or DevicePath
|
@retval FALSE DevicePath is not multi-instance, or DevicePath
|
||||||
is NULL.
|
is NULL or invalid.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
|
@ -702,6 +783,10 @@ IsDevicePathMultiInstance (
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!IsDevicePathValid (DevicePath, 0)) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
Node = DevicePath;
|
Node = DevicePath;
|
||||||
while (!IsDevicePathEnd (Node)) {
|
while (!IsDevicePathEnd (Node)) {
|
||||||
if (IsDevicePathEndInstance (Node)) {
|
if (IsDevicePathEndInstance (Node)) {
|
||||||
|
@ -776,15 +861,14 @@ FileDevicePath (
|
||||||
IN CONST CHAR16 *FileName
|
IN CONST CHAR16 *FileName
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
UINT16 Size;
|
UINTN Size;
|
||||||
FILEPATH_DEVICE_PATH *FilePath;
|
FILEPATH_DEVICE_PATH *FilePath;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||||
EFI_DEVICE_PATH_PROTOCOL *FileDevicePath;
|
EFI_DEVICE_PATH_PROTOCOL *FileDevicePath;
|
||||||
|
|
||||||
DevicePath = NULL;
|
DevicePath = NULL;
|
||||||
|
|
||||||
Size = (UINT16) StrSize (FileName);
|
Size = StrSize (FileName);
|
||||||
|
|
||||||
FileDevicePath = AllocatePool (Size + SIZE_OF_FILEPATH_DEVICE_PATH + END_DEVICE_PATH_LENGTH);
|
FileDevicePath = AllocatePool (Size + SIZE_OF_FILEPATH_DEVICE_PATH + END_DEVICE_PATH_LENGTH);
|
||||||
if (FileDevicePath != NULL) {
|
if (FileDevicePath != NULL) {
|
||||||
FilePath = (FILEPATH_DEVICE_PATH *) FileDevicePath;
|
FilePath = (FILEPATH_DEVICE_PATH *) FileDevicePath;
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#
|
#
|
||||||
# Device Path Library that layers on top of the Memory Allocation Library.
|
# Device Path Library that layers on top of the Memory Allocation Library.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2007 - 2010, Intel Corporation. All rights reserved.<BR>
|
# Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||||
#
|
#
|
||||||
# This program and the accompanying materials
|
# This program and the accompanying materials
|
||||||
# are licensed and made available under the terms and conditions of the BSD License
|
# are licensed and made available under the terms and conditions of the BSD License
|
||||||
|
@ -42,8 +42,10 @@
|
||||||
MemoryAllocationLib
|
MemoryAllocationLib
|
||||||
DebugLib
|
DebugLib
|
||||||
BaseMemoryLib
|
BaseMemoryLib
|
||||||
|
PcdLib
|
||||||
|
|
||||||
[Protocols]
|
[Protocols]
|
||||||
gEfiDevicePathProtocolGuid ## CONSUMES
|
gEfiDevicePathProtocolGuid ## CONSUMES
|
||||||
|
|
||||||
|
[Pcd]
|
||||||
|
gEfiMdePkgTokenSpaceGuid.PcdMaximumDevicePathNodeCount
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
Library instance that implement UEFI Device Path Library class based on protocol
|
Library instance that implement UEFI Device Path Library class based on protocol
|
||||||
gEfiDevicePathUtilitiesProtocolGuid.
|
gEfiDevicePathUtilitiesProtocolGuid.
|
||||||
|
|
||||||
Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
|
Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||||
This program and the accompanying materials
|
This program and the accompanying materials
|
||||||
are licensed and made available under the terms and conditions of the BSD License
|
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
|
which accompanies this distribution. The full text of the license may be found at
|
||||||
|
@ -24,6 +24,7 @@
|
||||||
#include <Library/MemoryAllocationLib.h>
|
#include <Library/MemoryAllocationLib.h>
|
||||||
#include <Library/BaseMemoryLib.h>
|
#include <Library/BaseMemoryLib.h>
|
||||||
#include <Library/UefiBootServicesTableLib.h>
|
#include <Library/UefiBootServicesTableLib.h>
|
||||||
|
#include <Library/PcdLib.h>
|
||||||
|
|
||||||
EFI_DEVICE_PATH_UTILITIES_PROTOCOL *mDevicePathUtilities = NULL;
|
EFI_DEVICE_PATH_UTILITIES_PROTOCOL *mDevicePathUtilities = NULL;
|
||||||
|
|
||||||
|
@ -71,6 +72,61 @@ DevicePathLibConstructor (
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
Determine whether a given device path is valid.
|
||||||
|
If DevicePath is NULL, then ASSERT().
|
||||||
|
|
||||||
|
@param DevicePath A pointer to a device path data structure.
|
||||||
|
@param MaxSize The maximum size of the device path data structure.
|
||||||
|
|
||||||
|
@retval TRUE DevicePath is valid.
|
||||||
|
@retval FALSE The length of any node node in the DevicePath is less
|
||||||
|
than sizeof (EFI_DEVICE_PATH_PROTOCOL).
|
||||||
|
@retval FALSE If MaxSize is not zero, the size of the DevicePath
|
||||||
|
exceeds MaxSize.
|
||||||
|
@retval FALSE If PcdMaximumDevicePathNodeCount is not zero, the node
|
||||||
|
count of the DevicePath exceeds PcdMaximumDevicePathNodeCount.
|
||||||
|
**/
|
||||||
|
BOOLEAN
|
||||||
|
EFIAPI
|
||||||
|
IsDevicePathValid (
|
||||||
|
IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||||
|
IN UINTN MaxSize
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UINTN Count;
|
||||||
|
UINTN Size;
|
||||||
|
UINTN NodeLength;
|
||||||
|
|
||||||
|
ASSERT (DevicePath != NULL);
|
||||||
|
|
||||||
|
for (Count = 0, Size = 0; !IsDevicePathEnd (DevicePath); DevicePath = NextDevicePathNode (DevicePath)) {
|
||||||
|
NodeLength = DevicePathNodeLength (DevicePath);
|
||||||
|
if (NodeLength < sizeof (EFI_DEVICE_PATH_PROTOCOL)) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (MaxSize > 0) {
|
||||||
|
Size += NodeLength;
|
||||||
|
if (Size + END_DEVICE_PATH_LENGTH > MaxSize) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (PcdGet32 (PcdMaximumDevicePathNodeCount) > 0) {
|
||||||
|
Count++;
|
||||||
|
if (Count >= PcdGet32 (PcdMaximumDevicePathNodeCount)) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Only return TRUE when the End Device Path node is valid.
|
||||||
|
//
|
||||||
|
return (BOOLEAN) (DevicePathNodeLength (DevicePath) == END_DEVICE_PATH_LENGTH);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Returns the Type field of a device path node.
|
Returns the Type field of a device path node.
|
||||||
|
|
||||||
|
@ -136,8 +192,12 @@ DevicePathNodeLength (
|
||||||
IN CONST VOID *Node
|
IN CONST VOID *Node
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
UINTN Length;
|
||||||
|
|
||||||
ASSERT (Node != NULL);
|
ASSERT (Node != NULL);
|
||||||
return ReadUnaligned16 ((UINT16 *)&((EFI_DEVICE_PATH_PROTOCOL *)(Node))->Length[0]);
|
Length = ReadUnaligned16 ((UINT16 *)&((EFI_DEVICE_PATH_PROTOCOL *)(Node))->Length[0]);
|
||||||
|
ASSERT (Length >= sizeof (EFI_DEVICE_PATH_PROTOCOL));
|
||||||
|
return Length;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -256,7 +316,8 @@ IsDevicePathEndInstance (
|
||||||
be used to set the contents of the Length field.
|
be used to set the contents of the Length field.
|
||||||
|
|
||||||
If Node is NULL, then ASSERT().
|
If Node is NULL, then ASSERT().
|
||||||
If NodeLength >= 0x10000, then ASSERT().
|
If NodeLength >= SIZE_64KB, then ASSERT().
|
||||||
|
If NodeLength < sizeof (EFI_DEVICE_PATH_PROTOCOL), then ASSERT().
|
||||||
|
|
||||||
@param Node A pointer to a device path node data structure.
|
@param Node A pointer to a device path node data structure.
|
||||||
@param Length The length, in bytes, of the device path node.
|
@param Length The length, in bytes, of the device path node.
|
||||||
|
@ -272,7 +333,7 @@ SetDevicePathNodeLength (
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
ASSERT (Node != NULL);
|
ASSERT (Node != NULL);
|
||||||
ASSERT (Length < 0x10000);
|
ASSERT ((Length >= sizeof (EFI_DEVICE_PATH_PROTOCOL)) && (Length < SIZE_64KB));
|
||||||
return WriteUnaligned16 ((UINT16 *)&((EFI_DEVICE_PATH_PROTOCOL *)(Node))->Length[0], (UINT16)(Length));
|
return WriteUnaligned16 ((UINT16 *)&((EFI_DEVICE_PATH_PROTOCOL *)(Node))->Length[0], (UINT16)(Length));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -305,13 +366,14 @@ SetDevicePathEndNode (
|
||||||
/**
|
/**
|
||||||
Returns the size of a device path in bytes.
|
Returns the size of a device path in bytes.
|
||||||
|
|
||||||
This function returns the size, in bytes, of the device path data structure specified by
|
This function returns the size, in bytes, of the device path data structure
|
||||||
DevicePath including the end of device path node. If DevicePath is NULL, then 0 is returned.
|
specified by DevicePath including the end of device path node.
|
||||||
|
If DevicePath is NULL or invalid, then 0 is returned.
|
||||||
|
|
||||||
@param DevicePath A pointer to a device path data structure.
|
@param DevicePath A pointer to a device path data structure.
|
||||||
|
|
||||||
@retval 0 If DevicePath is NULL.
|
@retval 0 If DevicePath is NULL or invalid.
|
||||||
@retval Others The size of a device path in bytes.
|
@retval Others The size of a device path in bytes.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
UINTN
|
UINTN
|
||||||
|
@ -336,7 +398,7 @@ GetDevicePathSize (
|
||||||
|
|
||||||
@param DevicePath A pointer to a device path data structure.
|
@param DevicePath A pointer to a device path data structure.
|
||||||
|
|
||||||
@retval NULL If DevicePath is NULL.
|
@retval NULL If DevicePath is NULL or invalid.
|
||||||
@retval Others A pointer to the duplicated device path.
|
@retval Others A pointer to the duplicated device path.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
|
@ -367,6 +429,7 @@ DuplicateDevicePath (
|
||||||
@param SecondDevicePath A pointer to a device path data structure.
|
@param SecondDevicePath A pointer to a device path data structure.
|
||||||
|
|
||||||
@retval NULL If there is not enough memory for the newly allocated buffer.
|
@retval NULL If there is not enough memory for the newly allocated buffer.
|
||||||
|
@retval NULL If FirstDevicePath or SecondDevicePath is invalid.
|
||||||
@retval Others A pointer to the new device path if success.
|
@retval Others A pointer to the new device path if success.
|
||||||
Or a copy an end-of-device-path if both FirstDevicePath and
|
Or a copy an end-of-device-path if both FirstDevicePath and
|
||||||
SecondDevicePath are NULL.
|
SecondDevicePath are NULL.
|
||||||
|
@ -431,6 +494,7 @@ AppendDevicePathNode (
|
||||||
path instance and a new end-of-device-path-instance node is inserted between.
|
path instance and a new end-of-device-path-instance node is inserted between.
|
||||||
If DevicePath is NULL, then a copy if DevicePathInstance is returned.
|
If DevicePath is NULL, then a copy if DevicePathInstance is returned.
|
||||||
If DevicePathInstance is NULL, then NULL is returned.
|
If DevicePathInstance is NULL, then NULL is returned.
|
||||||
|
If DevicePath or DevicePathInstance is invalid, then NULL is returned.
|
||||||
If there is not enough memory to allocate space for the new device path, then
|
If there is not enough memory to allocate space for the new device path, then
|
||||||
NULL is returned.
|
NULL is returned.
|
||||||
The memory is allocated from EFI boot services memory. It is the responsibility
|
The memory is allocated from EFI boot services memory. It is the responsibility
|
||||||
|
@ -524,15 +588,16 @@ CreateDeviceNode (
|
||||||
/**
|
/**
|
||||||
Determines if a device path is single or multi-instance.
|
Determines if a device path is single or multi-instance.
|
||||||
|
|
||||||
This function returns TRUE if the device path specified by DevicePath is
|
This function returns TRUE if the device path specified by DevicePath is
|
||||||
multi-instance.
|
multi-instance.
|
||||||
Otherwise, FALSE is returned. If DevicePath is NULL, then FALSE is returned.
|
Otherwise, FALSE is returned.
|
||||||
|
If DevicePath is NULL or invalid, then FALSE is returned.
|
||||||
|
|
||||||
@param DevicePath A pointer to a device path data structure.
|
@param DevicePath A pointer to a device path data structure.
|
||||||
|
|
||||||
@retval TRUE DevicePath is multi-instance.
|
@retval TRUE DevicePath is multi-instance.
|
||||||
@retval FALSE DevicePath is not multi-instance or DevicePath
|
@retval FALSE DevicePath is not multi-instance, or DevicePath
|
||||||
is NULL.
|
is NULL or invalid.
|
||||||
|
|
||||||
**/
|
**/
|
||||||
BOOLEAN
|
BOOLEAN
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
# Device Path Library that layers on top of the UEFI 2.0 Device Path Protocol.
|
# Device Path Library that layers on top of the UEFI 2.0 Device Path Protocol.
|
||||||
# This library is not available for EFI 1.10 modules.
|
# This library is not available for EFI 1.10 modules.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2007 - 2011, Intel Corporation. All rights reserved.<BR>
|
# Copyright (c) 2007 - 2012, Intel Corporation. All rights reserved.<BR>
|
||||||
#
|
#
|
||||||
# This program and the accompanying materials
|
# This program and the accompanying materials
|
||||||
# are licensed and made available under the terms and conditions of the BSD License
|
# are licensed and made available under the terms and conditions of the BSD License
|
||||||
|
@ -44,11 +44,14 @@
|
||||||
MemoryAllocationLib
|
MemoryAllocationLib
|
||||||
BaseLib
|
BaseLib
|
||||||
DebugLib
|
DebugLib
|
||||||
|
PcdLib
|
||||||
|
|
||||||
[Protocols]
|
[Protocols]
|
||||||
gEfiDevicePathProtocolGuid ## CONSUMES
|
gEfiDevicePathProtocolGuid ## CONSUMES
|
||||||
gEfiDevicePathUtilitiesProtocolGuid ## CONSUMES
|
gEfiDevicePathUtilitiesProtocolGuid ## CONSUMES
|
||||||
|
|
||||||
|
[Pcd]
|
||||||
|
gEfiMdePkgTokenSpaceGuid.PcdMaximumDevicePathNodeCount
|
||||||
|
|
||||||
[Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, Depex.common.DXE_SAL_DRIVER, Depex.common.DXE_SMM_DRIVER]
|
[Depex.common.DXE_DRIVER, Depex.common.DXE_RUNTIME_DRIVER, Depex.common.DXE_SAL_DRIVER, Depex.common.DXE_SMM_DRIVER]
|
||||||
gEfiDevicePathUtilitiesProtocolGuid
|
gEfiDevicePathUtilitiesProtocolGuid
|
||||||
|
|
|
@ -1287,6 +1287,9 @@
|
||||||
## Indicates the maximum node number of linked list
|
## Indicates the maximum node number of linked list
|
||||||
gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength|1000000|UINT32|0x00000003
|
gEfiMdePkgTokenSpaceGuid.PcdMaximumLinkedListLength|1000000|UINT32|0x00000003
|
||||||
|
|
||||||
|
## Indicates the maximum node number of device path
|
||||||
|
gEfiMdePkgTokenSpaceGuid.PcdMaximumDevicePathNodeCount|0|UINT32|0x00000029
|
||||||
|
|
||||||
## Indicates the timeout tick of holding spin lock
|
## Indicates the timeout tick of holding spin lock
|
||||||
gEfiMdePkgTokenSpaceGuid.PcdSpinLockTimeout|10000000|UINT32|0x00000004
|
gEfiMdePkgTokenSpaceGuid.PcdSpinLockTimeout|10000000|UINT32|0x00000004
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue