Add device abstraction code for the UEFI Console and UEFI Shell-based file systems.
Make argv use narrow characters instead of wide characters. Add setenv functionality. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11907 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
197
StdLibPrivateInternalFiles/Include/Device/Device.h
Normal file
197
StdLibPrivateInternalFiles/Include/Device/Device.h
Normal file
@@ -0,0 +1,197 @@
|
||||
/** @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__ */
|
Reference in New Issue
Block a user