/** @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, wchar_t **MapPath); | |
/** 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); | |
/** | |
Parses a normalized wide character path and returns a pointer to the entry | |
following the last \. If a \ is not found in the path the return value will | |
be the same as the input value. All error conditions return NULL. | |
The behavior when passing in a path that has not been normalized is undefined. | |
@param Path - A pointer to a wide character string containing a path to a | |
directory or a file. | |
@return Pointer to the file name or terminal directory. NULL if an error is | |
detected. | |
**/ | |
wchar_t * | |
EFIAPI | |
GetFileNameFromPath( | |
const wchar_t *Path | |
); | |
__END_DECLS | |
#endif /* __DEV_UTILITY_H__ */ |