mirror of https://github.com/acidanthera/audk.git
198 lines
8.1 KiB
C
198 lines
8.1 KiB
C
/** @file
|
|
Device Abstraction Utility Routines
|
|
|
|
Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
|
|
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.
|
|
|
|
Depends upon: <kfile.h>
|
|
**/
|
|
#ifndef __DEV_UTILITY_H__
|
|
#define __DEV_UTILITY_H__
|
|
|
|
#define CON_COOKIE 0x62416F49 ///< 'IoAb'
|
|
|
|
typedef enum {
|
|
PathAbsolute = 0,
|
|
PathRelative,
|
|
PathMapping,
|
|
PathError
|
|
} PATH_CLASS;
|
|
|
|
typedef struct _Device_Node {
|
|
LIST_ENTRY DevList; ///< List of registered device abstractions
|
|
const CHAR16 *DevName;
|
|
const GUID *DevProto;
|
|
void *InstanceList; ///< Array of instances for this device
|
|
FO_OPEN OpenFunc;
|
|
UINT32 InstanceSize; ///< Size of each instance in the InstanceList
|
|
UINT32 NumInstances; ///< Number of instances in InstanceList
|
|
UINT32 OpModes; ///< Supported modes of operation
|
|
} DeviceNode;
|
|
|
|
__BEGIN_DECLS
|
|
|
|
extern LIST_ENTRY daDeviceList; ///< List of registered devices.
|
|
extern DeviceNode *daDefaultDevice; ///< Device to use if nothing else found
|
|
extern DeviceNode *daRootDevice; ///< Device containing the root file system
|
|
extern DeviceNode *daCurrentDevice; ///< Device currently being accessed
|
|
|
|
/** Add a new device to the device list.
|
|
|
|
@param DevName Name of the device to add.
|
|
@param DevProto Pointer to the GUID identifying the protocol associated with this device.
|
|
If DevProto is NULL, startup code will not try to find instances
|
|
of this device.
|
|
@param OpenFunc Pointer to the device's Open function.
|
|
@param InstanceList Optional pointer to the device's initialized instance list.
|
|
If InstanceList is NULL, the application startup code will
|
|
scan for instances of the protocol identified by DevProto and
|
|
populate the InstanceList in the order those protocols are found.
|
|
@param NumInstance Number of instances in InstanceList.
|
|
@param Modes Bit-mapped flags indicating operations (R, W, RW, ...) permitted to this device.
|
|
|
|
**/
|
|
DeviceNode * EFIAPI __DevRegister( const CHAR16 *DevName, GUID *DevProto, FO_OPEN OpenFunc,
|
|
void *InstanceList, int NumInstance, UINT32 InstanceSize, UINT32 Modes);
|
|
|
|
/** Find a DeviceNode matching DevName or DevProto, or both.
|
|
|
|
If DevName is NULL, then the device name is not used in the search.
|
|
If DevProto is NULL, then the protocol GUID is not used in the search.
|
|
If both are NULL, then INVALID_PARAMETER is returned.
|
|
If both DevName and DevProto are specified, then both must match.
|
|
If both are specified but only one matches, then DEVICE_ERROR is returned.
|
|
|
|
@param DevName Name of the Device Abstraction to find.
|
|
@param DevProto GUID of the Protocol associated with the Device Abstraction.
|
|
@param Node Pointer to the pointer to receive the found Device Node's address.
|
|
|
|
@retval RETURN_SUCCESS The desired Device Node was found.
|
|
@retval RETURN_INVALID_PARAMETER Both DevName and DevProto are NULL or Node is NULL.
|
|
@retval RETURN_DEVICE_ERROR One, but not both, of DevNode and DevProto matched.
|
|
**/
|
|
EFI_STATUS EFIAPI __DevSearch( CHAR16 *DevName, GUID *DevProto, DeviceNode **Node);
|
|
|
|
/** Identify the type of path pointed to by Path.
|
|
|
|
Paths are classified based upon their initial character sequences.
|
|
^\\ Absolute Path
|
|
^\. Relative Path
|
|
^[^:\\]: Mapping Path
|
|
.* Relative Path
|
|
|
|
Mapping paths are broken into two parts at the ':'. The part to the left of the ':'
|
|
is the Map Name, pointed to by Path, and the part to the right of the ':' is pointed
|
|
to by NewPath.
|
|
|
|
If Path was not a Mapping Path, then NewPath is set to Path.
|
|
|
|
@param[in] Path Pointer to the path to be classified.
|
|
@param[out] NewPath Pointer to the path portion of a mapping path.
|
|
|
|
@retval PathAbsolute Path is an absolute path. NewPath points to the first '\'.
|
|
@retval PathRelative Path is a relative path. NewPath = Path.
|
|
@retval PathMapping Path is a mapping path. NewPath points to the ':'.
|
|
@retval PathError Path is NULL.
|
|
**/
|
|
PATH_CLASS EFIAPI ClassifyPath(IN wchar_t *Path, OUT wchar_t **NewPath, int * const Length);
|
|
|
|
/* Normalize a narrow-character path and produce a wide-character path
|
|
that has forward slashes replaced with backslashes.
|
|
Backslashes are directory separators in UEFI File Paths.
|
|
|
|
It is the caller's responsibility to eventually free() the returned buffer.
|
|
|
|
@param[in] path A pointer to the narrow-character path to be normalized.
|
|
|
|
@return A pointer to a buffer containing the normalized, wide-character, path.
|
|
*/
|
|
wchar_t *
|
|
NormalizePath( const char *path);
|
|
|
|
/** Process a MBCS path returning the final absolute path and the target device.
|
|
|
|
@param path
|
|
@param FullPath
|
|
@param DevNode
|
|
|
|
@retval RETURN_SUCCESS
|
|
@retval RETURN_INVALID_PARAMETER
|
|
@retval RETURN_NOT_FOUND
|
|
**/
|
|
RETURN_STATUS
|
|
EFIAPI
|
|
ParsePath( const char *path, wchar_t **FullPath, DeviceNode **DevNode, int *Which);
|
|
|
|
/** Process a wide character string representing a Mapping Path and extract the instance number.
|
|
|
|
The instance number is the sequence of decimal digits immediately to the left
|
|
of the ":" in the Map Name portion of a Mapping Path.
|
|
|
|
This function is called with a pointer to beginning of the Map Name.
|
|
Thus Path[Length] must be a ':' and Path[Length - 1] must be a decimal digit.
|
|
If either of these are not true, an instance value of 0 is returned.
|
|
|
|
If Path is NULL, an instance value of 0 is returned.
|
|
|
|
@param[in] Path Points to the beginning of a Mapping Path
|
|
@param[in] Length Number of valid characters to the left of the ':'
|
|
|
|
@return Returns either 0 or the value of the contiguous digits to the left of the ':'.
|
|
**/
|
|
int
|
|
EFIAPI
|
|
PathInstance( const wchar_t *Path, int length);
|
|
|
|
/** Transform a relative path into an absolute path.
|
|
|
|
If Path is NULL, return NULL.
|
|
Otherwise, pre-pend the CWD to Path then process the resulting path to:
|
|
- Replace "/./" with "/"
|
|
- Replace "/<dirname>/../" with "/"
|
|
- Do not allow one to back up past the root, "/"
|
|
|
|
Also sets the Current Working Device to the Root Device.
|
|
|
|
Path must be a previously allocated buffer. PathAdjust will
|
|
allocate a new buffer to hold the results of the transformation
|
|
then free Path. A pointer to the newly allocated buffer is returned.
|
|
|
|
@param[in] Path A pointer to the path to be transformed. This buffer
|
|
will always be freed.
|
|
|
|
@return A pointer to a buffer containing the transformed path.
|
|
**/
|
|
wchar_t *
|
|
EFIAPI
|
|
PathAdjust(wchar_t *Path);
|
|
|
|
/** Replace the leading portion of Path with any aliases.
|
|
|
|
Aliases are read from /etc/fstab. If there is an associated device, the
|
|
Current Working Device is set to that device.
|
|
|
|
Path must be a previously allocated buffer. PathAlias will
|
|
allocate a new buffer to hold the results of the transformation
|
|
then free Path. A pointer to the newly allocated buffer is returned.
|
|
|
|
@param[in] Path A pointer to the original, unaliased, path. This
|
|
buffer is always freed.
|
|
@param[out] Node Filled in with a pointer to the Device Node describing
|
|
the device abstraction associated with this path.
|
|
|
|
@return A pointer to a buffer containing the aliased path.
|
|
**/
|
|
wchar_t *
|
|
EFIAPI
|
|
PathAlias(wchar_t *Path, DeviceNode **Node);
|
|
|
|
__END_DECLS
|
|
|
|
#endif /* __DEV_UTILITY_H__ */
|