Home | History | Annotate | Download | only in Device
      1 /** @file
      2   Device Abstraction Utility Routines
      3 
      4   Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
      5   This program and the accompanying materials are licensed and made available
      6   under the terms and conditions of the BSD License which accompanies this
      7   distribution.  The full text of the license may be found at
      8   http://opensource.org/licenses/bsd-license.php.
      9 
     10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13   Depends upon: <kfile.h>
     14 **/
     15 #ifndef __DEV_UTILITY_H__
     16 #define __DEV_UTILITY_H__
     17 
     18 #define CON_COOKIE    0x62416F49    ///< 'IoAb'
     19 
     20 typedef enum {
     21   PathAbsolute = 0,
     22   PathRelative,
     23   PathMapping,
     24   PathError
     25 } PATH_CLASS;
     26 
     27 typedef struct _Device_Node {
     28   LIST_ENTRY        DevList;        ///< List of registered device abstractions
     29   const CHAR16     *DevName;
     30   const GUID       *DevProto;
     31   void             *InstanceList;   ///< Array of instances for this device
     32   FO_OPEN           OpenFunc;
     33   UINT32            InstanceSize;   ///< Size of each instance in the InstanceList
     34   UINT32            NumInstances;   ///< Number of instances in InstanceList
     35   UINT32            OpModes;        ///< Supported modes of operation
     36 } DeviceNode;
     37 
     38 __BEGIN_DECLS
     39 
     40 extern LIST_ENTRY       daDeviceList;     ///< List of registered devices.
     41 extern DeviceNode      *daDefaultDevice;  ///< Device to use if nothing else found
     42 extern DeviceNode      *daRootDevice;     ///< Device containing the root file system
     43 extern DeviceNode      *daCurrentDevice;  ///< Device currently being accessed
     44 
     45 /** Add a new device to the device list.
     46 
     47     @param  DevName       Name of the device to add.
     48     @param  DevProto      Pointer to the GUID identifying the protocol associated with this device.
     49                           If DevProto is NULL, startup code will not try to find instances
     50                           of this device.
     51     @param  OpenFunc      Pointer to the device's Open function.
     52     @param  InstanceList  Optional pointer to the device's initialized instance list.
     53                           If InstanceList is NULL, the application startup code will
     54                           scan for instances of the protocol identified by DevProto and
     55                           populate the InstanceList in the order those protocols are found.
     56     @param  NumInstance   Number of instances in InstanceList.
     57     @param  Modes         Bit-mapped flags indicating operations (R, W, RW, ...) permitted to this device.
     58 
     59 **/
     60 DeviceNode * EFIAPI __DevRegister( const CHAR16 *DevName, GUID *DevProto, FO_OPEN OpenFunc,
     61                                    void *InstanceList, int NumInstance, UINT32 InstanceSize, UINT32 Modes);
     62 
     63 /** Find a DeviceNode matching DevName or DevProto, or both.
     64 
     65     If DevName is NULL, then the device name is not used in the search.
     66     If DevProto is NULL, then the protocol GUID is not used in the search.
     67     If both are NULL, then INVALID_PARAMETER is returned.
     68     If both DevName and DevProto are specified, then both must match.
     69     If both are specified but only one matches, then DEVICE_ERROR is returned.
     70 
     71     @param  DevName     Name of the Device Abstraction to find.
     72     @param  DevProto    GUID of the Protocol associated with the Device Abstraction.
     73     @param  Node        Pointer to the pointer to receive the found Device Node's address.
     74 
     75     @retval RETURN_SUCCESS              The desired Device Node was found.
     76     @retval RETURN_INVALID_PARAMETER    Both DevName and DevProto are NULL or Node is NULL.
     77     @retval RETURN_DEVICE_ERROR         One, but not both, of DevNode and DevProto matched.
     78 **/
     79 EFI_STATUS EFIAPI __DevSearch( CHAR16 *DevName, GUID *DevProto, DeviceNode **Node);
     80 
     81 /** Identify the type of path pointed to by Path.
     82 
     83     Paths are classified based upon their initial character sequences.
     84       ^\\       Absolute Path
     85       ^\.       Relative Path
     86       ^[^:\\]:  Mapping Path
     87       .*        Relative Path
     88 
     89     Mapping paths are broken into two parts at the ':'.  The part to the left of the ':'
     90     is the Map Name, pointed to by Path, and the part to the right of the ':' is pointed
     91     to by NewPath.
     92 
     93     If Path was not a Mapping Path, then NewPath is set to Path.
     94 
     95     @param[in]    Path      Pointer to the path to be classified.
     96     @param[out]   NewPath   Pointer to the path portion of a mapping path.
     97 
     98     @retval PathAbsolute  Path is an absolute path. NewPath points to the first '\'.
     99     @retval PathRelative  Path is a relative path. NewPath = Path.
    100     @retval PathMapping   Path is a mapping path.  NewPath points to the ':'.
    101     @retval PathError     Path is NULL.
    102 **/
    103 PATH_CLASS EFIAPI ClassifyPath(IN wchar_t *Path, OUT wchar_t **NewPath, int * const Length);
    104 
    105 /*  Normalize a narrow-character path and produce a wide-character path
    106     that has forward slashes replaced with backslashes.
    107     Backslashes are directory separators in UEFI File Paths.
    108 
    109     It is the caller's responsibility to eventually free() the returned buffer.
    110 
    111     @param[in]    path    A pointer to the narrow-character path to be normalized.
    112 
    113     @return     A pointer to a buffer containing the normalized, wide-character, path.
    114 */
    115 wchar_t *
    116 NormalizePath( const char *path);
    117 
    118 /** Process a MBCS path returning the final absolute path and the target device.
    119 
    120     @param path
    121     @param FullPath
    122     @param DevNode
    123 
    124     @retval RETURN_SUCCESS
    125     @retval RETURN_INVALID_PARAMETER
    126     @retval RETURN_NOT_FOUND
    127 **/
    128 RETURN_STATUS
    129 EFIAPI
    130 ParsePath( const char *path, wchar_t **FullPath, DeviceNode **DevNode, int *Which, wchar_t **MapPath);
    131 
    132 /** Process a wide character string representing a Mapping Path and extract the instance number.
    133 
    134     The instance number is the sequence of decimal digits immediately to the left
    135     of the ":" in the Map Name portion of a Mapping Path.
    136 
    137     This function is called with a pointer to beginning of the Map Name.
    138     Thus Path[Length] must be a ':' and Path[Length - 1] must be a decimal digit.
    139     If either of these are not true, an instance value of 0 is returned.
    140 
    141     If Path is NULL, an instance value of 0 is returned.
    142 
    143     @param[in]  Path    Points to the beginning of a Mapping Path
    144     @param[in]  Length  Number of valid characters to the left of the ':'
    145 
    146     @return   Returns either 0 or the value of the contiguous digits to the left of the ':'.
    147 **/
    148 int
    149 EFIAPI
    150 PathInstance( const wchar_t *Path, int length);
    151 
    152 /** Transform a relative path into an absolute path.
    153 
    154     If Path is NULL, return NULL.
    155     Otherwise, pre-pend the CWD to Path then process the resulting path to:
    156       - Replace "/./" with "/"
    157       - Replace "/<dirname>/../" with "/"
    158       - Do not allow one to back up past the root, "/"
    159 
    160     Also sets the Current Working Device to the Root Device.
    161 
    162     Path must be a previously allocated buffer.  PathAdjust will
    163     allocate a new buffer to hold the results of the transformation
    164     then free Path.  A pointer to the newly allocated buffer is returned.
    165 
    166     @param[in]  Path    A pointer to the path to be transformed.  This buffer
    167                         will always be freed.
    168 
    169     @return   A pointer to a buffer containing the transformed path.
    170 **/
    171 wchar_t *
    172 EFIAPI
    173 PathAdjust(wchar_t *Path);
    174 
    175 /** Replace the leading portion of Path with any aliases.
    176 
    177     Aliases are read from /etc/fstab.  If there is an associated device, the
    178     Current Working Device is set to that device.
    179 
    180     Path must be a previously allocated buffer.  PathAlias will
    181     allocate a new buffer to hold the results of the transformation
    182     then free Path.  A pointer to the newly allocated buffer is returned.
    183 
    184     @param[in]    Path    A pointer to the original, unaliased, path.  This
    185                           buffer is always freed.
    186     @param[out]   Node    Filled in with a pointer to the Device Node describing
    187                           the device abstraction associated with this path.
    188 
    189     @return     A pointer to a buffer containing the aliased path.
    190 **/
    191 wchar_t *
    192 EFIAPI
    193 PathAlias(wchar_t *Path, DeviceNode **Node);
    194 
    195 /**
    196   Parses a normalized wide character path and returns a pointer to the entry
    197   following the last \.  If a \ is not found in the path the return value will
    198   be the same as the input value.  All error conditions return NULL.
    199 
    200   The behavior when passing in a path that has not been normalized is undefined.
    201 
    202   @param  Path - A pointer to a wide character string containing a path to a
    203                  directory or a file.
    204 
    205   @return Pointer to the file name or terminal directory.  NULL if an error is
    206           detected.
    207 **/
    208 wchar_t *
    209 EFIAPI
    210 GetFileNameFromPath(
    211   const wchar_t   *Path
    212   );
    213 
    214 __END_DECLS
    215 
    216 #endif  /* __DEV_UTILITY_H__ */
    217