summaryrefslogtreecommitdiff
path: root/EADK_0_A3/StdLibPrivateInternalFiles/Include/Device/Device.h
diff options
context:
space:
mode:
Diffstat (limited to 'EADK_0_A3/StdLibPrivateInternalFiles/Include/Device/Device.h')
-rw-r--r--EADK_0_A3/StdLibPrivateInternalFiles/Include/Device/Device.h197
1 files changed, 197 insertions, 0 deletions
diff --git a/EADK_0_A3/StdLibPrivateInternalFiles/Include/Device/Device.h b/EADK_0_A3/StdLibPrivateInternalFiles/Include/Device/Device.h
new file mode 100644
index 0000000..68eade0
--- /dev/null
+++ b/EADK_0_A3/StdLibPrivateInternalFiles/Include/Device/Device.h
@@ -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__ */