1. Add the fix for the following Bugs:
authorcwu11 <cwu11@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 3 Nov 2006 02:47:43 +0000 (02:47 +0000)
committercwu11 <cwu11@6f19259b-4bc3-4df7-8a09-765794883524>
Fri, 3 Nov 2006 02:47:43 +0000 (02:47 +0000)
i) BMM_FAKE_NV_DATA definition inconsistent in bm.vfr and BootMain.h
        (EdkNt32Pkg\Dxe\PlatformBdsDxe\Generic\BootMaint\BootMain.h)
ii) Change some files’ EOL(end of line) format to DOS. Some file use even mixed style EOL.
   (EdkModulePkg\Universal\DevicePath\Dxe\DevicePath.c, DevicepathFromText.c, DevicePathUtilities.c;
EdkModulePkg\Universal\Disk\DiskIo\Dxe\diskIo.c; MdePkg\Library\UefiLib\UefiNotTiano.c)
iii)    Change some illegal characters in many files, the problem is mainly connected with people using Chinese Input method to input symbols such as ' " - ?, etc. Multiple files are influenced.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1890 6f19259b-4bc3-4df7-8a09-765794883524

116 files changed:
EdkModulePkg/Core/Dxe/DxeMain.h
EdkModulePkg/Core/Dxe/Hand/handle.c
EdkModulePkg/Core/Dxe/Image/Image.c
EdkModulePkg/Core/Pei/Memory/MemoryServices.c
EdkModulePkg/Include/Library/OemHookStatusCodeLib.h
EdkModulePkg/Library/EdkDxeDebugLibReportStatusCode/DebugLib.c
EdkModulePkg/Library/EdkOemHookStatusCodeLibNull/OemHookStatusCodeLibNull.c
EdkModulePkg/Library/EdkUefiDebugLibConOut/DebugLib.c
EdkModulePkg/Library/EdkUefiDebugLibStdErr/DebugLib.c
EdkModulePkg/Library/EdkUefiRuntimeLib/Common/RuntimeService.c
EdkModulePkg/Library/EdkUefiRuntimeLib/Ipf/RuntimeService.c
EdkModulePkg/Universal/DevicePath/Dxe/DevicePath.c
EdkModulePkg/Universal/DevicePath/Dxe/DevicePathFromText.c
EdkModulePkg/Universal/DevicePath/Dxe/DevicePathUtilities.c
EdkModulePkg/Universal/Disk/DiskIo/Dxe/diskio.c
EdkModulePkg/Universal/StatusCode/Dxe/Common/DxeStatusCodeCommon.c
EdkModulePkg/Universal/StatusCode/Dxe/DataHubStatusCodeWorker.c
EdkModulePkg/Universal/StatusCode/Dxe/DxeStatusCode.h
EdkModulePkg/Universal/StatusCode/Dxe/Ipf/DxeStatusCodeIpf.c
EdkModulePkg/Universal/StatusCode/Dxe/RtMemoryStatusCodeWorker.c
EdkModulePkg/Universal/StatusCode/Dxe/SerialStatusCodeWorker.c
EdkModulePkg/Universal/StatusCode/Pei/MemoryStausCodeWorker.c
EdkModulePkg/Universal/StatusCode/Pei/PeiStatusCode.c
EdkModulePkg/Universal/StatusCode/Pei/PeiStatusCode.h
EdkModulePkg/Universal/StatusCode/Pei/SerialStatusCodeWorker.c
EdkModulePkg/Universal/UserInterface/HiiDataBase/Dxe/Forms.c
EdkNt32Pkg/Dxe/PlatformBds/Generic/BootMaint/BootMaint.h
EdkNt32Pkg/Library/Nt32OemHookStatusCodeLib/Nt32OemHookStatusCodeLib.c
MdePkg/Include/Library/BaseMemoryLib.h
MdePkg/Include/Library/MemoryAllocationLib.h
MdePkg/Include/Library/UefiDecompressLib.h
MdePkg/Include/Library/UefiLib.h
MdePkg/Include/Library/UefiRuntimeLib.h
MdePkg/Include/Peim/PeiCis.h
MdePkg/Include/Ppi/BlockIo.h
MdePkg/Include/Ppi/Pcd.h
MdePkg/Include/Ppi/ReadOnlyVariable.h
MdePkg/Include/Ppi/Security.h
MdePkg/Include/Protocol/Arp.h
MdePkg/Include/Protocol/Bis.h
MdePkg/Include/Protocol/DebugSupport.h
MdePkg/Include/Protocol/FormBrowser.h
MdePkg/Include/Protocol/FormCallback.h
MdePkg/Include/Protocol/Hash.h
MdePkg/Include/Protocol/Hii.h
MdePkg/Include/Protocol/IdeControllerInit.h
MdePkg/Include/Protocol/LegacyBiosPlatform.h
MdePkg/Include/Protocol/LegacyRegion.h
MdePkg/Include/Protocol/Mtftp4.h
MdePkg/Include/Protocol/Pcd.h
MdePkg/Include/Protocol/PciIo.h
MdePkg/Include/Protocol/PciPlatform.h
MdePkg/Include/Protocol/PciRootBridgeIo.h
MdePkg/Include/Protocol/PxeBaseCode.h
MdePkg/Include/Protocol/SmmSxDispatch.h
MdePkg/Include/Protocol/TapeIo.h
MdePkg/Include/Protocol/Tcp4.h
MdePkg/Include/Protocol/Usb2HostController.h
MdePkg/Include/Protocol/UsbHostController.h
MdePkg/Include/Protocol/UsbIo.h
MdePkg/Include/Uefi/UefiSpec.h
MdePkg/Library/BaseDebugLibNull/DebugLib.c
MdePkg/Library/BaseMemoryLib/MemLibGuid.c
MdePkg/Library/BaseMemoryLib/ScanMem16Wrapper.c
MdePkg/Library/BaseMemoryLib/ScanMem32Wrapper.c
MdePkg/Library/BaseMemoryLib/ScanMem64Wrapper.c
MdePkg/Library/BaseMemoryLib/ScanMem8Wrapper.c
MdePkg/Library/BaseMemoryLib/SetMemWrapper.c
MdePkg/Library/BaseMemoryLib/ZeroMemWrapper.c
MdePkg/Library/BaseMemoryLibMmx/MemLibGuid.c
MdePkg/Library/BaseMemoryLibMmx/ScanMem16Wrapper.c
MdePkg/Library/BaseMemoryLibMmx/ScanMem32Wrapper.c
MdePkg/Library/BaseMemoryLibMmx/ScanMem64Wrapper.c
MdePkg/Library/BaseMemoryLibMmx/ScanMem8Wrapper.c
MdePkg/Library/BaseMemoryLibMmx/SetMemWrapper.c
MdePkg/Library/BaseMemoryLibMmx/ZeroMemWrapper.c
MdePkg/Library/BaseMemoryLibRepStr/MemLibGuid.c
MdePkg/Library/BaseMemoryLibRepStr/ScanMem16Wrapper.c
MdePkg/Library/BaseMemoryLibRepStr/ScanMem32Wrapper.c
MdePkg/Library/BaseMemoryLibRepStr/ScanMem64Wrapper.c
MdePkg/Library/BaseMemoryLibRepStr/ScanMem8Wrapper.c
MdePkg/Library/BaseMemoryLibRepStr/SetMemWrapper.c
MdePkg/Library/BaseMemoryLibRepStr/ZeroMemWrapper.c
MdePkg/Library/BaseMemoryLibSse2/MemLibGuid.c
MdePkg/Library/BaseMemoryLibSse2/ScanMem16Wrapper.c
MdePkg/Library/BaseMemoryLibSse2/ScanMem32Wrapper.c
MdePkg/Library/BaseMemoryLibSse2/ScanMem64Wrapper.c
MdePkg/Library/BaseMemoryLibSse2/ScanMem8Wrapper.c
MdePkg/Library/BaseMemoryLibSse2/SetMemWrapper.c
MdePkg/Library/BaseMemoryLibSse2/ZeroMemWrapper.c
MdePkg/Library/BaseUefiDecompressLib/BaseUefiDecompressLib.c
MdePkg/Library/DxeCoreHobLib/HobLib.c
MdePkg/Library/DxeHobLib/HobLib.c
MdePkg/Library/DxeMemoryAllocationLib/MemoryAllocationLib.c
MdePkg/Library/DxeMemoryLib/MemLibGuid.c
MdePkg/Library/DxeMemoryLib/ScanMem16Wrapper.c
MdePkg/Library/DxeMemoryLib/ScanMem32Wrapper.c
MdePkg/Library/DxeMemoryLib/ScanMem64Wrapper.c
MdePkg/Library/DxeMemoryLib/ScanMem8Wrapper.c
MdePkg/Library/DxeMemoryLib/SetMemWrapper.c
MdePkg/Library/DxeMemoryLib/ZeroMemWrapper.c
MdePkg/Library/PeiDxeDebugLibReportStatusCode/DebugLib.c
MdePkg/Library/PeiHobLib/HobLib.c
MdePkg/Library/PeiMemoryAllocationLib/MemoryAllocationLib.c
MdePkg/Library/PeiMemoryLib/MemLibGuid.c
MdePkg/Library/PeiMemoryLib/ScanMem16Wrapper.c
MdePkg/Library/PeiMemoryLib/ScanMem32Wrapper.c
MdePkg/Library/PeiMemoryLib/ScanMem64Wrapper.c
MdePkg/Library/PeiMemoryLib/ScanMem8Wrapper.c
MdePkg/Library/PeiMemoryLib/SetMemWrapper.c
MdePkg/Library/PeiMemoryLib/ZeroMemWrapper.c
MdePkg/Library/UefiDebugLibConOut/DebugLib.c
MdePkg/Library/UefiDebugLibStdErr/DebugLib.c
MdePkg/Library/UefiLib/UefiLib.c
MdePkg/Library/UefiLib/UefiNotTiano.c
Tools/CCode/Source/Include/Protocol/Hii.h

index 9a9ba68..4ff23f3 100644 (file)
@@ -1669,7 +1669,7 @@ Arguments:
   ExitData        - Pointer to a pointer to a data buffer that includes a Null-terminated\r
                     Unicode string, optionally followed by additional binary data. The string\r
                     is a description that the caller may use to further indicate the reason for\r
-                    the image¡¯s exit.\r
+                    the image's exit.\r
 \r
 Returns:\r
 \r
@@ -1701,13 +1701,13 @@ Arguments:
 \r
   ImageHandle       - Handle that identifies the image. This parameter is passed to the image \r
                       on entry.\r
-  Status            - The image¡¯s exit code.\r
+  Status            - The image's exit code.\r
   ExitDataSize      - The size, in bytes, of ExitData. Ignored if ExitStatus is\r
                       EFI_SUCCESS.\r
   ExitData          - Pointer to a data buffer that includes a Null-terminated Unicode string,\r
                       optionally followed by additional binary data. The string is a \r
                       description that the caller may use to further indicate the reason for\r
-                      the image¡¯s exit.\r
+                      the image's exit.\r
 \r
 Returns:\r
 \r
@@ -1740,8 +1740,8 @@ Arguments:
 \r
   Type                - The type of event to create and its mode and attributes\r
   NotifyTpl           - The task priority level of event notifications\r
-  NotifyFunction      - Pointer to the event\92s notification function\r
-  NotifyContext       - Pointer to the notification function\92s context; corresponds to\r
+  NotifyFunction      - Pointer to the event's notification function\r
+  NotifyContext       - Pointer to the notification function's context; corresponds to\r
                         parameter "Context" in the notification function\r
   pEvent              - Pointer to the newly created event if the call succeeds; undefined otherwise\r
 \r
index 2edfdeb..f958bff 100644 (file)
@@ -1325,7 +1325,7 @@ Arguments:
 \r
   UserHandle       -  The handle for the protocol interface that was previously opened\r
                       with OpenProtocol(), and is now being closed.\r
-  Protocol         -  The published unique identifier of the protocol. It is the caller¡¯s\r
+  Protocol         -  The published unique identifier of the protocol. It is the caller's\r
                       responsibility to pass in a valid GUID.\r
   AgentHandle      -  The handle of the agent that is closing the protocol interface.\r
   ControllerHandle -  If the agent that opened a protocol is a driver that follows the\r
index d77f4c4..9b9720d 100644 (file)
@@ -905,7 +905,7 @@ Arguments:
   ExitData        - Pointer to a pointer to a data buffer that includes a Null-terminated\r
                     Unicode string, optionally followed by additional binary data. The string\r
                     is a description that the caller may use to further indicate the reason for\r
-                    the image¡¯s exit.\r
+                    the image's exit.\r
 \r
 Returns:\r
 \r
@@ -1209,13 +1209,13 @@ Arguments:
 \r
   ImageHandle       - Handle that identifies the image. This parameter is passed to the image\r
                       on entry.\r
-  Status            - The image¡¯s exit code.\r
+  Status            - The image's exit code.\r
   ExitDataSize      - The size, in bytes, of ExitData. Ignored if ExitStatus is\r
                       EFI_SUCCESS.\r
   ExitData          - Pointer to a data buffer that includes a Null-terminated Unicode string,\r
                       optionally followed by additional binary data. The string is a\r
                       description that the caller may use to further indicate the reason for\r
-                      the image¡¯s exit.\r
+                      the image's exit.\r
 \r
 Returns:\r
 \r
index d49b742..62cd59e 100644 (file)
@@ -302,7 +302,7 @@ Returns:
   EFI_HOB_MEMORY_POOL      *Hob;\r
 \r
  //\r
- // If some ¡°post-memory¡± PEIM wishes to allocate larger pool,\r
+ // If some "post-memory" PEIM wishes to allocate larger pool,\r
  // it should use AllocatePages service instead.\r
  //\r
  ASSERT (Size < 0x10000 - sizeof (EFI_HOB_MEMORY_POOL));\r
index 3de7551..533df31 100644 (file)
@@ -35,13 +35,13 @@ OemHookStatusCodeInitialize (
 /**\r
   Report status code to OEM device.\r
  \r
-  @param  CodeType      Indicates the type of status code being reported.  Type EFI_STATUS_CODE_TYPE is defined in "Related Definitions¡± below.\r
+  @param  CodeType      Indicates the type of status code being reported.  Type EFI_STATUS_CODE_TYPE is defined in "Related Definitions" below.\r
  \r
   @param  Value         Describes the current status of a hardware or software entity.  \r
                         This included information about the class and subclass that is used to classify the entity \r
                         as well as an operation.  For progress codes, the operation is the current activity. \r
                         For error codes, it is the exception.  For debug codes, it is not defined at this time. \r
-                        Type EFI_STATUS_CODE_VALUE is defined in ¡°Related Definitions¡± below.  \r
+                        Type EFI_STATUS_CODE_VALUE is defined in "Related Definitions" below.  \r
                         Specific values are discussed in the Intel? Platform Innovation Framework for EFI Status Code Specification.\r
  \r
   @param  Instance      The enumeration of a hardware or software entity within the system.  \r
index fed9ba4..482e12e 100644 (file)
@@ -225,7 +225,7 @@ DebugAssert (
 \r
   If Buffer is NULL, then ASSERT().\r
 \r
-  If Length is greater than (MAX_ADDRESS \96 Buffer + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS ? Buffer + 1), then ASSERT(). \r
 \r
   @param   Buffer  Pointer to the target buffer to fill with PcdDebugClearMemoryValue.\r
   @param   Length  Number of bytes in Buffer to fill with zeros PcdDebugClearMemoryValue. \r
index 98c98cc..7816931 100644 (file)
@@ -33,13 +33,13 @@ OemHookStatusCodeInitialize (
 /**\r
   Report status code to OEM device.\r
  \r
-  @param  CodeType      Indicates the type of status code being reported.  Type EFI_STATUS_CODE_TYPE is defined in "Related Definitions¡± below.\r
+  @param  CodeType      Indicates the type of status code being reported.  Type EFI_STATUS_CODE_TYPE is defined in "Related Definitions" below.\r
  \r
   @param  Value         Describes the current status of a hardware or software entity.  \r
                         This included information about the class and subclass that is used to classify the entity \r
                         as well as an operation.  For progress codes, the operation is the current activity. \r
                         For error codes, it is the exception.  For debug codes, it is not defined at this time. \r
-                        Type EFI_STATUS_CODE_VALUE is defined in ¡°Related Definitions¡± below.  \r
+                        Type EFI_STATUS_CODE_VALUE is defined in "Related Definitions" below.  \r
                         Specific values are discussed in the Intel? Platform Innovation Framework for EFI Status Code Specification.\r
  \r
   @param  Instance      The enumeration of a hardware or software entity within the system.  \r
index 5f5f2c5..43d904a 100644 (file)
@@ -189,7 +189,7 @@ DebugAssert (
 \r
   If Buffer is NULL, then ASSERT().\r
 \r
-  If Length is greater than (MAX_ADDRESS \96 Buffer + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS ? Buffer + 1), then ASSERT(). \r
 \r
   @param   Buffer  Pointer to the target buffer to fill with PcdDebugClearMemoryValue.\r
   @param   Length  Number of bytes in Buffer to fill with zeros PcdDebugClearMemoryValue. \r
index 2016701..9ba70df 100644 (file)
@@ -189,7 +189,7 @@ DebugAssert (
 \r
   If Buffer is NULL, then ASSERT().\r
 \r
-  If Length is greater than (MAX_ADDRESS \96 Buffer + 1), then ASSERT(). \r
+  If Length is greater than (MAX_ADDRESS ? Buffer + 1), then ASSERT(). \r
 \r
   @param   Buffer  Pointer to the target buffer to fill with PcdDebugClearMemoryValue.\r
   @param   Length  Number of bytes in Buffer to fill with zeros PcdDebugClearMemoryValue. \r
index 42a872c..013c3f1 100644 (file)
@@ -68,7 +68,7 @@ Routine Description:
 Arguments:\r
 \r
   Time          - A pointer to storage to receive a snapshot of the current time.\r
-  Capabilities  - An optional pointer to a buffer to receive the real time clock device¡¯s\r
+  Capabilities  - An optional pointer to a buffer to receive the real time clock device's\r
                   capabilities.\r
 \r
 Returns:\r
@@ -180,7 +180,7 @@ Routine Description:
 Arguments:\r
 \r
   VariableName  - A Null-terminated Unicode string that is the name of the\r
-                  vendor¡¯s variable.\r
+                  vendor's variable.\r
   VendorGuid    - A unique identifier for the vendor.\r
   Attributes    - If not NULL, a pointer to the memory location to return the\r
                   attributes bitmask for the variable.\r
@@ -248,7 +248,7 @@ Routine Description:
 Arguments:\r
 \r
   VariableName  - A Null-terminated Unicode string that is the name of the\r
-                  vendor¡¯s variable.\r
+                  vendor's variable.\r
   VendorGuid    - A unique identifier for the vendor.\r
   Attributes    - Attributes bitmask to set for the variable.\r
   DataSize      - The size in bytes of the Data buffer.\r
@@ -272,7 +272,7 @@ EfiGetNextHighMonotonicCount (
 \r
 Routine Description:\r
 \r
-  Returns the next high 32 bits of the platform¡¯s monotonic counter.\r
+  Returns the next high 32 bits of the platform's monotonic counter.\r
 \r
 Arguments:\r
 \r
index 13fa9d7..159a53f 100644 (file)
@@ -81,7 +81,7 @@ Routine Description:
 Arguments:\r
 \r
   Time          - A pointer to storage to receive a snapshot of the current time.\r
-  Capabilities  - An optional pointer to a buffer to receive the real time clock device¡¯s\r
+  Capabilities  - An optional pointer to a buffer to receive the real time clock device's\r
                   capabilities.\r
 \r
 Returns:\r
@@ -209,7 +209,7 @@ Routine Description:
 Arguments:\r
 \r
   VariableName  - A Null-terminated Unicode string that is the name of the\r
-                  vendor¡¯s variable.\r
+                  vendor's variable.\r
   VendorGuid    - A unique identifier for the vendor.\r
   Attributes    - If not NULL, a pointer to the memory location to return the\r
                   attributes bitmask for the variable.\r
@@ -305,7 +305,7 @@ Routine Description:
 Arguments:\r
 \r
   VariableName  - A Null-terminated Unicode string that is the name of the\r
-                  vendor¡¯s variable.\r
+                  vendor's variable.\r
   VendorGuid    - A unique identifier for the vendor.\r
   Attributes    - Attributes bitmask to set for the variable.\r
   DataSize      - The size in bytes of the Data buffer.\r
@@ -343,7 +343,7 @@ EfiGetNextHighMonotonicCount (
 \r
 Routine Description:\r
 \r
-  Returns the next high 32 bits of the platform¡¯s monotonic counter.\r
+  Returns the next high 32 bits of the platform's monotonic counter.\r
 \r
 Arguments:\r
 \r
index 6117a32..8aff74d 100644 (file)
@@ -1,43 +1,43 @@
-/*++
-
-Copyright (c) 2006, Intel Corporation                                                         
-All rights reserved. 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.             
-
-Module Name:
-
-  DevicePathDriver.c
-
-Abstract:
-
-  Device Path Driver to produce DevPathUtilities Protocol, DevPathFromText Protocol
-  and DevPathToText Protocol.
-
---*/
-
-#include "DevicePath.h"
-
-EFI_HANDLE  mDevicePathHandle = NULL;
-
+/*++\r
+\r
+Copyright (c) 2006, Intel Corporation                                                         \r
+All rights reserved. This program and the accompanying materials                          \r
+are licensed and made available under the terms and conditions of the BSD License         \r
+which accompanies this distribution.  The full text of the license may be found at        \r
+http://opensource.org/licenses/bsd-license.php                                            \r
+                                                                                          \r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+\r
+Module Name:\r
+\r
+  DevicePathDriver.c\r
+\r
+Abstract:\r
+\r
+  Device Path Driver to produce DevPathUtilities Protocol, DevPathFromText Protocol\r
+  and DevPathToText Protocol.\r
+\r
+--*/\r
+\r
+#include "DevicePath.h"\r
+\r
+EFI_HANDLE  mDevicePathHandle = NULL;\r
+\r
 GLOBAL_REMOVE_IF_UNREFERENCED const EFI_DEVICE_PATH_UTILITIES_PROTOCOL mDevicePathUtilities = {\r
-  GetDevicePathSizeProtocolInterface,
-  DuplicateDevicePathProtocolInterface,
-  AppendDevicePathProtocolInterface,
-  AppendDeviceNodeProtocolInterface,
-  AppendDevicePathInstanceProtocolInterface,
-  GetNextDevicePathInstanceProtocolInterface,
-  IsDevicePathMultiInstanceProtocolInterface,
-  CreateDeviceNodeProtocolInterface
+  GetDevicePathSizeProtocolInterface,\r
+  DuplicateDevicePathProtocolInterface,\r
+  AppendDevicePathProtocolInterface,\r
+  AppendDeviceNodeProtocolInterface,\r
+  AppendDevicePathInstanceProtocolInterface,\r
+  GetNextDevicePathInstanceProtocolInterface,\r
+  IsDevicePathMultiInstanceProtocolInterface,\r
+  CreateDeviceNodeProtocolInterface\r
 };\r
 \r
 GLOBAL_REMOVE_IF_UNREFERENCED const EFI_DEVICE_PATH_TO_TEXT_PROTOCOL   mDevicePathToText = {\r
-  ConvertDeviceNodeToText,
-  ConvertDevicePathToText
+  ConvertDeviceNodeToText,\r
+  ConvertDevicePathToText\r
 };\r
 \r
 GLOBAL_REMOVE_IF_UNREFERENCED const EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL mDevicePathFromText = {\r
@@ -45,65 +45,65 @@ GLOBAL_REMOVE_IF_UNREFERENCED const EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL mDevicePa
   ConvertTextToDevicePath  \r
 };\r
 \r
-GLOBAL_REMOVE_IF_UNREFERENCED const EFI_GUID mEfiDevicePathMessagingUartFlowControlGuid = DEVICE_PATH_MESSAGING_UART_FLOW_CONTROL;
-GLOBAL_REMOVE_IF_UNREFERENCED const EFI_GUID mEfiDevicePathMessagingSASGuid             = DEVICE_PATH_MESSAGING_SAS;
-
-EFI_STATUS
-EFIAPI
-DevicePathEntryPoint (
-  IN EFI_HANDLE           ImageHandle,
-  IN EFI_SYSTEM_TABLE     *SystemTable
-  )
-/*++
-
-  Routine Description:
-    Entry point for EFI drivers.
-
-  Arguments:
-   ImageHandle - EFI_HANDLE
-   SystemTable - EFI_SYSTEM_TABLE
-
-  Returns:
-    EFI_SUCCESS
-    others
-
---*/
-{
-  EFI_STATUS  Status;
-  Status = EFI_UNSUPPORTED;
+GLOBAL_REMOVE_IF_UNREFERENCED const EFI_GUID mEfiDevicePathMessagingUartFlowControlGuid = DEVICE_PATH_MESSAGING_UART_FLOW_CONTROL;\r
+GLOBAL_REMOVE_IF_UNREFERENCED const EFI_GUID mEfiDevicePathMessagingSASGuid             = DEVICE_PATH_MESSAGING_SAS;\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+DevicePathEntryPoint (\r
+  IN EFI_HANDLE           ImageHandle,\r
+  IN EFI_SYSTEM_TABLE     *SystemTable\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Entry point for EFI drivers.\r
+\r
+  Arguments:\r
+   ImageHandle - EFI_HANDLE\r
+   SystemTable - EFI_SYSTEM_TABLE\r
+\r
+  Returns:\r
+    EFI_SUCCESS\r
+    others\r
+\r
+--*/\r
+{\r
+  EFI_STATUS  Status;\r
\r
+  Status = EFI_UNSUPPORTED;\r
   if (FeaturePcdGet (PcdDevicePathSupportDevicePathToText)) {\r
     if (FeaturePcdGet (PcdDevicePathSupportDevicePathFromText)) {\r
-      Status = gBS->InstallMultipleProtocolInterfaces (
-                      &mDevicePathHandle,
-                      &gEfiDevicePathUtilitiesProtocolGuid, &mDevicePathUtilities,
-                      &gEfiDevicePathToTextProtocolGuid,    &mDevicePathToText,
-                      &gEfiDevicePathFromTextProtocolGuid,  &mDevicePathFromText,
-                      NULL
-                      );
+      Status = gBS->InstallMultipleProtocolInterfaces (\r
+                      &mDevicePathHandle,\r
+                      &gEfiDevicePathUtilitiesProtocolGuid, &mDevicePathUtilities,\r
+                      &gEfiDevicePathToTextProtocolGuid,    &mDevicePathToText,\r
+                      &gEfiDevicePathFromTextProtocolGuid,  &mDevicePathFromText,\r
+                      NULL\r
+                      );\r
     } else {\r
-      Status = gBS->InstallMultipleProtocolInterfaces (
-                      &mDevicePathHandle,
-                      &gEfiDevicePathUtilitiesProtocolGuid, &mDevicePathUtilities,
-                      &gEfiDevicePathToTextProtocolGuid,    &mDevicePathToText,
-                      NULL
-                      );
+      Status = gBS->InstallMultipleProtocolInterfaces (\r
+                      &mDevicePathHandle,\r
+                      &gEfiDevicePathUtilitiesProtocolGuid, &mDevicePathUtilities,\r
+                      &gEfiDevicePathToTextProtocolGuid,    &mDevicePathToText,\r
+                      NULL\r
+                      );\r
     }\r
   } else {\r
     if (FeaturePcdGet (PcdDevicePathSupportDevicePathFromText)) {\r
-      Status = gBS->InstallMultipleProtocolInterfaces (
-                      &mDevicePathHandle,
-                      &gEfiDevicePathUtilitiesProtocolGuid, &mDevicePathUtilities,
-                      &gEfiDevicePathFromTextProtocolGuid,  &mDevicePathFromText,
-                      NULL
-                      );
+      Status = gBS->InstallMultipleProtocolInterfaces (\r
+                      &mDevicePathHandle,\r
+                      &gEfiDevicePathUtilitiesProtocolGuid, &mDevicePathUtilities,\r
+                      &gEfiDevicePathFromTextProtocolGuid,  &mDevicePathFromText,\r
+                      NULL\r
+                      );\r
     } else {\r
-      Status = gBS->InstallMultipleProtocolInterfaces (
-                      &mDevicePathHandle,
-                      &gEfiDevicePathUtilitiesProtocolGuid, &mDevicePathUtilities,
-                      NULL
-                      );
+      Status = gBS->InstallMultipleProtocolInterfaces (\r
+                      &mDevicePathHandle,\r
+                      &gEfiDevicePathUtilitiesProtocolGuid, &mDevicePathUtilities,\r
+                      NULL\r
+                      );\r
     }\r
   }\r
-  return Status;
-}
+  return Status;\r
+}\r
index cd49359..d9dcd44 100644 (file)
-/*++
-
-Copyright (c) 2006, Intel Corporation                                                         
-All rights reserved. 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.             
-
-Module Name:
-
-  DevicePathFromText.c
-
-Abstract:
-
-  DevicePathFromText protocol as defined in the UEFI 2.0 specification.
-
---*/
-
-#include "DevicePath.h"
-
-CHAR16 *
-StrDuplicate (
-  IN CONST CHAR16  *Src
-  )
-/*++
-
-  Routine Description:
-    Duplicate a string
-
-  Arguments:
-    Src - Source string
-
-  Returns:
-    Duplicated string
-
---*/
-{
-  UINTN   Length;
-  CHAR16  *ReturnStr;
-
-  Length = StrLen ((CHAR16 *) Src);
-
-  ReturnStr = AllocateCopyPool ((Length + 1) * sizeof (CHAR16), (VOID *) Src);
-
-  return ReturnStr;
-}
-
-CHAR16 *
-GetParamByNodeName (
-  IN CHAR16 *Str,
-  IN CHAR16 *NodeName
-  )
-/*++
-
-  Routine Description:
-    Get parameter in a pair of parentheses follow the given node name.
-    For example, given the "Pci(0,1)" and NodeName "Pci", it returns "0,1".
-
-  Arguments:
-    Str      - Device Path Text
-    NodeName - Name of the node
-
-  Returns:
-    Parameter text for the node
-
---*/
-{
-  CHAR16  *ParamStr;
-  CHAR16  *StrPointer;
-  UINTN   NodeNameLength;
-  UINTN   ParameterLength;
-
-  //
-  // Check whether the node name matchs
-  //
-  NodeNameLength = StrLen (NodeName);
-  if (CompareMem (Str, NodeName, NodeNameLength * sizeof (CHAR16)) != 0) {
-    return NULL;
-  }
-
-  ParamStr = Str + NodeNameLength;
-  if (!IS_LEFT_PARENTH (*ParamStr)) {
-    return NULL;
-  }
-
-  //
-  // Skip the found '(' and find first occurrence of ')'
-  //
-  ParamStr++;
-  ParameterLength = 0;
-  StrPointer = ParamStr;
-  while (!IS_NULL (*StrPointer)) {
-    if (IS_RIGHT_PARENTH (*StrPointer)) {
-      break;
-    }
-    StrPointer++;
-    ParameterLength++;
-  }
-  if (IS_NULL (*StrPointer)) {
-    //
-    // ')' not found
-    //
-    return NULL;
-  }
-
-  ParamStr = AllocateCopyPool ((ParameterLength + 1) * sizeof (CHAR16), ParamStr);
-  if (ParamStr == NULL) {
-    return NULL;
-  }
-  //
-  // Terminate the parameter string
-  //
-  ParamStr[ParameterLength] = L'\0';
-
-  return ParamStr;
-}
-
-CHAR16 *
-SplitStr (
-  IN OUT CHAR16 **List,
-  IN     CHAR16 Separator
-  )
-/*++
-
-  Routine Description:
-    Get current sub-string from a string list, before return
-    the list header is moved to next sub-string. The sub-string is separated
-    by the specified character. For example, the separator is ',', the string
-    list is "2,0,3", it returns "2", the remain list move to "2,3"
-
-  Arguments:
-    List       - A string list separated by the specified separator
-    Separator  - The separator character
-
-  Returns:
-    pointer    - The current sub-string
-
---*/
-{
-  CHAR16  *Str;
-  CHAR16  *ReturnStr;
-
-  Str = *List;
-  ReturnStr = Str;
-
-  if (IS_NULL (*Str)) {
-    return ReturnStr;
-  }
-
-  //
-  // Find first occurrence of the separator
-  //
-  while (!IS_NULL (*Str)) {
-    if (*Str == Separator) {
-      break;
-    }
-    Str++;
-  }
-
-  if (*Str == Separator) {
-    //
-    // Find a sub-string, terminate it
-    //
-    *Str = L'\0';
-    Str++;
-  }
-
-  //
-  // Move to next sub-string
-  //
-  *List = Str;
-
-  return ReturnStr;
-}
-
-CHAR16 *
-GetNextParamStr (
-  IN OUT CHAR16 **List
-  )
-{
-  //
-  // The separator is comma
-  //
-  return SplitStr (List, L',');
-}
-
-CHAR16 *
-GetNextDeviceNodeStr (
-  IN OUT CHAR16   **DevicePath,
-  OUT    BOOLEAN  *IsInstanceEnd
-  )
-/*++
-
-  Routine Description:
-    Get one device node from entire device path text.
-
-  Arguments:
-    Str           - The entire device path text string
-    IsInstanceEnd - This node is the end of a device path instance
-
-  Returns:
-    a pointer     - A device node text
-    NULL          - No more device node available
-
---*/
-{
-  CHAR16  *Str;
-  CHAR16  *ReturnStr;
-  UINTN   ParenthesesStack;
-
-  Str = *DevicePath;
-  if (IS_NULL (*Str)) {
-    return NULL;
-  }
-
-  //
-  // Skip the leading '/', '(', ')' and ','
-  //
-  while (!IS_NULL (*Str)) {
-    if (!IS_SLASH (*Str) &&
-        !IS_COMMA (*Str) &&
-        !IS_LEFT_PARENTH (*Str) &&
-        !IS_RIGHT_PARENTH (*Str)) {
-      break;
-    }
-    Str++;
-  }
-
-  ReturnStr = Str;
-
-  //
-  // Scan for the separator of this device node, '/' or ','
-  //
-  ParenthesesStack = 0;
-  while (!IS_NULL (*Str)) {
-    if ((IS_COMMA (*Str) || IS_SLASH (*Str)) && (ParenthesesStack == 0)) {
-      break;
-    }
-
-    if (IS_LEFT_PARENTH (*Str)) {
-      ParenthesesStack++;
-    } else if (IS_RIGHT_PARENTH (*Str)) {
-      ParenthesesStack--;
-    }
-
-    Str++;
-  }
-
-  if (ParenthesesStack != 0) {
-    //
-    // The '(' doesn't pair with ')', invalid device path text
-    //
-    return NULL;
-  }
-
-  if (IS_COMMA (*Str)) {
-    *IsInstanceEnd = TRUE;
-    *Str = L'\0';
-    Str++;
-  } else {
-    *IsInstanceEnd = FALSE;
-    if (!IS_NULL (*Str)) {
-      *Str = L'\0';
-      Str++;
-    }
-  }
-
-  *DevicePath = Str;
-
-  return ReturnStr;
-}
-
-BOOLEAN
-IsHexDigit (
-  OUT UINT8      *Digit,
-  IN  CHAR16      Char
-  )
-/*++
-
-  Routine Description:
-    Determines if a Unicode character is a hexadecimal digit.
-    The test is case insensitive.
-
-  Arguments:
-    Digit - Pointer to byte that receives the value of the hex character.
-    Char  - Unicode character to test.
-
-  Returns:
-    TRUE  - If the character is a hexadecimal digit.
-    FALSE - Otherwise.
-
---*/
-{
-  if ((Char >= L'0') && (Char <= L'9')) {
-    *Digit = (UINT8) (Char - L'0');
-    return TRUE;
-  }
-
-  if ((Char >= L'A') && (Char <= L'F')) {
-    *Digit = (UINT8) (Char - L'A' + 0x0A);
-    return TRUE;
-  }
-
-  if ((Char >= L'a') && (Char <= L'f')) {
-    *Digit = (UINT8) (Char - L'a' + 0x0A);
-    return TRUE;
-  }
-
-  return FALSE;
-}
-
-CHAR16
-NibbleToHexChar (
-  IN UINT8      Nibble
-  )
-/*++
-
-  Routine Description:
-    Converts the low nibble of a byte  to hex unicode character.
-
-  Arguments:
-    Nibble - lower nibble of a byte.
-
-  Returns:
-    Hex unicode character.
-
---*/
-{
-  Nibble &= 0x0F;
-  if (Nibble <= 0x9) {
-    return (CHAR16)(Nibble + L'0');
-  }
-
-  return (CHAR16)(Nibble - 0xA + L'A');
-}
-
-EFI_STATUS
-HexStringToBuf (
-  IN OUT UINT8                     *Buf,   
-  IN OUT UINTN                     *Len,
-  IN     CHAR16                    *Str,
-  OUT    UINTN                     *ConvertedStrLen  OPTIONAL
-  )
-/*++
-
-  Routine Description:
-    Converts Unicode string to binary buffer.
-    The conversion may be partial.
-    The first character in the string that is not hex digit stops the conversion.
-    At a minimum, any blob of data could be represented as a hex string.
-
-  Arguments:
-    Buf    - Pointer to buffer that receives the data.
-    Len    - Length in bytes of the buffer to hold converted data.
-                If routine return with EFI_SUCCESS, containing length of converted data.
-                If routine return with EFI_BUFFER_TOO_SMALL, containg length of buffer desired.
-    Str    - String to be converted from.
-    ConvertedStrLen - Length of the Hex String consumed.
-
-  Returns:
-    EFI_SUCCESS: Routine Success.
-    EFI_BUFFER_TOO_SMALL: The buffer is too small to hold converted data.
-    EFI_
-
---*/
-{
-  UINTN       HexCnt;
-  UINTN       Idx;
-  UINTN       BufferLength;
-  UINT8       Digit;
-  UINT8       Byte;
-
-  //
-  // Find out how many hex characters the string has.
-  //
-  for (Idx = 0, HexCnt = 0; IsHexDigit (&Digit, Str[Idx]); Idx++, HexCnt++);
-
-  if (HexCnt == 0) {
-    *Len = 0;
-    return EFI_SUCCESS;
-  }
-  //
-  // Two Unicode characters make up 1 buffer byte. Round up.
-  //
-  BufferLength = (HexCnt + 1) / 2; 
-
-  //
-  // Test if  buffer is passed enough.
-  //
-  if (BufferLength > (*Len)) {
-    *Len = BufferLength;
-    return EFI_BUFFER_TOO_SMALL;
-  }
-
-  *Len = BufferLength;
-
-  for (Idx = 0; Idx < HexCnt; Idx++) {
-
-    IsHexDigit (&Digit, Str[HexCnt - 1 - Idx]);
-
-    //
-    // For odd charaters, write the lower nibble for each buffer byte,
-    // and for even characters, the upper nibble.
-    //
-    if ((Idx & 1) == 0) {
-      Byte = Digit;
-    } else {
-      Byte = Buf[Idx / 2];
-      Byte &= 0x0F;
-      Byte |= Digit << 4;
-    }
-
-    Buf[Idx / 2] = Byte;
-  }
-
-  if (ConvertedStrLen != NULL) {
-    *ConvertedStrLen = HexCnt;
-  }
-
-  return EFI_SUCCESS;
-}
-
-EFI_STATUS
-BufToHexString (
-  IN OUT CHAR16                    *Str,
-  IN OUT UINTN                     *HexStringBufferLength,
-  IN     UINT8                     *Buf,
-  IN     UINTN                     Len
-  )
-/*++
-
-  Routine Description:
-    Converts binary buffer to Unicode string.
-    At a minimum, any blob of data could be represented as a hex string.
-
-  Arguments:
-    Str - Pointer to the string.
-    HexStringBufferLength - Length in bytes of buffer to hold the hex string. Includes tailing '\0' character.
-                                        If routine return with EFI_SUCCESS, containing length of hex string buffer.
-                                        If routine return with EFI_BUFFER_TOO_SMALL, containg length of hex string buffer desired.
-    Buf - Buffer to be converted from.
-    Len - Length in bytes of the buffer to be converted.
-
-  Returns:
-    EFI_SUCCESS: Routine success.
-    EFI_BUFFER_TOO_SMALL: The hex string buffer is too small.
-
---*/
-{
-  UINTN       Idx;
-  UINT8       Byte;
-  UINTN       StrLen;
-
-  //
-  // Make sure string is either passed or allocate enough.
-  // It takes 2 Unicode characters (4 bytes) to represent 1 byte of the binary buffer.
-  // Plus the Unicode termination character.
-  //
-  StrLen = Len * 2;
-  if (StrLen > ((*HexStringBufferLength) - 1)) {
-    *HexStringBufferLength = StrLen + 1;
-    return EFI_BUFFER_TOO_SMALL;
-  }
-
-  *HexStringBufferLength = StrLen + 1;
-  //
-  // Ends the string.
-  //
-  Str[StrLen] = L'\0'; 
-
-  for (Idx = 0; Idx < Len; Idx++) {
-
-    Byte = Buf[Idx];
-    Str[StrLen - 1 - Idx * 2] = NibbleToHexChar (Byte);
-    Str[StrLen - 2 - Idx * 2] = NibbleToHexChar ((UINT8)(Byte >> 4));
-  }
-
-  return EFI_SUCCESS;
-}
-
-CHAR16 *
-TrimHexStr (
-  IN CHAR16  *Str
-  )
-/*++
-
-  Routine Description:
-    Skip the leading white space and '0x' or '0X' of a hex string
-
-  Arguments:
-    Str  -  The hex string
-
-  Returns:
-
---*/
-{
-  //
-  // skip preceeding white space
-  //
-  while (*Str && *Str == ' ') {
-    Str += 1;
-  }
-  //
-  // skip preceeding zeros
-  //
-  while (*Str && *Str == '0') {
-    Str += 1;
-  }
-  //
-  // skip preceeding white space
-  //
-  if (*Str && (*Str == 'x' || *Str == 'X')) {
-    Str += 1;
-  }
-
-  return Str;
-}
-
-UINTN
-Xtoi (
-  IN CHAR16  *Str
-  )
-/*++
-
-Routine Description:
-
-  Convert hex string to uint
-
-Arguments:
-
-  Str  -  The string
-  
-Returns:
-
---*/
-{
-  UINTN   Rvalue;
-  UINTN   Length;
-
-  ASSERT (Str != NULL);
-
-  //
-  // convert hex digits
-  //
-  Rvalue = 0;
-  Length = sizeof (UINTN);
-  HexStringToBuf ((UINT8 *) &Rvalue, &Length, TrimHexStr (Str), NULL);
-
-  return Rvalue;
-}
-
-VOID
-Xtoi64 (
-  IN CHAR16  *Str,
-  IN UINT64  *Data
-  )
-/*++
-
-Routine Description:
-
-  Convert hex string to 64 bit data.
-
-Arguments:
-
-  Str  -  The string
-  
-Returns:
-
---*/
-{
-  UINTN  Length;
-
-  *Data  = 0;
-  Length = sizeof (UINT64);
-  HexStringToBuf ((UINT8 *) Data, &Length, TrimHexStr (Str), NULL);
-}
-
-UINTN
-Atoi (
-  IN CHAR16  *str
-  )
-/*++
-
-Routine Description:
-
-  Convert decimal string to uint
-
-Arguments:
-
-  Str  -  The string
-  
-Returns:
-
---*/
-{
-  UINTN   Rvalue;
-  CHAR16  Char;
-  UINTN   High;
-  UINTN   Low;
-
-  ASSERT (str != NULL);
-
-  High = (UINTN) -1 / 10;
-  Low  = (UINTN) -1 % 10;
-  //
-  // skip preceeding white space
-  //
-  while (*str && *str == ' ') {
-    str += 1;
-  }
-  //
-  // convert digits
-  //
-  Rvalue = 0;
-  Char = *(str++);
-  while (Char) {
-    if (Char >= '0' && Char <= '9') {
-      if ((Rvalue > High || Rvalue == High) && (Char - '0' > (INTN) Low)) {
-        return (UINTN) -1;
-      }
-
-      Rvalue = (Rvalue * 10) + Char - '0';
-    } else {
-      break;
-    }
-
-    Char = *(str++);
-  }
-
-  return Rvalue;
-}
-
-EFI_STATUS 
-StrToBuf (
-  OUT UINT8    *Buf,
-  IN  UINTN    BufferLength,
-  IN  CHAR16   *Str
-  )
-{
-  UINTN       Index;
-  UINTN       StrLength;
-  UINT8       Digit;
-  UINT8       Byte;
-
-  //
-  // Two hex char make up one byte
-  //
-  StrLength = BufferLength * sizeof (CHAR16);
-
-  for(Index = 0; Index < StrLength; Index++, Str++) {
-
-    IsHexDigit (&Digit, *Str);
-
-    //
-    // For odd charaters, write the upper nibble for each buffer byte,
-    // and for even characters, the lower nibble.
-    //
-    if ((Index & 1) == 0) {
-      Byte = Digit << 4;
-    } else {
-      Byte = Buf[Index / 2];
-      Byte &= 0xF0;
-      Byte |= Digit;
-    }
-
-    Buf[Index / 2] = Byte;
-  }
-
-  return EFI_SUCCESS;
-}
-
-EFI_STATUS
-StrToGuid (
-  IN  CHAR16   *Str,
-  OUT EFI_GUID *Guid
-  )
-{
-  UINTN       BufferLength;
-  UINTN       ConvertedStrLen;
-  EFI_STATUS  Status;
-
-  BufferLength = sizeof (Guid->Data1);
-  Status = HexStringToBuf ((UINT8 *) &Guid->Data1, &BufferLength, Str, &ConvertedStrLen);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-  Str += ConvertedStrLen;
-  if (IS_HYPHEN (*Str)) {
-    Str++;   
-  } else {
-    return EFI_UNSUPPORTED;
-  }
-
-  BufferLength = sizeof (Guid->Data2);
-  Status = HexStringToBuf ((UINT8 *) &Guid->Data2, &BufferLength, Str, &ConvertedStrLen);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-  Str += ConvertedStrLen;
-  if (IS_HYPHEN (*Str)) {
-    Str++;
-  } else {
-    return EFI_UNSUPPORTED;
-  }
-
-  BufferLength = sizeof (Guid->Data3);
-  Status = HexStringToBuf ((UINT8 *) &Guid->Data3, &BufferLength, Str, &ConvertedStrLen);
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-  Str += ConvertedStrLen;
-  if (IS_HYPHEN (*Str)) {
-    Str++;
-  } else {
-    return EFI_UNSUPPORTED;
-  }
-
-  StrToBuf (&Guid->Data4[0], 2, Str);
-  //
-  // Skip 2 byte hex chars
-  //
-  Str += 2 * 2;
-
-  if (IS_HYPHEN (*Str)) {
-    Str++;
-  } else {
-    return EFI_UNSUPPORTED;
-  }
-  StrToBuf (&Guid->Data4[2], 6, Str);
-
-  return EFI_SUCCESS;
-}
-
-VOID
-StrToIPv4Addr (
-  IN OUT CHAR16           **Str,
-  OUT    EFI_IPv4_ADDRESS *IPv4Addr
-  )
-{
-  UINTN  Index;
-
-  for (Index = 0; Index < 4; Index++) {
-    IPv4Addr->Addr[Index] = (UINT8) Atoi (SplitStr (Str, L'.'));
-  }
-}
-
-VOID
-StrToIPv6Addr (
-  IN OUT CHAR16           **Str,
-  OUT    EFI_IPv6_ADDRESS *IPv6Addr
-  )
-{
-  UINTN  Index;
-  UINT16 Data;
-
-  for (Index = 0; Index < 8; Index++) {
-    Data = (UINT16) Xtoi (SplitStr (Str, L':'));
-    IPv6Addr->Addr[Index * 2] = (UINT8) (Data >> 8);
-    IPv6Addr->Addr[Index * 2 + 1] = (UINT8) (Data & 0xff);
-  }
-}
-
-VOID
-StrToAscii (
-  IN     CHAR16 *Str,
-  IN OUT CHAR8  **AsciiStr
-  )
-{
-  CHAR8 *Dest;
-
-  Dest = *AsciiStr;
-  while (!IS_NULL (*Str)) {
-    *(Dest++) = (CHAR8) *(Str++);
-  }
-  *Dest = 0;
-
-  //
-  // Return the string next to it
-  //
-  *AsciiStr = Dest + 1;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextPci (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16          *FunctionStr;
-  CHAR16          *DeviceStr;
-  PCI_DEVICE_PATH *Pci;
-
-  FunctionStr = GetNextParamStr (&TextDeviceNode);
-  DeviceStr   = GetNextParamStr (&TextDeviceNode);
-  Pci         = (PCI_DEVICE_PATH *) CreateDeviceNode (
-                                      HARDWARE_DEVICE_PATH,
-                                      HW_PCI_DP,
-                                      sizeof (PCI_DEVICE_PATH)
-                                      );
-
-  Pci->Function = (UINT8) Xtoi (FunctionStr);
-  Pci->Device   = (UINT8) Xtoi (DeviceStr);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) Pci;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextPcCard (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16              *FunctionNumberStr;
-  PCCARD_DEVICE_PATH  *Pccard;
-
-  FunctionNumberStr = GetNextParamStr (&TextDeviceNode);
-  Pccard            = (PCCARD_DEVICE_PATH *) CreateDeviceNode (
-                                               HARDWARE_DEVICE_PATH,
-                                               HW_PCCARD_DP,
-                                               sizeof (PCCARD_DEVICE_PATH)
-                                               );
-
-  Pccard->FunctionNumber  = (UINT8) Xtoi (FunctionNumberStr);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) Pccard;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextMemoryMapped (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16              *StartingAddressStr;
-  CHAR16              *EndingAddressStr;
-  MEMMAP_DEVICE_PATH  *MemMap;
-
-  StartingAddressStr = GetNextParamStr (&TextDeviceNode);
-  EndingAddressStr   = GetNextParamStr (&TextDeviceNode);
-  MemMap             = (MEMMAP_DEVICE_PATH *) CreateDeviceNode (
-                                               HARDWARE_DEVICE_PATH,
-                                               HW_MEMMAP_DP,
-                                               sizeof (MEMMAP_DEVICE_PATH)
-                                               );
-
-  MemMap->MemoryType  = 0;
-
-  Xtoi64 (StartingAddressStr, &MemMap->StartingAddress);
-  Xtoi64 (EndingAddressStr, &MemMap->EndingAddress);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) MemMap;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-ConvertFromTextVendor (
-  IN CHAR16 *TextDeviceNode,
-  IN UINT8  Type,
-  IN UINT8  SubType
-  )
-{
-  CHAR16              *GuidStr;
-  CHAR16              *DataStr;
-  UINTN               Length;
-  VENDOR_DEVICE_PATH  *Vendor;
-
-  GuidStr = GetNextParamStr (&TextDeviceNode);
-
-  DataStr = GetNextParamStr (&TextDeviceNode);
-  Length  = StrLen (DataStr);
-  //
-  // Two hex characters make up 1 buffer byte
-  //
-  Length  = (Length + 1) / 2;
-
-  Vendor  = (VENDOR_DEVICE_PATH *) CreateDeviceNode (
-                                     Type,
-                                     SubType,
-                                     sizeof (VENDOR_DEVICE_PATH) + (UINT16) Length
-                                     );
-
-  StrToGuid (GuidStr, &Vendor->Guid);
-  StrToBuf (((UINT8 *) Vendor) + sizeof (VENDOR_DEVICE_PATH), Length, DataStr);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextVenHw (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  return ConvertFromTextVendor (
-           TextDeviceNode,
-           HARDWARE_DEVICE_PATH,
-           HW_VENDOR_DP
-           );
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextCtrl (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16                  *ControllerStr;
-  CONTROLLER_DEVICE_PATH  *Controller;
-
-  ControllerStr = GetNextParamStr (&TextDeviceNode);
-  Controller    = (CONTROLLER_DEVICE_PATH *) CreateDeviceNode (
-                                               HARDWARE_DEVICE_PATH,
-                                               HW_CONTROLLER_DP,
-                                               sizeof (CONTROLLER_DEVICE_PATH)
-                                               );
-  Controller->ControllerNumber = (UINT32) Xtoi (ControllerStr);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) Controller;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextAcpi (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16                *HIDStr;
-  CHAR16                *UIDStr;
-  ACPI_HID_DEVICE_PATH  *Acpi;
-
-  HIDStr = GetNextParamStr (&TextDeviceNode);
-  UIDStr = GetNextParamStr (&TextDeviceNode);
-  Acpi   = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (
-                                      ACPI_DEVICE_PATH,
-                                      ACPI_DP,
-                                      sizeof (ACPI_HID_DEVICE_PATH)
-                                      );
-
-  if ((HIDStr[0] == L'P') && (HIDStr[1] == L'N') && (HIDStr[2] == L'P')) {
-    HIDStr += 3;
-  }
-
-  Acpi->HID = EISA_PNP_ID (Xtoi (HIDStr));
-  Acpi->UID = (UINT32) Xtoi (UIDStr);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) Acpi;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-ConvertFromTextAcpi (
-  IN CHAR16 *TextDeviceNode,
-  IN UINT32  Hid
-  )
-{
-  CHAR16                *UIDStr;
-  ACPI_HID_DEVICE_PATH  *Acpi;
-
-  UIDStr = GetNextParamStr (&TextDeviceNode);
-  Acpi   = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (
-                                      ACPI_DEVICE_PATH,
-                                      ACPI_DP,
-                                      sizeof (ACPI_HID_DEVICE_PATH)
-                                      );
-
-  Acpi->HID = Hid;
-  Acpi->UID = (UINT32) Xtoi (UIDStr);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) Acpi;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextPciRoot (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  return ConvertFromTextAcpi (TextDeviceNode, 0x0a0341d0);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextFloppy (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  return ConvertFromTextAcpi (TextDeviceNode, 0x060441d0);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextKeyboard (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  return ConvertFromTextAcpi (TextDeviceNode, 0x030141d0);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextSerial (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  return ConvertFromTextAcpi (TextDeviceNode, 0x050141d0);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextParallelPort (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  return ConvertFromTextAcpi (TextDeviceNode, 0x040141d0);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextAcpiEx (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16                                  *HIDStr;
-  CHAR16                                  *CIDStr;
-  CHAR16                                  *UIDStr;
-  CHAR16                                  *HIDSTRStr;
-  CHAR16                                  *CIDSTRStr;
-  CHAR16                                  *UIDSTRStr;
-  CHAR8                                   *AsciiStr;
-  UINT16                                  Length;
-  ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR  *AcpiExt;
-
-  HIDStr    = GetNextParamStr (&TextDeviceNode);
-  CIDStr    = GetNextParamStr (&TextDeviceNode);
-  UIDStr    = GetNextParamStr (&TextDeviceNode);
-  HIDSTRStr = GetNextParamStr (&TextDeviceNode);
-  CIDSTRStr = GetNextParamStr (&TextDeviceNode);
-  UIDSTRStr = GetNextParamStr (&TextDeviceNode);
-  Length    = sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + 
-                  (UINT16) StrLen (HIDSTRStr) + 1 +
-                  (UINT16) StrLen (UIDSTRStr) + 1 +
-                  (UINT16) StrLen (CIDSTRStr) + 1;
-  AcpiExt = (ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR *) CreateDeviceNode (
-                                                         ACPI_DEVICE_PATH,
-                                                         ACPI_EXTENDED_DP,
-                                                         Length
-                                                         );
-
-  if ((HIDStr[0] == L'P') && (HIDStr[1] == L'N') && (HIDStr[2] == L'P')) {
-    HIDStr += 3;
-    AcpiExt->HID = EISA_PNP_ID (Xtoi (HIDStr));
-  } else {
-    AcpiExt->HID = (UINT32) Xtoi (HIDStr);
-  }
-
-  AcpiExt->UID  = (UINT32) Xtoi (UIDStr);
-  AcpiExt->CID  = (UINT32) Xtoi (CIDStr);
-
-  AsciiStr = AcpiExt->HidUidCidStr;
-  StrToAscii (HIDSTRStr, &AsciiStr);
-  StrToAscii (UIDSTRStr, &AsciiStr);
-  StrToAscii (CIDSTRStr, &AsciiStr);
-  
-  return (EFI_DEVICE_PATH_PROTOCOL *) AcpiExt;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextAcpiExp (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16                                  *HIDStr;
-  CHAR16                                  *CIDStr;
-  CHAR16                                  *UIDSTRStr;
-  CHAR8                                   *AsciiStr;
-  UINT16                                  Length;
-  ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR  *AcpiExt;
-
-  HIDStr    = GetNextParamStr (&TextDeviceNode);
-  CIDStr    = GetNextParamStr (&TextDeviceNode);
-  UIDSTRStr = GetNextParamStr (&TextDeviceNode);
-  Length    = sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + (UINT16) StrLen (UIDSTRStr) + 3;
-  AcpiExt   = (ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR *) CreateDeviceNode (
-                                                           ACPI_DEVICE_PATH,
-                                                           ACPI_EXTENDED_DP,
-                                                           Length
-                                                           );
-
-  if ((HIDStr[0] == L'P') && (HIDStr[1] == L'N') && (HIDStr[2] == L'P')) {
-    HIDStr += 3;
-    AcpiExt->HID = EISA_PNP_ID (Xtoi (HIDStr));
-  } else {
-    AcpiExt->HID = (UINT32) Xtoi (HIDStr);
-  }
-
-  AcpiExt->UID = 0;
-  AcpiExt->CID = (UINT32) Xtoi (CIDStr);
-
-  AsciiStr = AcpiExt->HidUidCidStr;
-  //
-  // HID string is NULL
-  //
-  *AsciiStr = 0;
-  //
-  // Convert UID string
-  //
-  AsciiStr++;
-  StrToAscii (UIDSTRStr, &AsciiStr);
-  //
-  // CID string is NULL
-  //
-  *AsciiStr = 0;
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) AcpiExt;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextAta (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16            *PrimarySecondaryStr;
-  CHAR16            *SlaveMasterStr;
-  CHAR16            *LunStr;
-  ATAPI_DEVICE_PATH *Atapi;
-
-  Atapi = (ATAPI_DEVICE_PATH *) CreateDeviceNode (
-                                  MESSAGING_DEVICE_PATH,
-                                  MSG_ATAPI_DP,
-                                  sizeof (ATAPI_DEVICE_PATH)
-                                  );
-
-  PrimarySecondaryStr     = GetNextParamStr (&TextDeviceNode);
-  SlaveMasterStr          = GetNextParamStr (&TextDeviceNode);
-  LunStr                  = GetNextParamStr (&TextDeviceNode);
-
-  Atapi->PrimarySecondary = (StrCmp (PrimarySecondaryStr, L"Primary") == 0) ? (UINT8) 0 : (UINT8) 1;
-  Atapi->SlaveMaster      = (StrCmp (SlaveMasterStr, L"Master") == 0) ? (UINT8) 0 : (UINT8) 1;
-  Atapi->Lun              = (UINT16) Xtoi (LunStr);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) Atapi;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextScsi (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16            *PunStr;
-  CHAR16            *LunStr;
-  SCSI_DEVICE_PATH  *Scsi;
-
-  PunStr = GetNextParamStr (&TextDeviceNode);
-  LunStr = GetNextParamStr (&TextDeviceNode);
-  Scsi   = (SCSI_DEVICE_PATH *) CreateDeviceNode (
-                                   MESSAGING_DEVICE_PATH,
-                                   MSG_SCSI_DP,
-                                   sizeof (SCSI_DEVICE_PATH)
-                                   );
-
-  Scsi->Pun = (UINT16) Xtoi (PunStr);
-  Scsi->Lun = (UINT16) Xtoi (LunStr);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) Scsi;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextFibre (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16                    *WWNStr;
-  CHAR16                    *LunStr;
-  FIBRECHANNEL_DEVICE_PATH  *Fibre;
-
-  WWNStr = GetNextParamStr (&TextDeviceNode);
-  LunStr = GetNextParamStr (&TextDeviceNode);
-  Fibre  = (FIBRECHANNEL_DEVICE_PATH *) CreateDeviceNode (
-                                          MESSAGING_DEVICE_PATH,
-                                          MSG_FIBRECHANNEL_DP,
-                                          sizeof (FIBRECHANNEL_DEVICE_PATH)
-                                          );
-
-  Fibre->Reserved = 0;
-  Xtoi64 (WWNStr, &Fibre->WWN);
-  Xtoi64 (LunStr, &Fibre->Lun);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) Fibre;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromText1394 (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16            *GuidStr;
-  F1394_DEVICE_PATH *F1394;
-
-  GuidStr = GetNextParamStr (&TextDeviceNode);
-  F1394  = (F1394_DEVICE_PATH *) CreateDeviceNode (
-                                   MESSAGING_DEVICE_PATH,
-                                   MSG_1394_DP,
-                                   sizeof (F1394_DEVICE_PATH)
-                                   );
-
-  F1394->Reserved = 0;
-  Xtoi64 (GuidStr, &F1394->Guid);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) F1394;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextUsb (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16          *PortStr;
-  CHAR16          *InterfaceStr;
-  USB_DEVICE_PATH *Usb;
-
-  PortStr               = GetNextParamStr (&TextDeviceNode);
-  InterfaceStr          = GetNextParamStr (&TextDeviceNode);
-  Usb                   = (USB_DEVICE_PATH *) CreateDeviceNode (
-                                                MESSAGING_DEVICE_PATH,
-                                                MSG_USB_DP,
-                                                sizeof (USB_DEVICE_PATH)
-                                                );
-
-  Usb->ParentPortNumber = (UINT8) Xtoi (PortStr);
-  Usb->InterfaceNumber  = (UINT8) Xtoi (InterfaceStr);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) Usb;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextI2O (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16          *TIDStr;
-  I2O_DEVICE_PATH *I2O;
-
-  TIDStr    = GetNextParamStr (&TextDeviceNode);
-  I2O       = (I2O_DEVICE_PATH *) CreateDeviceNode (
-                                    MESSAGING_DEVICE_PATH,
-                                    MSG_I2O_DP,
-                                    sizeof (I2O_DEVICE_PATH)
-                                    );
-
-  I2O->Tid  = (UINT32) Xtoi (TIDStr);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) I2O;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextInfiniband (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16                  *FlagsStr;
-  CHAR16                  *GuidStr;
-  CHAR16                  *SidStr;
-  CHAR16                  *TidStr;
-  CHAR16                  *DidStr;
-  EFI_GUID                PortGid;
-  INFINIBAND_DEVICE_PATH  *InfiniBand;
-
-  FlagsStr   = GetNextParamStr (&TextDeviceNode);
-  GuidStr    = GetNextParamStr (&TextDeviceNode);
-  SidStr     = GetNextParamStr (&TextDeviceNode);
-  TidStr     = GetNextParamStr (&TextDeviceNode);
-  DidStr     = GetNextParamStr (&TextDeviceNode);
-  InfiniBand = (INFINIBAND_DEVICE_PATH *) CreateDeviceNode (
-                                            MESSAGING_DEVICE_PATH,
-                                            MSG_INFINIBAND_DP,
-                                            sizeof (INFINIBAND_DEVICE_PATH)
-                                            );
-
-  InfiniBand->ResourceFlags = (UINT32) Xtoi (FlagsStr);
-  StrToGuid (GuidStr, &PortGid);
-  CopyMem (InfiniBand->PortGid, &PortGid, sizeof (EFI_GUID));
-  Xtoi64 (SidStr, &InfiniBand->ServiceId);
-  Xtoi64 (TidStr, &InfiniBand->TargetPortId);
-  Xtoi64 (DidStr, &InfiniBand->DeviceId);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) InfiniBand;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextVenMsg (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  return ConvertFromTextVendor (
-            TextDeviceNode,
-            MESSAGING_DEVICE_PATH,
-            MSG_VENDOR_DP
-            );
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextVenPcAnsi (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  VENDOR_DEVICE_PATH  *Vendor;
-
-  Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (
-                                    MESSAGING_DEVICE_PATH,
-                                    MSG_VENDOR_DP,
-                                    sizeof (VENDOR_DEVICE_PATH));
-  CopyGuid (&Vendor->Guid, &gEfiPcAnsiGuid);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextVenVt100 (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  VENDOR_DEVICE_PATH  *Vendor;
-
-  Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (
-                                    MESSAGING_DEVICE_PATH,
-                                    MSG_VENDOR_DP,
-                                    sizeof (VENDOR_DEVICE_PATH));
-  CopyGuid (&Vendor->Guid, &gEfiVT100Guid);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextVenVt100Plus (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  VENDOR_DEVICE_PATH  *Vendor;
-
-  Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (
-                                    MESSAGING_DEVICE_PATH,
-                                    MSG_VENDOR_DP,
-                                    sizeof (VENDOR_DEVICE_PATH));
-  CopyGuid (&Vendor->Guid, &gEfiVT100PlusGuid);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextVenUtf8 (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  VENDOR_DEVICE_PATH  *Vendor;
-
-  Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (
-                                    MESSAGING_DEVICE_PATH,
-                                    MSG_VENDOR_DP,
-                                    sizeof (VENDOR_DEVICE_PATH));
-  CopyGuid (&Vendor->Guid, &gEfiVTUTF8Guid);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextUartFlowCtrl (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16                        *ValueStr;
-  UART_FLOW_CONTROL_DEVICE_PATH *UartFlowControl;
-
-  ValueStr        = GetNextParamStr (&TextDeviceNode);
-  UartFlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) CreateDeviceNode (
-                                                        MESSAGING_DEVICE_PATH,
-                                                        MSG_VENDOR_DP,
-                                                        sizeof (UART_FLOW_CONTROL_DEVICE_PATH)
-                                                        );
-
-  CopyGuid (&UartFlowControl->Guid, &mEfiDevicePathMessagingUartFlowControlGuid);
-  if (StrCmp (ValueStr, L"XonXoff") == 0) {
-    UartFlowControl->FlowControlMap = 2;
-  } else if (StrCmp (ValueStr, L"Hardware") == 0) {
-    UartFlowControl->FlowControlMap = 1;
-  } else {
-    UartFlowControl->FlowControlMap = 0;
-  }
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) UartFlowControl;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextSAS (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16          *AddressStr;
-  CHAR16          *LunStr;
-  CHAR16          *RTPStr;
-  CHAR16          *SASSATAStr;
-  CHAR16          *LocationStr;
-  CHAR16          *ConnectStr;
-  CHAR16          *DriveBayStr;
-  CHAR16          *ReservedStr;
-  UINT16          Info;
-  SAS_DEVICE_PATH *Sas;
-
-  AddressStr  = GetNextParamStr (&TextDeviceNode);
-  LunStr      = GetNextParamStr (&TextDeviceNode);
-  RTPStr      = GetNextParamStr (&TextDeviceNode);
-  SASSATAStr  = GetNextParamStr (&TextDeviceNode);
-  LocationStr = GetNextParamStr (&TextDeviceNode);
-  ConnectStr  = GetNextParamStr (&TextDeviceNode);
-  DriveBayStr = GetNextParamStr (&TextDeviceNode);
-  ReservedStr = GetNextParamStr (&TextDeviceNode);
-  Info        = 0x0000;
-  Sas         = (SAS_DEVICE_PATH *) CreateDeviceNode (
-                                       MESSAGING_DEVICE_PATH,
-                                       MSG_VENDOR_DP,
-                                       sizeof (SAS_DEVICE_PATH)
-                                       );
-
-  CopyGuid (&Sas->Guid, &mEfiDevicePathMessagingSASGuid);
-  Xtoi64 (AddressStr, &Sas->SasAddress);
-  Xtoi64 (LunStr, &Sas->Lun);
-  Sas->RelativeTargetPort = (UINT16) Xtoi (RTPStr);
-  if (StrCmp (SASSATAStr, L"NoTopology") == 0)
-    ;
-  else {
-    if (StrCmp (DriveBayStr, L"0") == 0) {
-      Info |= 0x0001;
-    } else {
-      Info |= 0x0002;
-      Info |= (Xtoi (DriveBayStr) << 8);
-    }
-
-    if (StrCmp (SASSATAStr, L"SATA") == 0) {
-      Info |= 0x0010;
-    }
-
-    if (StrCmp (LocationStr, L"External") == 0) {
-      Info |= 0x0020;
-    }
-
-    if (StrCmp (ConnectStr, L"Expanded") == 0) {
-      Info |= 0x0040;
-    }
-  }
-
-  Sas->DeviceTopology = Info;
-  Sas->Reserved       = (UINT32) Xtoi (ReservedStr);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) Sas;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextDebugPort (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  VENDOR_DEFINED_MESSAGING_DEVICE_PATH  *Vend;
-
-  Vend = (VENDOR_DEFINED_MESSAGING_DEVICE_PATH *) CreateDeviceNode (
-                                                    MESSAGING_DEVICE_PATH,
-                                                    MSG_VENDOR_DP,
-                                                    sizeof (VENDOR_DEFINED_MESSAGING_DEVICE_PATH)
-                                                    );
-
-  CopyGuid (&Vend->Guid, &gEfiDebugPortProtocolGuid);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) Vend;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextMAC (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16                *AddressStr;
-  CHAR16                *IfTypeStr;
-  UINTN                 Length;
-  MAC_ADDR_DEVICE_PATH  *MAC;
-
-  AddressStr    = GetNextParamStr (&TextDeviceNode);
-  IfTypeStr     = GetNextParamStr (&TextDeviceNode);
-  MAC           = (MAC_ADDR_DEVICE_PATH *) CreateDeviceNode (
-                                              MESSAGING_DEVICE_PATH,
-                                              MSG_MAC_ADDR_DP,
-                                              sizeof (MAC_ADDR_DEVICE_PATH)
-                                              );
-
-  MAC->IfType   = (UINT8) Xtoi (IfTypeStr);
-
-  Length = sizeof (EFI_MAC_ADDRESS);
-  StrToBuf (&MAC->MacAddress.Addr[0], Length, AddressStr);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) MAC;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextIPv4 (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16            *RemoteIPStr;
-  CHAR16            *ProtocolStr;
-  CHAR16            *TypeStr;
-  CHAR16            *LocalIPStr;
-  IPv4_DEVICE_PATH  *IPv4;
-
-  RemoteIPStr           = GetNextParamStr (&TextDeviceNode);
-  ProtocolStr           = GetNextParamStr (&TextDeviceNode);
-  TypeStr               = GetNextParamStr (&TextDeviceNode);
-  LocalIPStr            = GetNextParamStr (&TextDeviceNode);
-  IPv4                  = (IPv4_DEVICE_PATH *) CreateDeviceNode (
-                                                 MESSAGING_DEVICE_PATH,
-                                                 MSG_IPv4_DP,
-                                                 sizeof (IPv4_DEVICE_PATH)
-                                                 );
-
-  StrToIPv4Addr (&RemoteIPStr, &IPv4->RemoteIpAddress);
-  IPv4->Protocol = (StrCmp (ProtocolStr, L"UDP") == 0) ? (UINT16) 0 : (UINT16) 1;
-  if (StrCmp (TypeStr, L"Static") == 0) {
-    IPv4->StaticIpAddress = TRUE;
-  } else {
-    IPv4->StaticIpAddress = FALSE;
-  }
-
-  StrToIPv4Addr (&LocalIPStr, &IPv4->LocalIpAddress);
-
-  IPv4->LocalPort      = 0;
-  IPv4->RemotePort     = 0;
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) IPv4;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextIPv6 (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16            *RemoteIPStr;
-  CHAR16            *ProtocolStr;
-  CHAR16            *TypeStr;
-  CHAR16            *LocalIPStr;
-  IPv6_DEVICE_PATH  *IPv6;
-
-  RemoteIPStr           = GetNextParamStr (&TextDeviceNode);
-  ProtocolStr           = GetNextParamStr (&TextDeviceNode);
-  TypeStr               = GetNextParamStr (&TextDeviceNode);
-  LocalIPStr            = GetNextParamStr (&TextDeviceNode);
-  IPv6                  = (IPv6_DEVICE_PATH *) CreateDeviceNode (
-                                                 MESSAGING_DEVICE_PATH,
-                                                 MSG_IPv6_DP,
-                                                 sizeof (IPv6_DEVICE_PATH)
-                                                 );
-
-  StrToIPv6Addr (&RemoteIPStr, &IPv6->RemoteIpAddress);
-  IPv6->Protocol        = (StrCmp (ProtocolStr, L"UDP") == 0) ? (UINT16) 0 : (UINT16) 1;
-  if (StrCmp (TypeStr, L"Static") == 0) {
-    IPv6->StaticIpAddress = TRUE;
-  } else {
-    IPv6->StaticIpAddress = FALSE;
-  }
-
-  StrToIPv6Addr (&LocalIPStr, &IPv6->LocalIpAddress);
-
-  IPv6->LocalPort       = 0;
-  IPv6->RemotePort      = 0;
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) IPv6;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextUart (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16            *BaudStr;
-  CHAR16            *DataBitsStr;
-  CHAR16            *ParityStr;
-  CHAR16            *StopBitsStr;
-  UART_DEVICE_PATH  *Uart;
-
-  BaudStr         = GetNextParamStr (&TextDeviceNode);
-  DataBitsStr     = GetNextParamStr (&TextDeviceNode);
-  ParityStr       = GetNextParamStr (&TextDeviceNode);
-  StopBitsStr     = GetNextParamStr (&TextDeviceNode);
-  Uart            = (UART_DEVICE_PATH *) CreateDeviceNode (
-                                           MESSAGING_DEVICE_PATH,
-                                           MSG_UART_DP,
-                                           sizeof (UART_DEVICE_PATH)
-                                           );
-
-  Uart->BaudRate  = (StrCmp (BaudStr, L"DEFAULT") == 0) ? 115200 : Atoi (BaudStr);
-  Uart->DataBits  = (StrCmp (DataBitsStr, L"DEFAULT") == 0) ? (UINT8) 8 : (UINT8) Atoi (DataBitsStr);
-  switch (*ParityStr) {
-  case L'D':
-    Uart->Parity = 0;
-    break;
-
-  case L'N':
-    Uart->Parity = 1;
-    break;
-
-  case L'E':
-    Uart->Parity = 2;
-    break;
-
-  case L'O':
-    Uart->Parity = 3;
-    break;
-
-  case L'M':
-    Uart->Parity = 4;
-    break;
-
-  case L'S':
-    Uart->Parity = 5;
-
-  default:
-    Uart->Parity = 0xff;
-  }
-
-  if (StrCmp (StopBitsStr, L"D") == 0) {
-    Uart->StopBits = (UINT8) 0;
-  } else if (StrCmp (StopBitsStr, L"1") == 0) {
-    Uart->StopBits = (UINT8) 1;
-  } else if (StrCmp (StopBitsStr, L"1.5") == 0) {
-    Uart->StopBits = (UINT8) 2;
-  } else if (StrCmp (StopBitsStr, L"2") == 0) {
-    Uart->StopBits = (UINT8) 3;
-  } else {
-    Uart->StopBits = 0xff;
-  }
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) Uart;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-ConvertFromTextUsbClass (
-  IN CHAR16         *TextDeviceNode,
-  IN USB_CLASS_TEXT *UsbClassText
-  )
-{
-  CHAR16                *VIDStr;
-  CHAR16                *PIDStr;
-  CHAR16                *ClassStr;
-  CHAR16                *SubClassStr;
-  CHAR16                *ProtocolStr;
-  USB_CLASS_DEVICE_PATH *UsbClass;
-
-  UsbClass    = (USB_CLASS_DEVICE_PATH *) CreateDeviceNode (
-                                            MESSAGING_DEVICE_PATH,
-                                            MSG_USB_CLASS_DP,
-                                            sizeof (USB_CLASS_DEVICE_PATH)
-                                            );
-
-  VIDStr      = GetNextParamStr (&TextDeviceNode);
-  PIDStr      = GetNextParamStr (&TextDeviceNode);
-  if (UsbClassText->ClassExist) {
-    ClassStr = GetNextParamStr (&TextDeviceNode);
-    UsbClass->DeviceClass = (UINT8) Xtoi (ClassStr);
-  } else {
-    UsbClass->DeviceClass = UsbClassText->Class;
-  }
-  if (UsbClassText->SubClassExist) {
-    SubClassStr = GetNextParamStr (&TextDeviceNode);
-    UsbClass->DeviceSubClass = (UINT8) Xtoi (SubClassStr);
-  } else {
-    UsbClass->DeviceSubClass = UsbClassText->SubClass;
-  }  
-
-  ProtocolStr = GetNextParamStr (&TextDeviceNode);
-
-  UsbClass->VendorId        = (UINT16) Xtoi (VIDStr);
-  UsbClass->ProductId       = (UINT16) Xtoi (PIDStr);
-  UsbClass->DeviceProtocol  = (UINT8) Xtoi (ProtocolStr);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) UsbClass;
-}
-
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextUsbClass (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  USB_CLASS_TEXT  UsbClassText;
-
-  UsbClassText.ClassExist    = TRUE;
-  UsbClassText.SubClassExist = TRUE;
-
-  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextUsbAudio (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  USB_CLASS_TEXT  UsbClassText;
-
-  UsbClassText.ClassExist    = FALSE;
-  UsbClassText.Class         = USB_CLASS_AUDIO;
-  UsbClassText.SubClassExist = TRUE;
-
-  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextUsbCDCControl (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  USB_CLASS_TEXT  UsbClassText;
-
-  UsbClassText.ClassExist    = FALSE;
-  UsbClassText.Class         = USB_CLASS_CDCCONTROL;
-  UsbClassText.SubClassExist = TRUE;
-
-  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextUsbHID (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  USB_CLASS_TEXT  UsbClassText;
-
-  UsbClassText.ClassExist    = FALSE;
-  UsbClassText.Class         = USB_CLASS_HID;
-  UsbClassText.SubClassExist = TRUE;
-
-  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextUsbImage (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  USB_CLASS_TEXT  UsbClassText;
-
-  UsbClassText.ClassExist    = FALSE;
-  UsbClassText.Class         = USB_CLASS_IMAGE;
-  UsbClassText.SubClassExist = TRUE;
-
-  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextUsbPrinter (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  USB_CLASS_TEXT  UsbClassText;
-
-  UsbClassText.ClassExist    = FALSE;
-  UsbClassText.Class         = USB_CLASS_PRINTER;
-  UsbClassText.SubClassExist = TRUE;
-
-  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextUsbMassStorage (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  USB_CLASS_TEXT  UsbClassText;
-
-  UsbClassText.ClassExist    = FALSE;
-  UsbClassText.Class         = USB_CLASS_MASS_STORAGE;
-  UsbClassText.SubClassExist = TRUE;
-
-  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextUsbHub (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  USB_CLASS_TEXT  UsbClassText;
-
-  UsbClassText.ClassExist    = FALSE;
-  UsbClassText.Class         = USB_CLASS_HUB;
-  UsbClassText.SubClassExist = TRUE;
-
-  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextUsbCDCData (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  USB_CLASS_TEXT  UsbClassText;
-
-  UsbClassText.ClassExist    = FALSE;
-  UsbClassText.Class         = USB_CLASS_CDCDATA;
-  UsbClassText.SubClassExist = TRUE;
-
-  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextUsbSmartCard (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  USB_CLASS_TEXT  UsbClassText;
-
-  UsbClassText.ClassExist    = FALSE;
-  UsbClassText.Class         = USB_CLASS_SMART_CARD;
-  UsbClassText.SubClassExist = TRUE;
-
-  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextUsbVideo (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  USB_CLASS_TEXT  UsbClassText;
-
-  UsbClassText.ClassExist    = FALSE;
-  UsbClassText.Class         = USB_CLASS_VIDEO;
-  UsbClassText.SubClassExist = TRUE;
-
-  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextUsbDiagnostic (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  USB_CLASS_TEXT  UsbClassText;
-
-  UsbClassText.ClassExist    = FALSE;
-  UsbClassText.Class         = USB_CLASS_DIAGNOSTIC;
-  UsbClassText.SubClassExist = TRUE;
-
-  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextUsbWireless (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  USB_CLASS_TEXT  UsbClassText;
-
-  UsbClassText.ClassExist    = FALSE;
-  UsbClassText.Class         = USB_CLASS_WIRELESS;
-  UsbClassText.SubClassExist = TRUE;
-
-  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextUsbDeviceFirmwareUpdate (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  USB_CLASS_TEXT  UsbClassText;
-
-  UsbClassText.ClassExist    = FALSE;
-  UsbClassText.Class         = USB_CLASS_RESERVE;
-  UsbClassText.SubClassExist = FALSE;
-  UsbClassText.SubClass      = USB_SUBCLASS_FW_UPDATE;
-
-  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextUsbIrdaBridge (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  USB_CLASS_TEXT  UsbClassText;
-
-  UsbClassText.ClassExist    = FALSE;
-  UsbClassText.Class         = USB_CLASS_RESERVE;
-  UsbClassText.SubClassExist = FALSE;
-  UsbClassText.SubClass      = USB_SUBCLASS_IRDA_BRIDGE;
-
-  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextUsbTestAndMeasurement (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  USB_CLASS_TEXT  UsbClassText;
-
-  UsbClassText.ClassExist    = FALSE;
-  UsbClassText.Class         = USB_CLASS_RESERVE;
-  UsbClassText.SubClassExist = FALSE;
-  UsbClassText.SubClass      = USB_SUBCLASS_TEST;
-
-  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextUsbWwid (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16                *VIDStr;
-  CHAR16                *PIDStr;
-  CHAR16                *InterfaceNumStr;
-  USB_WWID_DEVICE_PATH  *UsbWwid;
-
-  VIDStr                    = GetNextParamStr (&TextDeviceNode);
-  PIDStr                    = GetNextParamStr (&TextDeviceNode);
-  InterfaceNumStr           = GetNextParamStr (&TextDeviceNode);
-  UsbWwid                   = (USB_WWID_DEVICE_PATH *) CreateDeviceNode (
-                                                         MESSAGING_DEVICE_PATH,
-                                                         MSG_USB_WWID_DP,
-                                                         sizeof (USB_WWID_DEVICE_PATH)
-                                                         );
-
-  UsbWwid->VendorId         = (UINT16) Xtoi (VIDStr);
-  UsbWwid->ProductId        = (UINT16) Xtoi (PIDStr);
-  UsbWwid->InterfaceNumber  = (UINT16) Xtoi (InterfaceNumStr);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) UsbWwid;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextUnit (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16                          *LunStr;
-  DEVICE_LOGICAL_UNIT_DEVICE_PATH *LogicalUnit;
-
-  LunStr      = GetNextParamStr (&TextDeviceNode);
-  LogicalUnit = (DEVICE_LOGICAL_UNIT_DEVICE_PATH *) CreateDeviceNode (
-                                                      MESSAGING_DEVICE_PATH,
-                                                      MSG_DEVICE_LOGICAL_UNIT_DP,
-                                                      sizeof (DEVICE_LOGICAL_UNIT_DEVICE_PATH)
-                                                      );
-
-  LogicalUnit->Lun  = (UINT8) Xtoi (LunStr);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) LogicalUnit;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextiSCSI (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  UINT16                      Options;
-  CHAR16                      *NameStr;
-  CHAR16                      *PortalGroupStr;
-  CHAR16                      *LunStr;
-  CHAR16                      *HeaderDigestStr;
-  CHAR16                      *DataDigestStr;
-  CHAR16                      *AuthenticationStr;
-  CHAR16                      *ProtocolStr;
-  ISCSI_DEVICE_PATH_WITH_NAME *iSCSI;
-
-  NameStr           = GetNextParamStr (&TextDeviceNode);
-  PortalGroupStr    = GetNextParamStr (&TextDeviceNode);
-  LunStr            = GetNextParamStr (&TextDeviceNode);
-  HeaderDigestStr   = GetNextParamStr (&TextDeviceNode);
-  DataDigestStr     = GetNextParamStr (&TextDeviceNode);
-  AuthenticationStr = GetNextParamStr (&TextDeviceNode);
-  ProtocolStr       = GetNextParamStr (&TextDeviceNode);
-  iSCSI             = (ISCSI_DEVICE_PATH_WITH_NAME *) CreateDeviceNode (
-                                                        MESSAGING_DEVICE_PATH,
-                                                        MSG_ISCSI_DP,
-                                                        sizeof (ISCSI_DEVICE_PATH_WITH_NAME) + (UINT16) (StrLen (NameStr) * 2)
-                                                        );
-
-  StrCpy (iSCSI->iSCSITargetName, NameStr);
-  iSCSI->TargetPortalGroupTag = (UINT16) Xtoi (PortalGroupStr);
-  Xtoi64 (LunStr, &iSCSI->Lun);
-
-  Options = 0x0000;
-  if (StrCmp (HeaderDigestStr, L"CRC32C") == 0) {
-    Options |= 0x0002;
-  }
-
-  if (StrCmp (DataDigestStr, L"CRC32C") == 0) {
-    Options |= 0x0008;
-  }
-
-  if (StrCmp (AuthenticationStr, L"None") == 0) {
-    Options |= 0x0800;
-  }
-
-  if (StrCmp (AuthenticationStr, L"CHAP_UNI") == 0) {
-    Options |= 0x1000;
-  }
-
-  iSCSI->LoginOption      = (UINT16) Options;
-
-  iSCSI->NetworkProtocol  = (UINT16) StrCmp (ProtocolStr, L"TCP");
-  iSCSI->Reserved         = (UINT16) 0;
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) iSCSI;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextHD (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16                *PartitionStr;
-  CHAR16                *TypeStr;
-  CHAR16                *SignatureStr;
-  CHAR16                *StartStr;
-  CHAR16                *SizeStr;
-  UINT32                Signature32;
-  EFI_GUID              SignatureGuid;
-  HARDDRIVE_DEVICE_PATH *Hd;
-
-  PartitionStr        = GetNextParamStr (&TextDeviceNode);
-  TypeStr             = GetNextParamStr (&TextDeviceNode);
-  SignatureStr        = GetNextParamStr (&TextDeviceNode);
-  StartStr            = GetNextParamStr (&TextDeviceNode);
-  SizeStr             = GetNextParamStr (&TextDeviceNode);
-  Hd                  = (HARDDRIVE_DEVICE_PATH *) CreateDeviceNode (
-                                                    MEDIA_DEVICE_PATH,
-                                                    MEDIA_HARDDRIVE_DP,
-                                                    sizeof (HARDDRIVE_DEVICE_PATH)
-                                                    );
-
-  Hd->PartitionNumber = (UINT32) Atoi (PartitionStr);
-
-  ZeroMem (Hd->Signature, 16);
-  Hd->MBRType = (UINT8) 0;
-
-  if (StrCmp (TypeStr, L"None") == 0) {
-    Hd->SignatureType = (UINT8) 0;
-  } else if (StrCmp (TypeStr, L"MBR") == 0) {
-    Hd->SignatureType = SIGNATURE_TYPE_MBR;
-    Hd->MBRType       = 0x01;
-
-    Signature32       = (UINT32) Xtoi (SignatureStr);
-    CopyMem (Hd->Signature, &Signature32, sizeof (UINT32));
-  } else if (StrCmp (TypeStr, L"GUID") == 0) {
-    Hd->SignatureType = SIGNATURE_TYPE_GUID;
-    Hd->MBRType       = 0x02;
-
-    StrToGuid (SignatureStr, &SignatureGuid);
-    CopyMem (Hd->Signature, &SignatureGuid, sizeof (EFI_GUID));
-  } else {
-    Hd->SignatureType = 0xff;
-
-  }
-
-  Xtoi64 (StartStr, &Hd->PartitionStart);
-  Xtoi64 (SizeStr, &Hd->PartitionSize);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) Hd;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextCDROM (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16            *EntryStr;
-  CHAR16            *StartStr;
-  CHAR16            *SizeStr;
-  CDROM_DEVICE_PATH *CDROM;
-
-  EntryStr              = GetNextParamStr (&TextDeviceNode);
-  StartStr              = GetNextParamStr (&TextDeviceNode);
-  SizeStr               = GetNextParamStr (&TextDeviceNode);
-  CDROM                 = (CDROM_DEVICE_PATH *) CreateDeviceNode (
-                                                  MEDIA_DEVICE_PATH,
-                                                  MEDIA_CDROM_DP,
-                                                  sizeof (CDROM_DEVICE_PATH)
-                                                  );
-
-  CDROM->BootEntry      = (UINT32) Xtoi (EntryStr);
-  Xtoi64 (StartStr, &CDROM->PartitionStart);
-  Xtoi64 (SizeStr, &CDROM->PartitionSize);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) CDROM;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextVenMEDIA (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  return ConvertFromTextVendor (
-           TextDeviceNode,
-           MEDIA_DEVICE_PATH,
-           MEDIA_VENDOR_DP
-           );
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextFilePath (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  FILEPATH_DEVICE_PATH  *File;
-
-  File = (FILEPATH_DEVICE_PATH *) CreateDeviceNode (
-                                    MEDIA_DEVICE_PATH,
-                                    MEDIA_FILEPATH_DP,
-                                    sizeof (FILEPATH_DEVICE_PATH) + (UINT16) (StrLen (TextDeviceNode) * 2)
-                                    );
-
-  StrCpy (File->PathName, TextDeviceNode);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) File;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextMedia (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16                      *GuidStr;
-  MEDIA_PROTOCOL_DEVICE_PATH  *Media;
-
-  GuidStr = GetNextParamStr (&TextDeviceNode);
-  Media   = (MEDIA_PROTOCOL_DEVICE_PATH *) CreateDeviceNode (
-                                             MEDIA_DEVICE_PATH,
-                                             MEDIA_PROTOCOL_DP,
-                                             sizeof (MEDIA_PROTOCOL_DEVICE_PATH)
-                                             );
-
-  StrToGuid (GuidStr, &Media->Protocol);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) Media;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DevPathFromTextBBS (
-  IN CHAR16 *TextDeviceNode
-  )
-{
-  CHAR16              *TypeStr;
-  CHAR16              *IdStr;
-  CHAR16              *FlagsStr;
-  UINT8               *AsciiStr;
-  BBS_BBS_DEVICE_PATH *Bbs;
-
-  TypeStr   = GetNextParamStr (&TextDeviceNode);
-  IdStr     = GetNextParamStr (&TextDeviceNode);
-  FlagsStr  = GetNextParamStr (&TextDeviceNode);
-  Bbs       = (BBS_BBS_DEVICE_PATH *) CreateDeviceNode (
-                                        BBS_DEVICE_PATH,
-                                        BBS_BBS_DP,
-                                        sizeof (BBS_BBS_DEVICE_PATH) + (UINT16) (StrLen (IdStr))
-                                        );
-
-  if (StrCmp (TypeStr, L"Floppy") == 0) {
-    Bbs->DeviceType = BBS_TYPE_FLOPPY;
-  } else if (StrCmp (TypeStr, L"HD") == 0) {
-    Bbs->DeviceType = BBS_TYPE_HARDDRIVE;
-  } else if (StrCmp (TypeStr, L"CDROM") == 0) {
-    Bbs->DeviceType = BBS_TYPE_CDROM;
-  } else if (StrCmp (TypeStr, L"PCMCIA") == 0) {
-    Bbs->DeviceType = BBS_TYPE_PCMCIA;
-  } else if (StrCmp (TypeStr, L"USB") == 0) {
-    Bbs->DeviceType = BBS_TYPE_USB;
-  } else if (StrCmp (TypeStr, L"Network") == 0) {
-    Bbs->DeviceType = BBS_TYPE_EMBEDDED_NETWORK;
-  } else {
-    Bbs->DeviceType = BBS_TYPE_UNKNOWN;
-  }
-
-  AsciiStr = (UINT8 *) Bbs->String;
-  StrToAscii (IdStr, (CHAR8 **) &AsciiStr);
-
-  Bbs->StatusFlag = (UINT16) Xtoi (FlagsStr);
-
-  return (EFI_DEVICE_PATH_PROTOCOL *) Bbs;
-}
-
-GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE DevPathFromTextTable[] = {
-  {L"Pci", DevPathFromTextPci},
-  {L"PcCard", DevPathFromTextPcCard},
-  {L"MemoryMapped", DevPathFromTextMemoryMapped},
-  {L"VenHw", DevPathFromTextVenHw},
-  {L"Ctrl", DevPathFromTextCtrl},
-  {L"Acpi", DevPathFromTextAcpi},
-  {L"PciRoot", DevPathFromTextPciRoot},
-  {L"Floppy", DevPathFromTextFloppy},
-  {L"Keyboard", DevPathFromTextKeyboard},
-  {L"Serial", DevPathFromTextSerial},
-  {L"ParallelPort", DevPathFromTextParallelPort},
-  {L"AcpiEx", DevPathFromTextAcpiEx},
-  {L"AcpiExp", DevPathFromTextAcpiExp},
-  {L"Ata", DevPathFromTextAta},
-  {L"Scsi", DevPathFromTextScsi},
-  {L"Fibre", DevPathFromTextFibre},
-  {L"I1394", DevPathFromText1394},
-  {L"USB", DevPathFromTextUsb},
-  {L"I2O", DevPathFromTextI2O},
-  {L"Infiniband", DevPathFromTextInfiniband},
-  {L"VenMsg", DevPathFromTextVenMsg},
-  {L"VenPcAnsi", DevPathFromTextVenPcAnsi},
-  {L"VenVt100", DevPathFromTextVenVt100},
-  {L"VenVt100Plus", DevPathFromTextVenVt100Plus},
-  {L"VenUtf8", DevPathFromTextVenUtf8},
-  {L"UartFlowCtrl", DevPathFromTextUartFlowCtrl},
-  {L"SAS", DevPathFromTextSAS},
-  {L"DebugPort", DevPathFromTextDebugPort},
-  {L"MAC", DevPathFromTextMAC},
-  {L"IPv4", DevPathFromTextIPv4},
-  {L"IPv6", DevPathFromTextIPv6},
-  {L"Uart", DevPathFromTextUart},
-  {L"UsbClass", DevPathFromTextUsbClass},
-  {L"UsbAudio", DevPathFromTextUsbAudio},
-  {L"UsbCDCControl", DevPathFromTextUsbCDCControl},
-  {L"UsbHID", DevPathFromTextUsbHID},
-  {L"UsbImage", DevPathFromTextUsbImage},
-  {L"UsbPrinter", DevPathFromTextUsbPrinter},
-  {L"UsbMassStorage", DevPathFromTextUsbMassStorage},
-  {L"UsbHub", DevPathFromTextUsbHub},
-  {L"UsbCDCData", DevPathFromTextUsbCDCData},
-  {L"UsbSmartCard", DevPathFromTextUsbSmartCard},
-  {L"UsbVideo", DevPathFromTextUsbVideo},
-  {L"UsbDiagnostic", DevPathFromTextUsbDiagnostic},
-  {L"UsbWireless", DevPathFromTextUsbWireless},
-  {L"UsbDeviceFirmwareUpdate", DevPathFromTextUsbDeviceFirmwareUpdate},
-  {L"UsbIrdaBridge", DevPathFromTextUsbIrdaBridge},
-  {L"UsbTestAndMeasurement", DevPathFromTextUsbTestAndMeasurement},
-  {L"UsbWwid", DevPathFromTextUsbWwid},
-  {L"Unit", DevPathFromTextUnit},
-  {L"iSCSI", DevPathFromTextiSCSI},
-  {L"HD", DevPathFromTextHD},
-  {L"CDROM", DevPathFromTextCDROM},
-  {L"VenMEDIA", DevPathFromTextVenMEDIA},
-  {L"Media", DevPathFromTextMedia},
-  {L"BBS", DevPathFromTextBBS},
-  {NULL, NULL}
-};
-
-EFI_DEVICE_PATH_PROTOCOL *
-ConvertTextToDeviceNode (
-  IN CONST CHAR16 *TextDeviceNode
-  )
-/*++
-
-  Routine Description:
-    Convert text to the binary representation of a device node.
-
-  Arguments:
-    TextDeviceNode   -   TextDeviceNode points to the text representation of a device
-                         node. Conversion starts with the first character and continues
-                         until the first non-device node character.
-
-  Returns:
-    A pointer        -   Pointer to the EFI device node.
-    NULL             -   If TextDeviceNode is NULL or there was insufficient memory or text unsupported.
-
---*/
-{
-  EFI_DEVICE_PATH_PROTOCOL * (*DumpNode) (CHAR16 *);
-  CHAR16                   *ParamStr;
-  EFI_DEVICE_PATH_PROTOCOL *DeviceNode;
-  CHAR16                   *DeviceNodeStr;
-  UINTN                    Index;
-
-  if ((TextDeviceNode == NULL) || (IS_NULL (*TextDeviceNode))) {
-    return NULL;
-  }
-
-  ParamStr      = NULL;
-  DumpNode      = NULL;
-  DeviceNodeStr = StrDuplicate (TextDeviceNode);
-
-  for (Index = 0; DevPathFromTextTable[Index].Function; Index++) {
-    ParamStr = GetParamByNodeName (DeviceNodeStr, DevPathFromTextTable[Index].DevicePathNodeText);
-    if (ParamStr != NULL) {
-      DumpNode = DevPathFromTextTable[Index].Function;
-      break;
-    }
-  }
-
-  if (DumpNode == NULL) {
-    //
-    // A file path
-    //
-    DumpNode = DevPathFromTextFilePath;
-    DeviceNode = DumpNode (DeviceNodeStr);
-  } else {
-    DeviceNode = DumpNode (ParamStr);
-    gBS->FreePool (ParamStr);
-  }
-
-  gBS->FreePool (DeviceNodeStr);
-
-  return DeviceNode;
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-ConvertTextToDevicePath (
-  IN CONST CHAR16 *TextDevicePath
-  )
-/*++
-
-  Routine Description:
-    Convert text to the binary representation of a device path.
-
-  Arguments:
-    TextDevicePath   -   TextDevicePath points to the text representation of a device
-                         path. Conversion starts with the first character and continues
-                         until the first non-device node character.
-
-  Returns:
-    A pointer        -   Pointer to the allocated device path.
-    NULL             -   If TextDeviceNode is NULL or there was insufficient memory.
-
---*/
-{
-  EFI_DEVICE_PATH_PROTOCOL * (*DumpNode) (CHAR16 *);
-  CHAR16                   *ParamStr;
-  EFI_DEVICE_PATH_PROTOCOL *DeviceNode;
-  UINTN                    Index;
-  EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;
-  CHAR16                   *DevicePathStr;
-  CHAR16                   *Str;
-  CHAR16                   *DeviceNodeStr;
-  UINT8                    IsInstanceEnd;
-  EFI_DEVICE_PATH_PROTOCOL *DevicePath;
-
-  if ((TextDevicePath == NULL) || (IS_NULL (*TextDevicePath))) {
-    return NULL;
-  }
-
-  DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);
-  SetDevicePathEndNode (DevicePath);
-
-  ParamStr            = NULL;
-  DeviceNodeStr       = NULL;
-  DevicePathStr       = StrDuplicate (TextDevicePath);
-
-  Str                 = DevicePathStr;
-  while ((DeviceNodeStr = GetNextDeviceNodeStr (&Str, &IsInstanceEnd)) != NULL) {
-    DumpNode = NULL;
-    for (Index = 0; DevPathFromTextTable[Index].Function; Index++) {
-      ParamStr = GetParamByNodeName (DeviceNodeStr, DevPathFromTextTable[Index].DevicePathNodeText);
-      if (ParamStr != NULL) {
-        DumpNode = DevPathFromTextTable[Index].Function;
-        break;
-      }
-    }
-
-    if (DumpNode == NULL) {
-      //
-      // A file path
-      //
-      DumpNode  = DevPathFromTextFilePath;
-      DeviceNode = DumpNode (DeviceNodeStr);
-    } else {
-      DeviceNode = DumpNode (ParamStr);
-      gBS->FreePool (ParamStr);
-    }
-
-    NewDevicePath = AppendDeviceNodeProtocolInterface (DevicePath, DeviceNode);
-    gBS->FreePool (DevicePath);
-    gBS->FreePool (DeviceNode);
-    DevicePath = NewDevicePath;
-
-    if (IsInstanceEnd) {
-      DeviceNode = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);
-      SetDevicePathInstanceEndNode (DeviceNode);
-
-      NewDevicePath = AppendDeviceNodeProtocolInterface (DevicePath, DeviceNode);
-      gBS->FreePool (DevicePath);
-      gBS->FreePool (DeviceNode);
-      DevicePath = NewDevicePath;
-    }
-  }
-
-  gBS->FreePool (DevicePathStr);
-  return DevicePath;
-}
+/*++\r
+\r
+Copyright (c) 2006, Intel Corporation                                                         \r
+All rights reserved. This program and the accompanying materials                          \r
+are licensed and made available under the terms and conditions of the BSD License         \r
+which accompanies this distribution.  The full text of the license may be found at        \r
+http://opensource.org/licenses/bsd-license.php                                            \r
+                                                                                          \r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+\r
+Module Name:\r
+\r
+  DevicePathFromText.c\r
+\r
+Abstract:\r
+\r
+  DevicePathFromText protocol as defined in the UEFI 2.0 specification.\r
+\r
+--*/\r
+\r
+#include "DevicePath.h"\r
+\r
+CHAR16 *\r
+StrDuplicate (\r
+  IN CONST CHAR16  *Src\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Duplicate a string\r
+\r
+  Arguments:\r
+    Src - Source string\r
+\r
+  Returns:\r
+    Duplicated string\r
+\r
+--*/\r
+{\r
+  UINTN   Length;\r
+  CHAR16  *ReturnStr;\r
+\r
+  Length = StrLen ((CHAR16 *) Src);\r
+\r
+  ReturnStr = AllocateCopyPool ((Length + 1) * sizeof (CHAR16), (VOID *) Src);\r
+\r
+  return ReturnStr;\r
+}\r
+\r
+CHAR16 *\r
+GetParamByNodeName (\r
+  IN CHAR16 *Str,\r
+  IN CHAR16 *NodeName\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Get parameter in a pair of parentheses follow the given node name.\r
+    For example, given the "Pci(0,1)" and NodeName "Pci", it returns "0,1".\r
+\r
+  Arguments:\r
+    Str      - Device Path Text\r
+    NodeName - Name of the node\r
+\r
+  Returns:\r
+    Parameter text for the node\r
+\r
+--*/\r
+{\r
+  CHAR16  *ParamStr;\r
+  CHAR16  *StrPointer;\r
+  UINTN   NodeNameLength;\r
+  UINTN   ParameterLength;\r
+\r
+  //\r
+  // Check whether the node name matchs\r
+  //\r
+  NodeNameLength = StrLen (NodeName);\r
+  if (CompareMem (Str, NodeName, NodeNameLength * sizeof (CHAR16)) != 0) {\r
+    return NULL;\r
+  }\r
+\r
+  ParamStr = Str + NodeNameLength;\r
+  if (!IS_LEFT_PARENTH (*ParamStr)) {\r
+    return NULL;\r
+  }\r
+\r
+  //\r
+  // Skip the found '(' and find first occurrence of ')'\r
+  //\r
+  ParamStr++;\r
+  ParameterLength = 0;\r
+  StrPointer = ParamStr;\r
+  while (!IS_NULL (*StrPointer)) {\r
+    if (IS_RIGHT_PARENTH (*StrPointer)) {\r
+      break;\r
+    }\r
+    StrPointer++;\r
+    ParameterLength++;\r
+  }\r
+  if (IS_NULL (*StrPointer)) {\r
+    //\r
+    // ')' not found\r
+    //\r
+    return NULL;\r
+  }\r
+\r
+  ParamStr = AllocateCopyPool ((ParameterLength + 1) * sizeof (CHAR16), ParamStr);\r
+  if (ParamStr == NULL) {\r
+    return NULL;\r
+  }\r
+  //\r
+  // Terminate the parameter string\r
+  //\r
+  ParamStr[ParameterLength] = L'\0';\r
+\r
+  return ParamStr;\r
+}\r
+\r
+CHAR16 *\r
+SplitStr (\r
+  IN OUT CHAR16 **List,\r
+  IN     CHAR16 Separator\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Get current sub-string from a string list, before return\r
+    the list header is moved to next sub-string. The sub-string is separated\r
+    by the specified character. For example, the separator is ',', the string\r
+    list is "2,0,3", it returns "2", the remain list move to "2,3"\r
+\r
+  Arguments:\r
+    List       - A string list separated by the specified separator\r
+    Separator  - The separator character\r
+\r
+  Returns:\r
+    pointer    - The current sub-string\r
+\r
+--*/\r
+{\r
+  CHAR16  *Str;\r
+  CHAR16  *ReturnStr;\r
+\r
+  Str = *List;\r
+  ReturnStr = Str;\r
+\r
+  if (IS_NULL (*Str)) {\r
+    return ReturnStr;\r
+  }\r
+\r
+  //\r
+  // Find first occurrence of the separator\r
+  //\r
+  while (!IS_NULL (*Str)) {\r
+    if (*Str == Separator) {\r
+      break;\r
+    }\r
+    Str++;\r
+  }\r
+\r
+  if (*Str == Separator) {\r
+    //\r
+    // Find a sub-string, terminate it\r
+    //\r
+    *Str = L'\0';\r
+    Str++;\r
+  }\r
+\r
+  //\r
+  // Move to next sub-string\r
+  //\r
+  *List = Str;\r
+\r
+  return ReturnStr;\r
+}\r
+\r
+CHAR16 *\r
+GetNextParamStr (\r
+  IN OUT CHAR16 **List\r
+  )\r
+{\r
+  //\r
+  // The separator is comma\r
+  //\r
+  return SplitStr (List, L',');\r
+}\r
+\r
+CHAR16 *\r
+GetNextDeviceNodeStr (\r
+  IN OUT CHAR16   **DevicePath,\r
+  OUT    BOOLEAN  *IsInstanceEnd\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Get one device node from entire device path text.\r
+\r
+  Arguments:\r
+    Str           - The entire device path text string\r
+    IsInstanceEnd - This node is the end of a device path instance\r
+\r
+  Returns:\r
+    a pointer     - A device node text\r
+    NULL          - No more device node available\r
+\r
+--*/\r
+{\r
+  CHAR16  *Str;\r
+  CHAR16  *ReturnStr;\r
+  UINTN   ParenthesesStack;\r
+\r
+  Str = *DevicePath;\r
+  if (IS_NULL (*Str)) {\r
+    return NULL;\r
+  }\r
+\r
+  //\r
+  // Skip the leading '/', '(', ')' and ','\r
+  //\r
+  while (!IS_NULL (*Str)) {\r
+    if (!IS_SLASH (*Str) &&\r
+        !IS_COMMA (*Str) &&\r
+        !IS_LEFT_PARENTH (*Str) &&\r
+        !IS_RIGHT_PARENTH (*Str)) {\r
+      break;\r
+    }\r
+    Str++;\r
+  }\r
+\r
+  ReturnStr = Str;\r
+\r
+  //\r
+  // Scan for the separator of this device node, '/' or ','\r
+  //\r
+  ParenthesesStack = 0;\r
+  while (!IS_NULL (*Str)) {\r
+    if ((IS_COMMA (*Str) || IS_SLASH (*Str)) && (ParenthesesStack == 0)) {\r
+      break;\r
+    }\r
+\r
+    if (IS_LEFT_PARENTH (*Str)) {\r
+      ParenthesesStack++;\r
+    } else if (IS_RIGHT_PARENTH (*Str)) {\r
+      ParenthesesStack--;\r
+    }\r
+\r
+    Str++;\r
+  }\r
+\r
+  if (ParenthesesStack != 0) {\r
+    //\r
+    // The '(' doesn't pair with ')', invalid device path text\r
+    //\r
+    return NULL;\r
+  }\r
+\r
+  if (IS_COMMA (*Str)) {\r
+    *IsInstanceEnd = TRUE;\r
+    *Str = L'\0';\r
+    Str++;\r
+  } else {\r
+    *IsInstanceEnd = FALSE;\r
+    if (!IS_NULL (*Str)) {\r
+      *Str = L'\0';\r
+      Str++;\r
+    }\r
+  }\r
+\r
+  *DevicePath = Str;\r
+\r
+  return ReturnStr;\r
+}\r
+\r
+BOOLEAN\r
+IsHexDigit (\r
+  OUT UINT8      *Digit,\r
+  IN  CHAR16      Char\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Determines if a Unicode character is a hexadecimal digit.\r
+    The test is case insensitive.\r
+\r
+  Arguments:\r
+    Digit - Pointer to byte that receives the value of the hex character.\r
+    Char  - Unicode character to test.\r
+\r
+  Returns:\r
+    TRUE  - If the character is a hexadecimal digit.\r
+    FALSE - Otherwise.\r
+\r
+--*/\r
+{\r
+  if ((Char >= L'0') && (Char <= L'9')) {\r
+    *Digit = (UINT8) (Char - L'0');\r
+    return TRUE;\r
+  }\r
+\r
+  if ((Char >= L'A') && (Char <= L'F')) {\r
+    *Digit = (UINT8) (Char - L'A' + 0x0A);\r
+    return TRUE;\r
+  }\r
+\r
+  if ((Char >= L'a') && (Char <= L'f')) {\r
+    *Digit = (UINT8) (Char - L'a' + 0x0A);\r
+    return TRUE;\r
+  }\r
+\r
+  return FALSE;\r
+}\r
+\r
+CHAR16\r
+NibbleToHexChar (\r
+  IN UINT8      Nibble\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Converts the low nibble of a byte  to hex unicode character.\r
+\r
+  Arguments:\r
+    Nibble - lower nibble of a byte.\r
+\r
+  Returns:\r
+    Hex unicode character.\r
+\r
+--*/\r
+{\r
+  Nibble &= 0x0F;\r
+  if (Nibble <= 0x9) {\r
+    return (CHAR16)(Nibble + L'0');\r
+  }\r
+\r
+  return (CHAR16)(Nibble - 0xA + L'A');\r
+}\r
+\r
+EFI_STATUS\r
+HexStringToBuf (\r
+  IN OUT UINT8                     *Buf,   \r
+  IN OUT UINTN                     *Len,\r
+  IN     CHAR16                    *Str,\r
+  OUT    UINTN                     *ConvertedStrLen  OPTIONAL\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Converts Unicode string to binary buffer.\r
+    The conversion may be partial.\r
+    The first character in the string that is not hex digit stops the conversion.\r
+    At a minimum, any blob of data could be represented as a hex string.\r
+\r
+  Arguments:\r
+    Buf    - Pointer to buffer that receives the data.\r
+    Len    - Length in bytes of the buffer to hold converted data.\r
+                If routine return with EFI_SUCCESS, containing length of converted data.\r
+                If routine return with EFI_BUFFER_TOO_SMALL, containg length of buffer desired.\r
+    Str    - String to be converted from.\r
+    ConvertedStrLen - Length of the Hex String consumed.\r
+\r
+  Returns:\r
+    EFI_SUCCESS: Routine Success.\r
+    EFI_BUFFER_TOO_SMALL: The buffer is too small to hold converted data.\r
+    EFI_\r
+\r
+--*/\r
+{\r
+  UINTN       HexCnt;\r
+  UINTN       Idx;\r
+  UINTN       BufferLength;\r
+  UINT8       Digit;\r
+  UINT8       Byte;\r
+\r
+  //\r
+  // Find out how many hex characters the string has.\r
+  //\r
+  for (Idx = 0, HexCnt = 0; IsHexDigit (&Digit, Str[Idx]); Idx++, HexCnt++);\r
+\r
+  if (HexCnt == 0) {\r
+    *Len = 0;\r
+    return EFI_SUCCESS;\r
+  }\r
+  //\r
+  // Two Unicode characters make up 1 buffer byte. Round up.\r
+  //\r
+  BufferLength = (HexCnt + 1) / 2; \r
+\r
+  //\r
+  // Test if  buffer is passed enough.\r
+  //\r
+  if (BufferLength > (*Len)) {\r
+    *Len = BufferLength;\r
+    return EFI_BUFFER_TOO_SMALL;\r
+  }\r
+\r
+  *Len = BufferLength;\r
+\r
+  for (Idx = 0; Idx < HexCnt; Idx++) {\r
+\r
+    IsHexDigit (&Digit, Str[HexCnt - 1 - Idx]);\r
+\r
+    //\r
+    // For odd charaters, write the lower nibble for each buffer byte,\r
+    // and for even characters, the upper nibble.\r
+    //\r
+    if ((Idx & 1) == 0) {\r
+      Byte = Digit;\r
+    } else {\r
+      Byte = Buf[Idx / 2];\r
+      Byte &= 0x0F;\r
+      Byte |= Digit << 4;\r
+    }\r
+\r
+    Buf[Idx / 2] = Byte;\r
+  }\r
+\r
+  if (ConvertedStrLen != NULL) {\r
+    *ConvertedStrLen = HexCnt;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+BufToHexString (\r
+  IN OUT CHAR16                    *Str,\r
+  IN OUT UINTN                     *HexStringBufferLength,\r
+  IN     UINT8                     *Buf,\r
+  IN     UINTN                     Len\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Converts binary buffer to Unicode string.\r
+    At a minimum, any blob of data could be represented as a hex string.\r
+\r
+  Arguments:\r
+    Str - Pointer to the string.\r
+    HexStringBufferLength - Length in bytes of buffer to hold the hex string. Includes tailing '\0' character.\r
+                                        If routine return with EFI_SUCCESS, containing length of hex string buffer.\r
+                                        If routine return with EFI_BUFFER_TOO_SMALL, containg length of hex string buffer desired.\r
+    Buf - Buffer to be converted from.\r
+    Len - Length in bytes of the buffer to be converted.\r
+\r
+  Returns:\r
+    EFI_SUCCESS: Routine success.\r
+    EFI_BUFFER_TOO_SMALL: The hex string buffer is too small.\r
+\r
+--*/\r
+{\r
+  UINTN       Idx;\r
+  UINT8       Byte;\r
+  UINTN       StrLen;\r
+\r
+  //\r
+  // Make sure string is either passed or allocate enough.\r
+  // It takes 2 Unicode characters (4 bytes) to represent 1 byte of the binary buffer.\r
+  // Plus the Unicode termination character.\r
+  //\r
+  StrLen = Len * 2;\r
+  if (StrLen > ((*HexStringBufferLength) - 1)) {\r
+    *HexStringBufferLength = StrLen + 1;\r
+    return EFI_BUFFER_TOO_SMALL;\r
+  }\r
+\r
+  *HexStringBufferLength = StrLen + 1;\r
+  //\r
+  // Ends the string.\r
+  //\r
+  Str[StrLen] = L'\0'; \r
+\r
+  for (Idx = 0; Idx < Len; Idx++) {\r
+\r
+    Byte = Buf[Idx];\r
+    Str[StrLen - 1 - Idx * 2] = NibbleToHexChar (Byte);\r
+    Str[StrLen - 2 - Idx * 2] = NibbleToHexChar ((UINT8)(Byte >> 4));\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+CHAR16 *\r
+TrimHexStr (\r
+  IN CHAR16  *Str\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Skip the leading white space and '0x' or '0X' of a hex string\r
+\r
+  Arguments:\r
+    Str  -  The hex string\r
+\r
+  Returns:\r
+\r
+--*/\r
+{\r
+  //\r
+  // skip preceeding white space\r
+  //\r
+  while (*Str && *Str == ' ') {\r
+    Str += 1;\r
+  }\r
+  //\r
+  // skip preceeding zeros\r
+  //\r
+  while (*Str && *Str == '0') {\r
+    Str += 1;\r
+  }\r
+  //\r
+  // skip preceeding white space\r
+  //\r
+  if (*Str && (*Str == 'x' || *Str == 'X')) {\r
+    Str += 1;\r
+  }\r
+\r
+  return Str;\r
+}\r
+\r
+UINTN\r
+Xtoi (\r
+  IN CHAR16  *Str\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Convert hex string to uint\r
+\r
+Arguments:\r
+\r
+  Str  -  The string\r
+  \r
+Returns:\r
+\r
+--*/\r
+{\r
+  UINTN   Rvalue;\r
+  UINTN   Length;\r
+\r
+  ASSERT (Str != NULL);\r
+\r
+  //\r
+  // convert hex digits\r
+  //\r
+  Rvalue = 0;\r
+  Length = sizeof (UINTN);\r
+  HexStringToBuf ((UINT8 *) &Rvalue, &Length, TrimHexStr (Str), NULL);\r
+\r
+  return Rvalue;\r
+}\r
+\r
+VOID\r
+Xtoi64 (\r
+  IN CHAR16  *Str,\r
+  IN UINT64  *Data\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Convert hex string to 64 bit data.\r
+\r
+Arguments:\r
+\r
+  Str  -  The string\r
+  \r
+Returns:\r
+\r
+--*/\r
+{\r
+  UINTN  Length;\r
+\r
+  *Data  = 0;\r
+  Length = sizeof (UINT64);\r
+  HexStringToBuf ((UINT8 *) Data, &Length, TrimHexStr (Str), NULL);\r
+}\r
+\r
+UINTN\r
+Atoi (\r
+  IN CHAR16  *str\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Convert decimal string to uint\r
+\r
+Arguments:\r
+\r
+  Str  -  The string\r
+  \r
+Returns:\r
+\r
+--*/\r
+{\r
+  UINTN   Rvalue;\r
+  CHAR16  Char;\r
+  UINTN   High;\r
+  UINTN   Low;\r
+\r
+  ASSERT (str != NULL);\r
+\r
+  High = (UINTN) -1 / 10;\r
+  Low  = (UINTN) -1 % 10;\r
+  //\r
+  // skip preceeding white space\r
+  //\r
+  while (*str && *str == ' ') {\r
+    str += 1;\r
+  }\r
+  //\r
+  // convert digits\r
+  //\r
+  Rvalue = 0;\r
+  Char = *(str++);\r
+  while (Char) {\r
+    if (Char >= '0' && Char <= '9') {\r
+      if ((Rvalue > High || Rvalue == High) && (Char - '0' > (INTN) Low)) {\r
+        return (UINTN) -1;\r
+      }\r
+\r
+      Rvalue = (Rvalue * 10) + Char - '0';\r
+    } else {\r
+      break;\r
+    }\r
+\r
+    Char = *(str++);\r
+  }\r
+\r
+  return Rvalue;\r
+}\r
+\r
+EFI_STATUS \r
+StrToBuf (\r
+  OUT UINT8    *Buf,\r
+  IN  UINTN    BufferLength,\r
+  IN  CHAR16   *Str\r
+  )\r
+{\r
+  UINTN       Index;\r
+  UINTN       StrLength;\r
+  UINT8       Digit;\r
+  UINT8       Byte;\r
+\r
+  //\r
+  // Two hex char make up one byte\r
+  //\r
+  StrLength = BufferLength * sizeof (CHAR16);\r
+\r
+  for(Index = 0; Index < StrLength; Index++, Str++) {\r
+\r
+    IsHexDigit (&Digit, *Str);\r
+\r
+    //\r
+    // For odd charaters, write the upper nibble for each buffer byte,\r
+    // and for even characters, the lower nibble.\r
+    //\r
+    if ((Index & 1) == 0) {\r
+      Byte = Digit << 4;\r
+    } else {\r
+      Byte = Buf[Index / 2];\r
+      Byte &= 0xF0;\r
+      Byte |= Digit;\r
+    }\r
+\r
+    Buf[Index / 2] = Byte;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+StrToGuid (\r
+  IN  CHAR16   *Str,\r
+  OUT EFI_GUID *Guid\r
+  )\r
+{\r
+  UINTN       BufferLength;\r
+  UINTN       ConvertedStrLen;\r
+  EFI_STATUS  Status;\r
+\r
+  BufferLength = sizeof (Guid->Data1);\r
+  Status = HexStringToBuf ((UINT8 *) &Guid->Data1, &BufferLength, Str, &ConvertedStrLen);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+  Str += ConvertedStrLen;\r
+  if (IS_HYPHEN (*Str)) {\r
+    Str++;   \r
+  } else {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  BufferLength = sizeof (Guid->Data2);\r
+  Status = HexStringToBuf ((UINT8 *) &Guid->Data2, &BufferLength, Str, &ConvertedStrLen);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+  Str += ConvertedStrLen;\r
+  if (IS_HYPHEN (*Str)) {\r
+    Str++;\r
+  } else {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  BufferLength = sizeof (Guid->Data3);\r
+  Status = HexStringToBuf ((UINT8 *) &Guid->Data3, &BufferLength, Str, &ConvertedStrLen);\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+  Str += ConvertedStrLen;\r
+  if (IS_HYPHEN (*Str)) {\r
+    Str++;\r
+  } else {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  StrToBuf (&Guid->Data4[0], 2, Str);\r
+  //\r
+  // Skip 2 byte hex chars\r
+  //\r
+  Str += 2 * 2;\r
+\r
+  if (IS_HYPHEN (*Str)) {\r
+    Str++;\r
+  } else {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+  StrToBuf (&Guid->Data4[2], 6, Str);\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+VOID\r
+StrToIPv4Addr (\r
+  IN OUT CHAR16           **Str,\r
+  OUT    EFI_IPv4_ADDRESS *IPv4Addr\r
+  )\r
+{\r
+  UINTN  Index;\r
+\r
+  for (Index = 0; Index < 4; Index++) {\r
+    IPv4Addr->Addr[Index] = (UINT8) Atoi (SplitStr (Str, L'.'));\r
+  }\r
+}\r
+\r
+VOID\r
+StrToIPv6Addr (\r
+  IN OUT CHAR16           **Str,\r
+  OUT    EFI_IPv6_ADDRESS *IPv6Addr\r
+  )\r
+{\r
+  UINTN  Index;\r
+  UINT16 Data;\r
+\r
+  for (Index = 0; Index < 8; Index++) {\r
+    Data = (UINT16) Xtoi (SplitStr (Str, L':'));\r
+    IPv6Addr->Addr[Index * 2] = (UINT8) (Data >> 8);\r
+    IPv6Addr->Addr[Index * 2 + 1] = (UINT8) (Data & 0xff);\r
+  }\r
+}\r
+\r
+VOID\r
+StrToAscii (\r
+  IN     CHAR16 *Str,\r
+  IN OUT CHAR8  **AsciiStr\r
+  )\r
+{\r
+  CHAR8 *Dest;\r
+\r
+  Dest = *AsciiStr;\r
+  while (!IS_NULL (*Str)) {\r
+    *(Dest++) = (CHAR8) *(Str++);\r
+  }\r
+  *Dest = 0;\r
+\r
+  //\r
+  // Return the string next to it\r
+  //\r
+  *AsciiStr = Dest + 1;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextPci (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16          *FunctionStr;\r
+  CHAR16          *DeviceStr;\r
+  PCI_DEVICE_PATH *Pci;\r
+\r
+  FunctionStr = GetNextParamStr (&TextDeviceNode);\r
+  DeviceStr   = GetNextParamStr (&TextDeviceNode);\r
+  Pci         = (PCI_DEVICE_PATH *) CreateDeviceNode (\r
+                                      HARDWARE_DEVICE_PATH,\r
+                                      HW_PCI_DP,\r
+                                      sizeof (PCI_DEVICE_PATH)\r
+                                      );\r
+\r
+  Pci->Function = (UINT8) Xtoi (FunctionStr);\r
+  Pci->Device   = (UINT8) Xtoi (DeviceStr);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Pci;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextPcCard (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16              *FunctionNumberStr;\r
+  PCCARD_DEVICE_PATH  *Pccard;\r
+\r
+  FunctionNumberStr = GetNextParamStr (&TextDeviceNode);\r
+  Pccard            = (PCCARD_DEVICE_PATH *) CreateDeviceNode (\r
+                                               HARDWARE_DEVICE_PATH,\r
+                                               HW_PCCARD_DP,\r
+                                               sizeof (PCCARD_DEVICE_PATH)\r
+                                               );\r
+\r
+  Pccard->FunctionNumber  = (UINT8) Xtoi (FunctionNumberStr);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Pccard;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextMemoryMapped (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16              *StartingAddressStr;\r
+  CHAR16              *EndingAddressStr;\r
+  MEMMAP_DEVICE_PATH  *MemMap;\r
+\r
+  StartingAddressStr = GetNextParamStr (&TextDeviceNode);\r
+  EndingAddressStr   = GetNextParamStr (&TextDeviceNode);\r
+  MemMap             = (MEMMAP_DEVICE_PATH *) CreateDeviceNode (\r
+                                               HARDWARE_DEVICE_PATH,\r
+                                               HW_MEMMAP_DP,\r
+                                               sizeof (MEMMAP_DEVICE_PATH)\r
+                                               );\r
+\r
+  MemMap->MemoryType  = 0;\r
+\r
+  Xtoi64 (StartingAddressStr, &MemMap->StartingAddress);\r
+  Xtoi64 (EndingAddressStr, &MemMap->EndingAddress);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) MemMap;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+ConvertFromTextVendor (\r
+  IN CHAR16 *TextDeviceNode,\r
+  IN UINT8  Type,\r
+  IN UINT8  SubType\r
+  )\r
+{\r
+  CHAR16              *GuidStr;\r
+  CHAR16              *DataStr;\r
+  UINTN               Length;\r
+  VENDOR_DEVICE_PATH  *Vendor;\r
+\r
+  GuidStr = GetNextParamStr (&TextDeviceNode);\r
+\r
+  DataStr = GetNextParamStr (&TextDeviceNode);\r
+  Length  = StrLen (DataStr);\r
+  //\r
+  // Two hex characters make up 1 buffer byte\r
+  //\r
+  Length  = (Length + 1) / 2;\r
+\r
+  Vendor  = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
+                                     Type,\r
+                                     SubType,\r
+                                     sizeof (VENDOR_DEVICE_PATH) + (UINT16) Length\r
+                                     );\r
+\r
+  StrToGuid (GuidStr, &Vendor->Guid);\r
+  StrToBuf (((UINT8 *) Vendor) + sizeof (VENDOR_DEVICE_PATH), Length, DataStr);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextVenHw (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  return ConvertFromTextVendor (\r
+           TextDeviceNode,\r
+           HARDWARE_DEVICE_PATH,\r
+           HW_VENDOR_DP\r
+           );\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextCtrl (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                  *ControllerStr;\r
+  CONTROLLER_DEVICE_PATH  *Controller;\r
+\r
+  ControllerStr = GetNextParamStr (&TextDeviceNode);\r
+  Controller    = (CONTROLLER_DEVICE_PATH *) CreateDeviceNode (\r
+                                               HARDWARE_DEVICE_PATH,\r
+                                               HW_CONTROLLER_DP,\r
+                                               sizeof (CONTROLLER_DEVICE_PATH)\r
+                                               );\r
+  Controller->ControllerNumber = (UINT32) Xtoi (ControllerStr);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Controller;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextAcpi (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                *HIDStr;\r
+  CHAR16                *UIDStr;\r
+  ACPI_HID_DEVICE_PATH  *Acpi;\r
+\r
+  HIDStr = GetNextParamStr (&TextDeviceNode);\r
+  UIDStr = GetNextParamStr (&TextDeviceNode);\r
+  Acpi   = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (\r
+                                      ACPI_DEVICE_PATH,\r
+                                      ACPI_DP,\r
+                                      sizeof (ACPI_HID_DEVICE_PATH)\r
+                                      );\r
+\r
+  if ((HIDStr[0] == L'P') && (HIDStr[1] == L'N') && (HIDStr[2] == L'P')) {\r
+    HIDStr += 3;\r
+  }\r
+\r
+  Acpi->HID = EISA_PNP_ID (Xtoi (HIDStr));\r
+  Acpi->UID = (UINT32) Xtoi (UIDStr);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Acpi;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+ConvertFromTextAcpi (\r
+  IN CHAR16 *TextDeviceNode,\r
+  IN UINT32  Hid\r
+  )\r
+{\r
+  CHAR16                *UIDStr;\r
+  ACPI_HID_DEVICE_PATH  *Acpi;\r
+\r
+  UIDStr = GetNextParamStr (&TextDeviceNode);\r
+  Acpi   = (ACPI_HID_DEVICE_PATH *) CreateDeviceNode (\r
+                                      ACPI_DEVICE_PATH,\r
+                                      ACPI_DP,\r
+                                      sizeof (ACPI_HID_DEVICE_PATH)\r
+                                      );\r
+\r
+  Acpi->HID = Hid;\r
+  Acpi->UID = (UINT32) Xtoi (UIDStr);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Acpi;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextPciRoot (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  return ConvertFromTextAcpi (TextDeviceNode, 0x0a0341d0);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextFloppy (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  return ConvertFromTextAcpi (TextDeviceNode, 0x060441d0);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextKeyboard (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  return ConvertFromTextAcpi (TextDeviceNode, 0x030141d0);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextSerial (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  return ConvertFromTextAcpi (TextDeviceNode, 0x050141d0);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextParallelPort (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  return ConvertFromTextAcpi (TextDeviceNode, 0x040141d0);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextAcpiEx (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                                  *HIDStr;\r
+  CHAR16                                  *CIDStr;\r
+  CHAR16                                  *UIDStr;\r
+  CHAR16                                  *HIDSTRStr;\r
+  CHAR16                                  *CIDSTRStr;\r
+  CHAR16                                  *UIDSTRStr;\r
+  CHAR8                                   *AsciiStr;\r
+  UINT16                                  Length;\r
+  ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR  *AcpiExt;\r
+\r
+  HIDStr    = GetNextParamStr (&TextDeviceNode);\r
+  CIDStr    = GetNextParamStr (&TextDeviceNode);\r
+  UIDStr    = GetNextParamStr (&TextDeviceNode);\r
+  HIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
+  CIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
+  UIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
+  Length    = sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + \r
+                  (UINT16) StrLen (HIDSTRStr) + 1 +\r
+                  (UINT16) StrLen (UIDSTRStr) + 1 +\r
+                  (UINT16) StrLen (CIDSTRStr) + 1;\r
+  AcpiExt = (ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR *) CreateDeviceNode (\r
+                                                         ACPI_DEVICE_PATH,\r
+                                                         ACPI_EXTENDED_DP,\r
+                                                         Length\r
+                                                         );\r
+\r
+  if ((HIDStr[0] == L'P') && (HIDStr[1] == L'N') && (HIDStr[2] == L'P')) {\r
+    HIDStr += 3;\r
+    AcpiExt->HID = EISA_PNP_ID (Xtoi (HIDStr));\r
+  } else {\r
+    AcpiExt->HID = (UINT32) Xtoi (HIDStr);\r
+  }\r
+\r
+  AcpiExt->UID  = (UINT32) Xtoi (UIDStr);\r
+  AcpiExt->CID  = (UINT32) Xtoi (CIDStr);\r
+\r
+  AsciiStr = AcpiExt->HidUidCidStr;\r
+  StrToAscii (HIDSTRStr, &AsciiStr);\r
+  StrToAscii (UIDSTRStr, &AsciiStr);\r
+  StrToAscii (CIDSTRStr, &AsciiStr);\r
+  \r
+  return (EFI_DEVICE_PATH_PROTOCOL *) AcpiExt;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextAcpiExp (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                                  *HIDStr;\r
+  CHAR16                                  *CIDStr;\r
+  CHAR16                                  *UIDSTRStr;\r
+  CHAR8                                   *AsciiStr;\r
+  UINT16                                  Length;\r
+  ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR  *AcpiExt;\r
+\r
+  HIDStr    = GetNextParamStr (&TextDeviceNode);\r
+  CIDStr    = GetNextParamStr (&TextDeviceNode);\r
+  UIDSTRStr = GetNextParamStr (&TextDeviceNode);\r
+  Length    = sizeof (ACPI_EXTENDED_HID_DEVICE_PATH) + (UINT16) StrLen (UIDSTRStr) + 3;\r
+  AcpiExt   = (ACPI_EXTENDED_HID_DEVICE_PATH_WITH_STR *) CreateDeviceNode (\r
+                                                           ACPI_DEVICE_PATH,\r
+                                                           ACPI_EXTENDED_DP,\r
+                                                           Length\r
+                                                           );\r
+\r
+  if ((HIDStr[0] == L'P') && (HIDStr[1] == L'N') && (HIDStr[2] == L'P')) {\r
+    HIDStr += 3;\r
+    AcpiExt->HID = EISA_PNP_ID (Xtoi (HIDStr));\r
+  } else {\r
+    AcpiExt->HID = (UINT32) Xtoi (HIDStr);\r
+  }\r
+\r
+  AcpiExt->UID = 0;\r
+  AcpiExt->CID = (UINT32) Xtoi (CIDStr);\r
+\r
+  AsciiStr = AcpiExt->HidUidCidStr;\r
+  //\r
+  // HID string is NULL\r
+  //\r
+  *AsciiStr = 0;\r
+  //\r
+  // Convert UID string\r
+  //\r
+  AsciiStr++;\r
+  StrToAscii (UIDSTRStr, &AsciiStr);\r
+  //\r
+  // CID string is NULL\r
+  //\r
+  *AsciiStr = 0;\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) AcpiExt;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextAta (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16            *PrimarySecondaryStr;\r
+  CHAR16            *SlaveMasterStr;\r
+  CHAR16            *LunStr;\r
+  ATAPI_DEVICE_PATH *Atapi;\r
+\r
+  Atapi = (ATAPI_DEVICE_PATH *) CreateDeviceNode (\r
+                                  MESSAGING_DEVICE_PATH,\r
+                                  MSG_ATAPI_DP,\r
+                                  sizeof (ATAPI_DEVICE_PATH)\r
+                                  );\r
+\r
+  PrimarySecondaryStr     = GetNextParamStr (&TextDeviceNode);\r
+  SlaveMasterStr          = GetNextParamStr (&TextDeviceNode);\r
+  LunStr                  = GetNextParamStr (&TextDeviceNode);\r
+\r
+  Atapi->PrimarySecondary = (StrCmp (PrimarySecondaryStr, L"Primary") == 0) ? (UINT8) 0 : (UINT8) 1;\r
+  Atapi->SlaveMaster      = (StrCmp (SlaveMasterStr, L"Master") == 0) ? (UINT8) 0 : (UINT8) 1;\r
+  Atapi->Lun              = (UINT16) Xtoi (LunStr);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Atapi;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextScsi (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16            *PunStr;\r
+  CHAR16            *LunStr;\r
+  SCSI_DEVICE_PATH  *Scsi;\r
+\r
+  PunStr = GetNextParamStr (&TextDeviceNode);\r
+  LunStr = GetNextParamStr (&TextDeviceNode);\r
+  Scsi   = (SCSI_DEVICE_PATH *) CreateDeviceNode (\r
+                                   MESSAGING_DEVICE_PATH,\r
+                                   MSG_SCSI_DP,\r
+                                   sizeof (SCSI_DEVICE_PATH)\r
+                                   );\r
+\r
+  Scsi->Pun = (UINT16) Xtoi (PunStr);\r
+  Scsi->Lun = (UINT16) Xtoi (LunStr);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Scsi;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextFibre (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                    *WWNStr;\r
+  CHAR16                    *LunStr;\r
+  FIBRECHANNEL_DEVICE_PATH  *Fibre;\r
+\r
+  WWNStr = GetNextParamStr (&TextDeviceNode);\r
+  LunStr = GetNextParamStr (&TextDeviceNode);\r
+  Fibre  = (FIBRECHANNEL_DEVICE_PATH *) CreateDeviceNode (\r
+                                          MESSAGING_DEVICE_PATH,\r
+                                          MSG_FIBRECHANNEL_DP,\r
+                                          sizeof (FIBRECHANNEL_DEVICE_PATH)\r
+                                          );\r
+\r
+  Fibre->Reserved = 0;\r
+  Xtoi64 (WWNStr, &Fibre->WWN);\r
+  Xtoi64 (LunStr, &Fibre->Lun);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Fibre;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromText1394 (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16            *GuidStr;\r
+  F1394_DEVICE_PATH *F1394;\r
+\r
+  GuidStr = GetNextParamStr (&TextDeviceNode);\r
+  F1394  = (F1394_DEVICE_PATH *) CreateDeviceNode (\r
+                                   MESSAGING_DEVICE_PATH,\r
+                                   MSG_1394_DP,\r
+                                   sizeof (F1394_DEVICE_PATH)\r
+                                   );\r
+\r
+  F1394->Reserved = 0;\r
+  Xtoi64 (GuidStr, &F1394->Guid);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) F1394;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsb (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16          *PortStr;\r
+  CHAR16          *InterfaceStr;\r
+  USB_DEVICE_PATH *Usb;\r
+\r
+  PortStr               = GetNextParamStr (&TextDeviceNode);\r
+  InterfaceStr          = GetNextParamStr (&TextDeviceNode);\r
+  Usb                   = (USB_DEVICE_PATH *) CreateDeviceNode (\r
+                                                MESSAGING_DEVICE_PATH,\r
+                                                MSG_USB_DP,\r
+                                                sizeof (USB_DEVICE_PATH)\r
+                                                );\r
+\r
+  Usb->ParentPortNumber = (UINT8) Xtoi (PortStr);\r
+  Usb->InterfaceNumber  = (UINT8) Xtoi (InterfaceStr);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Usb;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextI2O (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16          *TIDStr;\r
+  I2O_DEVICE_PATH *I2O;\r
+\r
+  TIDStr    = GetNextParamStr (&TextDeviceNode);\r
+  I2O       = (I2O_DEVICE_PATH *) CreateDeviceNode (\r
+                                    MESSAGING_DEVICE_PATH,\r
+                                    MSG_I2O_DP,\r
+                                    sizeof (I2O_DEVICE_PATH)\r
+                                    );\r
+\r
+  I2O->Tid  = (UINT32) Xtoi (TIDStr);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) I2O;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextInfiniband (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                  *FlagsStr;\r
+  CHAR16                  *GuidStr;\r
+  CHAR16                  *SidStr;\r
+  CHAR16                  *TidStr;\r
+  CHAR16                  *DidStr;\r
+  EFI_GUID                PortGid;\r
+  INFINIBAND_DEVICE_PATH  *InfiniBand;\r
+\r
+  FlagsStr   = GetNextParamStr (&TextDeviceNode);\r
+  GuidStr    = GetNextParamStr (&TextDeviceNode);\r
+  SidStr     = GetNextParamStr (&TextDeviceNode);\r
+  TidStr     = GetNextParamStr (&TextDeviceNode);\r
+  DidStr     = GetNextParamStr (&TextDeviceNode);\r
+  InfiniBand = (INFINIBAND_DEVICE_PATH *) CreateDeviceNode (\r
+                                            MESSAGING_DEVICE_PATH,\r
+                                            MSG_INFINIBAND_DP,\r
+                                            sizeof (INFINIBAND_DEVICE_PATH)\r
+                                            );\r
+\r
+  InfiniBand->ResourceFlags = (UINT32) Xtoi (FlagsStr);\r
+  StrToGuid (GuidStr, &PortGid);\r
+  CopyMem (InfiniBand->PortGid, &PortGid, sizeof (EFI_GUID));\r
+  Xtoi64 (SidStr, &InfiniBand->ServiceId);\r
+  Xtoi64 (TidStr, &InfiniBand->TargetPortId);\r
+  Xtoi64 (DidStr, &InfiniBand->DeviceId);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) InfiniBand;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextVenMsg (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  return ConvertFromTextVendor (\r
+            TextDeviceNode,\r
+            MESSAGING_DEVICE_PATH,\r
+            MSG_VENDOR_DP\r
+            );\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextVenPcAnsi (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  VENDOR_DEVICE_PATH  *Vendor;\r
+\r
+  Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
+                                    MESSAGING_DEVICE_PATH,\r
+                                    MSG_VENDOR_DP,\r
+                                    sizeof (VENDOR_DEVICE_PATH));\r
+  CopyGuid (&Vendor->Guid, &gEfiPcAnsiGuid);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextVenVt100 (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  VENDOR_DEVICE_PATH  *Vendor;\r
+\r
+  Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
+                                    MESSAGING_DEVICE_PATH,\r
+                                    MSG_VENDOR_DP,\r
+                                    sizeof (VENDOR_DEVICE_PATH));\r
+  CopyGuid (&Vendor->Guid, &gEfiVT100Guid);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextVenVt100Plus (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  VENDOR_DEVICE_PATH  *Vendor;\r
+\r
+  Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
+                                    MESSAGING_DEVICE_PATH,\r
+                                    MSG_VENDOR_DP,\r
+                                    sizeof (VENDOR_DEVICE_PATH));\r
+  CopyGuid (&Vendor->Guid, &gEfiVT100PlusGuid);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextVenUtf8 (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  VENDOR_DEVICE_PATH  *Vendor;\r
+\r
+  Vendor = (VENDOR_DEVICE_PATH *) CreateDeviceNode (\r
+                                    MESSAGING_DEVICE_PATH,\r
+                                    MSG_VENDOR_DP,\r
+                                    sizeof (VENDOR_DEVICE_PATH));\r
+  CopyGuid (&Vendor->Guid, &gEfiVTUTF8Guid);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Vendor;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUartFlowCtrl (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                        *ValueStr;\r
+  UART_FLOW_CONTROL_DEVICE_PATH *UartFlowControl;\r
+\r
+  ValueStr        = GetNextParamStr (&TextDeviceNode);\r
+  UartFlowControl = (UART_FLOW_CONTROL_DEVICE_PATH *) CreateDeviceNode (\r
+                                                        MESSAGING_DEVICE_PATH,\r
+                                                        MSG_VENDOR_DP,\r
+                                                        sizeof (UART_FLOW_CONTROL_DEVICE_PATH)\r
+                                                        );\r
+\r
+  CopyGuid (&UartFlowControl->Guid, &mEfiDevicePathMessagingUartFlowControlGuid);\r
+  if (StrCmp (ValueStr, L"XonXoff") == 0) {\r
+    UartFlowControl->FlowControlMap = 2;\r
+  } else if (StrCmp (ValueStr, L"Hardware") == 0) {\r
+    UartFlowControl->FlowControlMap = 1;\r
+  } else {\r
+    UartFlowControl->FlowControlMap = 0;\r
+  }\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) UartFlowControl;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextSAS (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16          *AddressStr;\r
+  CHAR16          *LunStr;\r
+  CHAR16          *RTPStr;\r
+  CHAR16          *SASSATAStr;\r
+  CHAR16          *LocationStr;\r
+  CHAR16          *ConnectStr;\r
+  CHAR16          *DriveBayStr;\r
+  CHAR16          *ReservedStr;\r
+  UINT16          Info;\r
+  SAS_DEVICE_PATH *Sas;\r
+\r
+  AddressStr  = GetNextParamStr (&TextDeviceNode);\r
+  LunStr      = GetNextParamStr (&TextDeviceNode);\r
+  RTPStr      = GetNextParamStr (&TextDeviceNode);\r
+  SASSATAStr  = GetNextParamStr (&TextDeviceNode);\r
+  LocationStr = GetNextParamStr (&TextDeviceNode);\r
+  ConnectStr  = GetNextParamStr (&TextDeviceNode);\r
+  DriveBayStr = GetNextParamStr (&TextDeviceNode);\r
+  ReservedStr = GetNextParamStr (&TextDeviceNode);\r
+  Info        = 0x0000;\r
+  Sas         = (SAS_DEVICE_PATH *) CreateDeviceNode (\r
+                                       MESSAGING_DEVICE_PATH,\r
+                                       MSG_VENDOR_DP,\r
+                                       sizeof (SAS_DEVICE_PATH)\r
+                                       );\r
+\r
+  CopyGuid (&Sas->Guid, &mEfiDevicePathMessagingSASGuid);\r
+  Xtoi64 (AddressStr, &Sas->SasAddress);\r
+  Xtoi64 (LunStr, &Sas->Lun);\r
+  Sas->RelativeTargetPort = (UINT16) Xtoi (RTPStr);\r
+  if (StrCmp (SASSATAStr, L"NoTopology") == 0)\r
+    ;\r
+  else {\r
+    if (StrCmp (DriveBayStr, L"0") == 0) {\r
+      Info |= 0x0001;\r
+    } else {\r
+      Info |= 0x0002;\r
+      Info |= (Xtoi (DriveBayStr) << 8);\r
+    }\r
+\r
+    if (StrCmp (SASSATAStr, L"SATA") == 0) {\r
+      Info |= 0x0010;\r
+    }\r
+\r
+    if (StrCmp (LocationStr, L"External") == 0) {\r
+      Info |= 0x0020;\r
+    }\r
+\r
+    if (StrCmp (ConnectStr, L"Expanded") == 0) {\r
+      Info |= 0x0040;\r
+    }\r
+  }\r
+\r
+  Sas->DeviceTopology = Info;\r
+  Sas->Reserved       = (UINT32) Xtoi (ReservedStr);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Sas;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextDebugPort (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  VENDOR_DEFINED_MESSAGING_DEVICE_PATH  *Vend;\r
+\r
+  Vend = (VENDOR_DEFINED_MESSAGING_DEVICE_PATH *) CreateDeviceNode (\r
+                                                    MESSAGING_DEVICE_PATH,\r
+                                                    MSG_VENDOR_DP,\r
+                                                    sizeof (VENDOR_DEFINED_MESSAGING_DEVICE_PATH)\r
+                                                    );\r
+\r
+  CopyGuid (&Vend->Guid, &gEfiDebugPortProtocolGuid);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Vend;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextMAC (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                *AddressStr;\r
+  CHAR16                *IfTypeStr;\r
+  UINTN                 Length;\r
+  MAC_ADDR_DEVICE_PATH  *MAC;\r
+\r
+  AddressStr    = GetNextParamStr (&TextDeviceNode);\r
+  IfTypeStr     = GetNextParamStr (&TextDeviceNode);\r
+  MAC           = (MAC_ADDR_DEVICE_PATH *) CreateDeviceNode (\r
+                                              MESSAGING_DEVICE_PATH,\r
+                                              MSG_MAC_ADDR_DP,\r
+                                              sizeof (MAC_ADDR_DEVICE_PATH)\r
+                                              );\r
+\r
+  MAC->IfType   = (UINT8) Xtoi (IfTypeStr);\r
+\r
+  Length = sizeof (EFI_MAC_ADDRESS);\r
+  StrToBuf (&MAC->MacAddress.Addr[0], Length, AddressStr);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) MAC;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextIPv4 (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16            *RemoteIPStr;\r
+  CHAR16            *ProtocolStr;\r
+  CHAR16            *TypeStr;\r
+  CHAR16            *LocalIPStr;\r
+  IPv4_DEVICE_PATH  *IPv4;\r
+\r
+  RemoteIPStr           = GetNextParamStr (&TextDeviceNode);\r
+  ProtocolStr           = GetNextParamStr (&TextDeviceNode);\r
+  TypeStr               = GetNextParamStr (&TextDeviceNode);\r
+  LocalIPStr            = GetNextParamStr (&TextDeviceNode);\r
+  IPv4                  = (IPv4_DEVICE_PATH *) CreateDeviceNode (\r
+                                                 MESSAGING_DEVICE_PATH,\r
+                                                 MSG_IPv4_DP,\r
+                                                 sizeof (IPv4_DEVICE_PATH)\r
+                                                 );\r
+\r
+  StrToIPv4Addr (&RemoteIPStr, &IPv4->RemoteIpAddress);\r
+  IPv4->Protocol = (StrCmp (ProtocolStr, L"UDP") == 0) ? (UINT16) 0 : (UINT16) 1;\r
+  if (StrCmp (TypeStr, L"Static") == 0) {\r
+    IPv4->StaticIpAddress = TRUE;\r
+  } else {\r
+    IPv4->StaticIpAddress = FALSE;\r
+  }\r
+\r
+  StrToIPv4Addr (&LocalIPStr, &IPv4->LocalIpAddress);\r
+\r
+  IPv4->LocalPort      = 0;\r
+  IPv4->RemotePort     = 0;\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) IPv4;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextIPv6 (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16            *RemoteIPStr;\r
+  CHAR16            *ProtocolStr;\r
+  CHAR16            *TypeStr;\r
+  CHAR16            *LocalIPStr;\r
+  IPv6_DEVICE_PATH  *IPv6;\r
+\r
+  RemoteIPStr           = GetNextParamStr (&TextDeviceNode);\r
+  ProtocolStr           = GetNextParamStr (&TextDeviceNode);\r
+  TypeStr               = GetNextParamStr (&TextDeviceNode);\r
+  LocalIPStr            = GetNextParamStr (&TextDeviceNode);\r
+  IPv6                  = (IPv6_DEVICE_PATH *) CreateDeviceNode (\r
+                                                 MESSAGING_DEVICE_PATH,\r
+                                                 MSG_IPv6_DP,\r
+                                                 sizeof (IPv6_DEVICE_PATH)\r
+                                                 );\r
+\r
+  StrToIPv6Addr (&RemoteIPStr, &IPv6->RemoteIpAddress);\r
+  IPv6->Protocol        = (StrCmp (ProtocolStr, L"UDP") == 0) ? (UINT16) 0 : (UINT16) 1;\r
+  if (StrCmp (TypeStr, L"Static") == 0) {\r
+    IPv6->StaticIpAddress = TRUE;\r
+  } else {\r
+    IPv6->StaticIpAddress = FALSE;\r
+  }\r
+\r
+  StrToIPv6Addr (&LocalIPStr, &IPv6->LocalIpAddress);\r
+\r
+  IPv6->LocalPort       = 0;\r
+  IPv6->RemotePort      = 0;\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) IPv6;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUart (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16            *BaudStr;\r
+  CHAR16            *DataBitsStr;\r
+  CHAR16            *ParityStr;\r
+  CHAR16            *StopBitsStr;\r
+  UART_DEVICE_PATH  *Uart;\r
+\r
+  BaudStr         = GetNextParamStr (&TextDeviceNode);\r
+  DataBitsStr     = GetNextParamStr (&TextDeviceNode);\r
+  ParityStr       = GetNextParamStr (&TextDeviceNode);\r
+  StopBitsStr     = GetNextParamStr (&TextDeviceNode);\r
+  Uart            = (UART_DEVICE_PATH *) CreateDeviceNode (\r
+                                           MESSAGING_DEVICE_PATH,\r
+                                           MSG_UART_DP,\r
+                                           sizeof (UART_DEVICE_PATH)\r
+                                           );\r
+\r
+  Uart->BaudRate  = (StrCmp (BaudStr, L"DEFAULT") == 0) ? 115200 : Atoi (BaudStr);\r
+  Uart->DataBits  = (StrCmp (DataBitsStr, L"DEFAULT") == 0) ? (UINT8) 8 : (UINT8) Atoi (DataBitsStr);\r
+  switch (*ParityStr) {\r
+  case L'D':\r
+    Uart->Parity = 0;\r
+    break;\r
+\r
+  case L'N':\r
+    Uart->Parity = 1;\r
+    break;\r
+\r
+  case L'E':\r
+    Uart->Parity = 2;\r
+    break;\r
+\r
+  case L'O':\r
+    Uart->Parity = 3;\r
+    break;\r
+\r
+  case L'M':\r
+    Uart->Parity = 4;\r
+    break;\r
+\r
+  case L'S':\r
+    Uart->Parity = 5;\r
+\r
+  default:\r
+    Uart->Parity = 0xff;\r
+  }\r
+\r
+  if (StrCmp (StopBitsStr, L"D") == 0) {\r
+    Uart->StopBits = (UINT8) 0;\r
+  } else if (StrCmp (StopBitsStr, L"1") == 0) {\r
+    Uart->StopBits = (UINT8) 1;\r
+  } else if (StrCmp (StopBitsStr, L"1.5") == 0) {\r
+    Uart->StopBits = (UINT8) 2;\r
+  } else if (StrCmp (StopBitsStr, L"2") == 0) {\r
+    Uart->StopBits = (UINT8) 3;\r
+  } else {\r
+    Uart->StopBits = 0xff;\r
+  }\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Uart;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+ConvertFromTextUsbClass (\r
+  IN CHAR16         *TextDeviceNode,\r
+  IN USB_CLASS_TEXT *UsbClassText\r
+  )\r
+{\r
+  CHAR16                *VIDStr;\r
+  CHAR16                *PIDStr;\r
+  CHAR16                *ClassStr;\r
+  CHAR16                *SubClassStr;\r
+  CHAR16                *ProtocolStr;\r
+  USB_CLASS_DEVICE_PATH *UsbClass;\r
+\r
+  UsbClass    = (USB_CLASS_DEVICE_PATH *) CreateDeviceNode (\r
+                                            MESSAGING_DEVICE_PATH,\r
+                                            MSG_USB_CLASS_DP,\r
+                                            sizeof (USB_CLASS_DEVICE_PATH)\r
+                                            );\r
+\r
+  VIDStr      = GetNextParamStr (&TextDeviceNode);\r
+  PIDStr      = GetNextParamStr (&TextDeviceNode);\r
+  if (UsbClassText->ClassExist) {\r
+    ClassStr = GetNextParamStr (&TextDeviceNode);\r
+    UsbClass->DeviceClass = (UINT8) Xtoi (ClassStr);\r
+  } else {\r
+    UsbClass->DeviceClass = UsbClassText->Class;\r
+  }\r
+  if (UsbClassText->SubClassExist) {\r
+    SubClassStr = GetNextParamStr (&TextDeviceNode);\r
+    UsbClass->DeviceSubClass = (UINT8) Xtoi (SubClassStr);\r
+  } else {\r
+    UsbClass->DeviceSubClass = UsbClassText->SubClass;\r
+  }  \r
+\r
+  ProtocolStr = GetNextParamStr (&TextDeviceNode);\r
+\r
+  UsbClass->VendorId        = (UINT16) Xtoi (VIDStr);\r
+  UsbClass->ProductId       = (UINT16) Xtoi (PIDStr);\r
+  UsbClass->DeviceProtocol  = (UINT8) Xtoi (ProtocolStr);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) UsbClass;\r
+}\r
+\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbClass (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  USB_CLASS_TEXT  UsbClassText;\r
+\r
+  UsbClassText.ClassExist    = TRUE;\r
+  UsbClassText.SubClassExist = TRUE;\r
+\r
+  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbAudio (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  USB_CLASS_TEXT  UsbClassText;\r
+\r
+  UsbClassText.ClassExist    = FALSE;\r
+  UsbClassText.Class         = USB_CLASS_AUDIO;\r
+  UsbClassText.SubClassExist = TRUE;\r
+\r
+  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbCDCControl (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  USB_CLASS_TEXT  UsbClassText;\r
+\r
+  UsbClassText.ClassExist    = FALSE;\r
+  UsbClassText.Class         = USB_CLASS_CDCCONTROL;\r
+  UsbClassText.SubClassExist = TRUE;\r
+\r
+  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbHID (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  USB_CLASS_TEXT  UsbClassText;\r
+\r
+  UsbClassText.ClassExist    = FALSE;\r
+  UsbClassText.Class         = USB_CLASS_HID;\r
+  UsbClassText.SubClassExist = TRUE;\r
+\r
+  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbImage (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  USB_CLASS_TEXT  UsbClassText;\r
+\r
+  UsbClassText.ClassExist    = FALSE;\r
+  UsbClassText.Class         = USB_CLASS_IMAGE;\r
+  UsbClassText.SubClassExist = TRUE;\r
+\r
+  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbPrinter (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  USB_CLASS_TEXT  UsbClassText;\r
+\r
+  UsbClassText.ClassExist    = FALSE;\r
+  UsbClassText.Class         = USB_CLASS_PRINTER;\r
+  UsbClassText.SubClassExist = TRUE;\r
+\r
+  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbMassStorage (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  USB_CLASS_TEXT  UsbClassText;\r
+\r
+  UsbClassText.ClassExist    = FALSE;\r
+  UsbClassText.Class         = USB_CLASS_MASS_STORAGE;\r
+  UsbClassText.SubClassExist = TRUE;\r
+\r
+  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbHub (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  USB_CLASS_TEXT  UsbClassText;\r
+\r
+  UsbClassText.ClassExist    = FALSE;\r
+  UsbClassText.Class         = USB_CLASS_HUB;\r
+  UsbClassText.SubClassExist = TRUE;\r
+\r
+  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbCDCData (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  USB_CLASS_TEXT  UsbClassText;\r
+\r
+  UsbClassText.ClassExist    = FALSE;\r
+  UsbClassText.Class         = USB_CLASS_CDCDATA;\r
+  UsbClassText.SubClassExist = TRUE;\r
+\r
+  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbSmartCard (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  USB_CLASS_TEXT  UsbClassText;\r
+\r
+  UsbClassText.ClassExist    = FALSE;\r
+  UsbClassText.Class         = USB_CLASS_SMART_CARD;\r
+  UsbClassText.SubClassExist = TRUE;\r
+\r
+  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbVideo (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  USB_CLASS_TEXT  UsbClassText;\r
+\r
+  UsbClassText.ClassExist    = FALSE;\r
+  UsbClassText.Class         = USB_CLASS_VIDEO;\r
+  UsbClassText.SubClassExist = TRUE;\r
+\r
+  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbDiagnostic (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  USB_CLASS_TEXT  UsbClassText;\r
+\r
+  UsbClassText.ClassExist    = FALSE;\r
+  UsbClassText.Class         = USB_CLASS_DIAGNOSTIC;\r
+  UsbClassText.SubClassExist = TRUE;\r
+\r
+  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbWireless (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  USB_CLASS_TEXT  UsbClassText;\r
+\r
+  UsbClassText.ClassExist    = FALSE;\r
+  UsbClassText.Class         = USB_CLASS_WIRELESS;\r
+  UsbClassText.SubClassExist = TRUE;\r
+\r
+  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbDeviceFirmwareUpdate (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  USB_CLASS_TEXT  UsbClassText;\r
+\r
+  UsbClassText.ClassExist    = FALSE;\r
+  UsbClassText.Class         = USB_CLASS_RESERVE;\r
+  UsbClassText.SubClassExist = FALSE;\r
+  UsbClassText.SubClass      = USB_SUBCLASS_FW_UPDATE;\r
+\r
+  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbIrdaBridge (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  USB_CLASS_TEXT  UsbClassText;\r
+\r
+  UsbClassText.ClassExist    = FALSE;\r
+  UsbClassText.Class         = USB_CLASS_RESERVE;\r
+  UsbClassText.SubClassExist = FALSE;\r
+  UsbClassText.SubClass      = USB_SUBCLASS_IRDA_BRIDGE;\r
+\r
+  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbTestAndMeasurement (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  USB_CLASS_TEXT  UsbClassText;\r
+\r
+  UsbClassText.ClassExist    = FALSE;\r
+  UsbClassText.Class         = USB_CLASS_RESERVE;\r
+  UsbClassText.SubClassExist = FALSE;\r
+  UsbClassText.SubClass      = USB_SUBCLASS_TEST;\r
+\r
+  return ConvertFromTextUsbClass (TextDeviceNode, &UsbClassText);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUsbWwid (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                *VIDStr;\r
+  CHAR16                *PIDStr;\r
+  CHAR16                *InterfaceNumStr;\r
+  USB_WWID_DEVICE_PATH  *UsbWwid;\r
+\r
+  VIDStr                    = GetNextParamStr (&TextDeviceNode);\r
+  PIDStr                    = GetNextParamStr (&TextDeviceNode);\r
+  InterfaceNumStr           = GetNextParamStr (&TextDeviceNode);\r
+  UsbWwid                   = (USB_WWID_DEVICE_PATH *) CreateDeviceNode (\r
+                                                         MESSAGING_DEVICE_PATH,\r
+                                                         MSG_USB_WWID_DP,\r
+                                                         sizeof (USB_WWID_DEVICE_PATH)\r
+                                                         );\r
+\r
+  UsbWwid->VendorId         = (UINT16) Xtoi (VIDStr);\r
+  UsbWwid->ProductId        = (UINT16) Xtoi (PIDStr);\r
+  UsbWwid->InterfaceNumber  = (UINT16) Xtoi (InterfaceNumStr);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) UsbWwid;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextUnit (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                          *LunStr;\r
+  DEVICE_LOGICAL_UNIT_DEVICE_PATH *LogicalUnit;\r
+\r
+  LunStr      = GetNextParamStr (&TextDeviceNode);\r
+  LogicalUnit = (DEVICE_LOGICAL_UNIT_DEVICE_PATH *) CreateDeviceNode (\r
+                                                      MESSAGING_DEVICE_PATH,\r
+                                                      MSG_DEVICE_LOGICAL_UNIT_DP,\r
+                                                      sizeof (DEVICE_LOGICAL_UNIT_DEVICE_PATH)\r
+                                                      );\r
+\r
+  LogicalUnit->Lun  = (UINT8) Xtoi (LunStr);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) LogicalUnit;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextiSCSI (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  UINT16                      Options;\r
+  CHAR16                      *NameStr;\r
+  CHAR16                      *PortalGroupStr;\r
+  CHAR16                      *LunStr;\r
+  CHAR16                      *HeaderDigestStr;\r
+  CHAR16                      *DataDigestStr;\r
+  CHAR16                      *AuthenticationStr;\r
+  CHAR16                      *ProtocolStr;\r
+  ISCSI_DEVICE_PATH_WITH_NAME *iSCSI;\r
+\r
+  NameStr           = GetNextParamStr (&TextDeviceNode);\r
+  PortalGroupStr    = GetNextParamStr (&TextDeviceNode);\r
+  LunStr            = GetNextParamStr (&TextDeviceNode);\r
+  HeaderDigestStr   = GetNextParamStr (&TextDeviceNode);\r
+  DataDigestStr     = GetNextParamStr (&TextDeviceNode);\r
+  AuthenticationStr = GetNextParamStr (&TextDeviceNode);\r
+  ProtocolStr       = GetNextParamStr (&TextDeviceNode);\r
+  iSCSI             = (ISCSI_DEVICE_PATH_WITH_NAME *) CreateDeviceNode (\r
+                                                        MESSAGING_DEVICE_PATH,\r
+                                                        MSG_ISCSI_DP,\r
+                                                        sizeof (ISCSI_DEVICE_PATH_WITH_NAME) + (UINT16) (StrLen (NameStr) * 2)\r
+                                                        );\r
+\r
+  StrCpy (iSCSI->iSCSITargetName, NameStr);\r
+  iSCSI->TargetPortalGroupTag = (UINT16) Xtoi (PortalGroupStr);\r
+  Xtoi64 (LunStr, &iSCSI->Lun);\r
+\r
+  Options = 0x0000;\r
+  if (StrCmp (HeaderDigestStr, L"CRC32C") == 0) {\r
+    Options |= 0x0002;\r
+  }\r
+\r
+  if (StrCmp (DataDigestStr, L"CRC32C") == 0) {\r
+    Options |= 0x0008;\r
+  }\r
+\r
+  if (StrCmp (AuthenticationStr, L"None") == 0) {\r
+    Options |= 0x0800;\r
+  }\r
+\r
+  if (StrCmp (AuthenticationStr, L"CHAP_UNI") == 0) {\r
+    Options |= 0x1000;\r
+  }\r
+\r
+  iSCSI->LoginOption      = (UINT16) Options;\r
+\r
+  iSCSI->NetworkProtocol  = (UINT16) StrCmp (ProtocolStr, L"TCP");\r
+  iSCSI->Reserved         = (UINT16) 0;\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) iSCSI;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextHD (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                *PartitionStr;\r
+  CHAR16                *TypeStr;\r
+  CHAR16                *SignatureStr;\r
+  CHAR16                *StartStr;\r
+  CHAR16                *SizeStr;\r
+  UINT32                Signature32;\r
+  EFI_GUID              SignatureGuid;\r
+  HARDDRIVE_DEVICE_PATH *Hd;\r
+\r
+  PartitionStr        = GetNextParamStr (&TextDeviceNode);\r
+  TypeStr             = GetNextParamStr (&TextDeviceNode);\r
+  SignatureStr        = GetNextParamStr (&TextDeviceNode);\r
+  StartStr            = GetNextParamStr (&TextDeviceNode);\r
+  SizeStr             = GetNextParamStr (&TextDeviceNode);\r
+  Hd                  = (HARDDRIVE_DEVICE_PATH *) CreateDeviceNode (\r
+                                                    MEDIA_DEVICE_PATH,\r
+                                                    MEDIA_HARDDRIVE_DP,\r
+                                                    sizeof (HARDDRIVE_DEVICE_PATH)\r
+                                                    );\r
+\r
+  Hd->PartitionNumber = (UINT32) Atoi (PartitionStr);\r
+\r
+  ZeroMem (Hd->Signature, 16);\r
+  Hd->MBRType = (UINT8) 0;\r
+\r
+  if (StrCmp (TypeStr, L"None") == 0) {\r
+    Hd->SignatureType = (UINT8) 0;\r
+  } else if (StrCmp (TypeStr, L"MBR") == 0) {\r
+    Hd->SignatureType = SIGNATURE_TYPE_MBR;\r
+    Hd->MBRType       = 0x01;\r
+\r
+    Signature32       = (UINT32) Xtoi (SignatureStr);\r
+    CopyMem (Hd->Signature, &Signature32, sizeof (UINT32));\r
+  } else if (StrCmp (TypeStr, L"GUID") == 0) {\r
+    Hd->SignatureType = SIGNATURE_TYPE_GUID;\r
+    Hd->MBRType       = 0x02;\r
+\r
+    StrToGuid (SignatureStr, &SignatureGuid);\r
+    CopyMem (Hd->Signature, &SignatureGuid, sizeof (EFI_GUID));\r
+  } else {\r
+    Hd->SignatureType = 0xff;\r
+\r
+  }\r
+\r
+  Xtoi64 (StartStr, &Hd->PartitionStart);\r
+  Xtoi64 (SizeStr, &Hd->PartitionSize);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Hd;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextCDROM (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16            *EntryStr;\r
+  CHAR16            *StartStr;\r
+  CHAR16            *SizeStr;\r
+  CDROM_DEVICE_PATH *CDROM;\r
+\r
+  EntryStr              = GetNextParamStr (&TextDeviceNode);\r
+  StartStr              = GetNextParamStr (&TextDeviceNode);\r
+  SizeStr               = GetNextParamStr (&TextDeviceNode);\r
+  CDROM                 = (CDROM_DEVICE_PATH *) CreateDeviceNode (\r
+                                                  MEDIA_DEVICE_PATH,\r
+                                                  MEDIA_CDROM_DP,\r
+                                                  sizeof (CDROM_DEVICE_PATH)\r
+                                                  );\r
+\r
+  CDROM->BootEntry      = (UINT32) Xtoi (EntryStr);\r
+  Xtoi64 (StartStr, &CDROM->PartitionStart);\r
+  Xtoi64 (SizeStr, &CDROM->PartitionSize);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) CDROM;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextVenMEDIA (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  return ConvertFromTextVendor (\r
+           TextDeviceNode,\r
+           MEDIA_DEVICE_PATH,\r
+           MEDIA_VENDOR_DP\r
+           );\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextFilePath (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  FILEPATH_DEVICE_PATH  *File;\r
+\r
+  File = (FILEPATH_DEVICE_PATH *) CreateDeviceNode (\r
+                                    MEDIA_DEVICE_PATH,\r
+                                    MEDIA_FILEPATH_DP,\r
+                                    sizeof (FILEPATH_DEVICE_PATH) + (UINT16) (StrLen (TextDeviceNode) * 2)\r
+                                    );\r
+\r
+  StrCpy (File->PathName, TextDeviceNode);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) File;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextMedia (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16                      *GuidStr;\r
+  MEDIA_PROTOCOL_DEVICE_PATH  *Media;\r
+\r
+  GuidStr = GetNextParamStr (&TextDeviceNode);\r
+  Media   = (MEDIA_PROTOCOL_DEVICE_PATH *) CreateDeviceNode (\r
+                                             MEDIA_DEVICE_PATH,\r
+                                             MEDIA_PROTOCOL_DP,\r
+                                             sizeof (MEDIA_PROTOCOL_DEVICE_PATH)\r
+                                             );\r
+\r
+  StrToGuid (GuidStr, &Media->Protocol);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Media;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DevPathFromTextBBS (\r
+  IN CHAR16 *TextDeviceNode\r
+  )\r
+{\r
+  CHAR16              *TypeStr;\r
+  CHAR16              *IdStr;\r
+  CHAR16              *FlagsStr;\r
+  UINT8               *AsciiStr;\r
+  BBS_BBS_DEVICE_PATH *Bbs;\r
+\r
+  TypeStr   = GetNextParamStr (&TextDeviceNode);\r
+  IdStr     = GetNextParamStr (&TextDeviceNode);\r
+  FlagsStr  = GetNextParamStr (&TextDeviceNode);\r
+  Bbs       = (BBS_BBS_DEVICE_PATH *) CreateDeviceNode (\r
+                                        BBS_DEVICE_PATH,\r
+                                        BBS_BBS_DP,\r
+                                        sizeof (BBS_BBS_DEVICE_PATH) + (UINT16) (StrLen (IdStr))\r
+                                        );\r
+\r
+  if (StrCmp (TypeStr, L"Floppy") == 0) {\r
+    Bbs->DeviceType = BBS_TYPE_FLOPPY;\r
+  } else if (StrCmp (TypeStr, L"HD") == 0) {\r
+    Bbs->DeviceType = BBS_TYPE_HARDDRIVE;\r
+  } else if (StrCmp (TypeStr, L"CDROM") == 0) {\r
+    Bbs->DeviceType = BBS_TYPE_CDROM;\r
+  } else if (StrCmp (TypeStr, L"PCMCIA") == 0) {\r
+    Bbs->DeviceType = BBS_TYPE_PCMCIA;\r
+  } else if (StrCmp (TypeStr, L"USB") == 0) {\r
+    Bbs->DeviceType = BBS_TYPE_USB;\r
+  } else if (StrCmp (TypeStr, L"Network") == 0) {\r
+    Bbs->DeviceType = BBS_TYPE_EMBEDDED_NETWORK;\r
+  } else {\r
+    Bbs->DeviceType = BBS_TYPE_UNKNOWN;\r
+  }\r
+\r
+  AsciiStr = (UINT8 *) Bbs->String;\r
+  StrToAscii (IdStr, (CHAR8 **) &AsciiStr);\r
+\r
+  Bbs->StatusFlag = (UINT16) Xtoi (FlagsStr);\r
+\r
+  return (EFI_DEVICE_PATH_PROTOCOL *) Bbs;\r
+}\r
+\r
+GLOBAL_REMOVE_IF_UNREFERENCED DEVICE_PATH_FROM_TEXT_TABLE DevPathFromTextTable[] = {\r
+  {L"Pci", DevPathFromTextPci},\r
+  {L"PcCard", DevPathFromTextPcCard},\r
+  {L"MemoryMapped", DevPathFromTextMemoryMapped},\r
+  {L"VenHw", DevPathFromTextVenHw},\r
+  {L"Ctrl", DevPathFromTextCtrl},\r
+  {L"Acpi", DevPathFromTextAcpi},\r
+  {L"PciRoot", DevPathFromTextPciRoot},\r
+  {L"Floppy", DevPathFromTextFloppy},\r
+  {L"Keyboard", DevPathFromTextKeyboard},\r
+  {L"Serial", DevPathFromTextSerial},\r
+  {L"ParallelPort", DevPathFromTextParallelPort},\r
+  {L"AcpiEx", DevPathFromTextAcpiEx},\r
+  {L"AcpiExp", DevPathFromTextAcpiExp},\r
+  {L"Ata", DevPathFromTextAta},\r
+  {L"Scsi", DevPathFromTextScsi},\r
+  {L"Fibre", DevPathFromTextFibre},\r
+  {L"I1394", DevPathFromText1394},\r
+  {L"USB", DevPathFromTextUsb},\r
+  {L"I2O", DevPathFromTextI2O},\r
+  {L"Infiniband", DevPathFromTextInfiniband},\r
+  {L"VenMsg", DevPathFromTextVenMsg},\r
+  {L"VenPcAnsi", DevPathFromTextVenPcAnsi},\r
+  {L"VenVt100", DevPathFromTextVenVt100},\r
+  {L"VenVt100Plus", DevPathFromTextVenVt100Plus},\r
+  {L"VenUtf8", DevPathFromTextVenUtf8},\r
+  {L"UartFlowCtrl", DevPathFromTextUartFlowCtrl},\r
+  {L"SAS", DevPathFromTextSAS},\r
+  {L"DebugPort", DevPathFromTextDebugPort},\r
+  {L"MAC", DevPathFromTextMAC},\r
+  {L"IPv4", DevPathFromTextIPv4},\r
+  {L"IPv6", DevPathFromTextIPv6},\r
+  {L"Uart", DevPathFromTextUart},\r
+  {L"UsbClass", DevPathFromTextUsbClass},\r
+  {L"UsbAudio", DevPathFromTextUsbAudio},\r
+  {L"UsbCDCControl", DevPathFromTextUsbCDCControl},\r
+  {L"UsbHID", DevPathFromTextUsbHID},\r
+  {L"UsbImage", DevPathFromTextUsbImage},\r
+  {L"UsbPrinter", DevPathFromTextUsbPrinter},\r
+  {L"UsbMassStorage", DevPathFromTextUsbMassStorage},\r
+  {L"UsbHub", DevPathFromTextUsbHub},\r
+  {L"UsbCDCData", DevPathFromTextUsbCDCData},\r
+  {L"UsbSmartCard", DevPathFromTextUsbSmartCard},\r
+  {L"UsbVideo", DevPathFromTextUsbVideo},\r
+  {L"UsbDiagnostic", DevPathFromTextUsbDiagnostic},\r
+  {L"UsbWireless", DevPathFromTextUsbWireless},\r
+  {L"UsbDeviceFirmwareUpdate", DevPathFromTextUsbDeviceFirmwareUpdate},\r
+  {L"UsbIrdaBridge", DevPathFromTextUsbIrdaBridge},\r
+  {L"UsbTestAndMeasurement", DevPathFromTextUsbTestAndMeasurement},\r
+  {L"UsbWwid", DevPathFromTextUsbWwid},\r
+  {L"Unit", DevPathFromTextUnit},\r
+  {L"iSCSI", DevPathFromTextiSCSI},\r
+  {L"HD", DevPathFromTextHD},\r
+  {L"CDROM", DevPathFromTextCDROM},\r
+  {L"VenMEDIA", DevPathFromTextVenMEDIA},\r
+  {L"Media", DevPathFromTextMedia},\r
+  {L"BBS", DevPathFromTextBBS},\r
+  {NULL, NULL}\r
+};\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+ConvertTextToDeviceNode (\r
+  IN CONST CHAR16 *TextDeviceNode\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Convert text to the binary representation of a device node.\r
+\r
+  Arguments:\r
+    TextDeviceNode   -   TextDeviceNode points to the text representation of a device\r
+                         node. Conversion starts with the first character and continues\r
+                         until the first non-device node character.\r
+\r
+  Returns:\r
+    A pointer        -   Pointer to the EFI device node.\r
+    NULL             -   If TextDeviceNode is NULL or there was insufficient memory or text unsupported.\r
+\r
+--*/\r
+{\r
+  EFI_DEVICE_PATH_PROTOCOL * (*DumpNode) (CHAR16 *);\r
+  CHAR16                   *ParamStr;\r
+  EFI_DEVICE_PATH_PROTOCOL *DeviceNode;\r
+  CHAR16                   *DeviceNodeStr;\r
+  UINTN                    Index;\r
+\r
+  if ((TextDeviceNode == NULL) || (IS_NULL (*TextDeviceNode))) {\r
+    return NULL;\r
+  }\r
+\r
+  ParamStr      = NULL;\r
+  DumpNode      = NULL;\r
+  DeviceNodeStr = StrDuplicate (TextDeviceNode);\r
+\r
+  for (Index = 0; DevPathFromTextTable[Index].Function; Index++) {\r
+    ParamStr = GetParamByNodeName (DeviceNodeStr, DevPathFromTextTable[Index].DevicePathNodeText);\r
+    if (ParamStr != NULL) {\r
+      DumpNode = DevPathFromTextTable[Index].Function;\r
+      break;\r
+    }\r
+  }\r
+\r
+  if (DumpNode == NULL) {\r
+    //\r
+    // A file path\r
+    //\r
+    DumpNode = DevPathFromTextFilePath;\r
+    DeviceNode = DumpNode (DeviceNodeStr);\r
+  } else {\r
+    DeviceNode = DumpNode (ParamStr);\r
+    gBS->FreePool (ParamStr);\r
+  }\r
+\r
+  gBS->FreePool (DeviceNodeStr);\r
+\r
+  return DeviceNode;\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+ConvertTextToDevicePath (\r
+  IN CONST CHAR16 *TextDevicePath\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Convert text to the binary representation of a device path.\r
+\r
+  Arguments:\r
+    TextDevicePath   -   TextDevicePath points to the text representation of a device\r
+                         path. Conversion starts with the first character and continues\r
+                         until the first non-device node character.\r
+\r
+  Returns:\r
+    A pointer        -   Pointer to the allocated device path.\r
+    NULL             -   If TextDeviceNode is NULL or there was insufficient memory.\r
+\r
+--*/\r
+{\r
+  EFI_DEVICE_PATH_PROTOCOL * (*DumpNode) (CHAR16 *);\r
+  CHAR16                   *ParamStr;\r
+  EFI_DEVICE_PATH_PROTOCOL *DeviceNode;\r
+  UINTN                    Index;\r
+  EFI_DEVICE_PATH_PROTOCOL *NewDevicePath;\r
+  CHAR16                   *DevicePathStr;\r
+  CHAR16                   *Str;\r
+  CHAR16                   *DeviceNodeStr;\r
+  UINT8                    IsInstanceEnd;\r
+  EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
+\r
+  if ((TextDevicePath == NULL) || (IS_NULL (*TextDevicePath))) {\r
+    return NULL;\r
+  }\r
+\r
+  DevicePath = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);\r
+  SetDevicePathEndNode (DevicePath);\r
+\r
+  ParamStr            = NULL;\r
+  DeviceNodeStr       = NULL;\r
+  DevicePathStr       = StrDuplicate (TextDevicePath);\r
+\r
+  Str                 = DevicePathStr;\r
+  while ((DeviceNodeStr = GetNextDeviceNodeStr (&Str, &IsInstanceEnd)) != NULL) {\r
+    DumpNode = NULL;\r
+    for (Index = 0; DevPathFromTextTable[Index].Function; Index++) {\r
+      ParamStr = GetParamByNodeName (DeviceNodeStr, DevPathFromTextTable[Index].DevicePathNodeText);\r
+      if (ParamStr != NULL) {\r
+        DumpNode = DevPathFromTextTable[Index].Function;\r
+        break;\r
+      }\r
+    }\r
+\r
+    if (DumpNode == NULL) {\r
+      //\r
+      // A file path\r
+      //\r
+      DumpNode  = DevPathFromTextFilePath;\r
+      DeviceNode = DumpNode (DeviceNodeStr);\r
+    } else {\r
+      DeviceNode = DumpNode (ParamStr);\r
+      gBS->FreePool (ParamStr);\r
+    }\r
+\r
+    NewDevicePath = AppendDeviceNodeProtocolInterface (DevicePath, DeviceNode);\r
+    gBS->FreePool (DevicePath);\r
+    gBS->FreePool (DeviceNode);\r
+    DevicePath = NewDevicePath;\r
+\r
+    if (IsInstanceEnd) {\r
+      DeviceNode = (EFI_DEVICE_PATH_PROTOCOL *) AllocatePool (END_DEVICE_PATH_LENGTH);\r
+      SetDevicePathInstanceEndNode (DeviceNode);\r
+\r
+      NewDevicePath = AppendDeviceNodeProtocolInterface (DevicePath, DeviceNode);\r
+      gBS->FreePool (DevicePath);\r
+      gBS->FreePool (DeviceNode);\r
+      DevicePath = NewDevicePath;\r
+    }\r
+  }\r
+\r
+  gBS->FreePool (DevicePathStr);\r
+  return DevicePath;\r
+}\r
index a702595..548a534 100644 (file)
-/*++
-
-Copyright (c) 2006, Intel Corporation                                                     
-All rights reserved. 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.             
-
-Module Name:
-
-  DevicePathUtilities.c
-
-Abstract:
-
-  Implementation file for Device Path Utilities Protocol
-
---*/
-
-#include "DevicePath.h"
-
-UINTN
-GetDevicePathSizeProtocolInterface (
-  IN CONST EFI_DEVICE_PATH_PROTOCOL  *DevicePath
-  )
-/*++
-
-  Routine Description:
-    Returns the size of the device path, in bytes.
-
-  Arguments:
-    DevicePath  -   Points to the start of the EFI device path.
-
-  Returns:
-    Size        -   Size of the specified device path, in bytes, including the end-of-path tag.
-
---*/
-{
-  return GetDevicePathSize (DevicePath);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-DuplicateDevicePathProtocolInterface (
-  IN CONST EFI_DEVICE_PATH_PROTOCOL  *DevicePath
-  )
-/*++
-
-  Routine Description:
-    Create a duplicate of the specified path.
-
-  Arguments:
-    DevicePath  -   Points to the source EFI device path.
-
-  Returns:
-    Pointer     -   A pointer to the duplicate device path.
-    NULL        -   Insufficient memory.
-
---*/
-{
-  return DuplicateDevicePath (DevicePath);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-AppendDevicePathProtocolInterface (
-  IN CONST EFI_DEVICE_PATH_PROTOCOL *Src1,
-  IN CONST EFI_DEVICE_PATH_PROTOCOL *Src2
-  )
-/*++
-
-  Routine Description:
-    Create a new path by appending the second device path to the first.
-
-  Arguments:
-    Src1      -   Points to the first device path. If NULL, then it is ignored.
-    Src2      -   Points to the second device path. If NULL, then it is ignored.
-
-  Returns:
-    Pointer   -   A pointer to the newly created device path.
-    NULL      -   Memory could not be allocated
-                  or either DevicePath or DeviceNode is NULL.
-
---*/
-{
-  return AppendDevicePath (Src1, Src2);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-AppendDeviceNodeProtocolInterface (
-  IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,
-  IN CONST EFI_DEVICE_PATH_PROTOCOL *DeviceNode
-  )
-/*++
-
-  Routine Description:
-    Creates a new path by appending the device node to the device path.
-
-  Arguments:
-    DevicePath   -   Points to the device path.
-    DeviceNode   -   Points to the device node.
-
-  Returns:
-    Pointer      -   A pointer to the allocated device node.
-    NULL         -   Memory could not be allocated
-                     or either DevicePath or DeviceNode is NULL.
-
---*/
-{
-  return AppendDevicePathNode (DevicePath, DeviceNode);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-AppendDevicePathInstanceProtocolInterface (
-  IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,
-  IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePathInstance
-  )
-/*++
-
-  Routine Description:
-    Creates a new path by appending the specified device path instance to the specified device path.
-
-  Arguments:
-    DevicePath           -   Points to the device path. If NULL, then ignored.
-    DevicePathInstance   -   Points to the device path instance.
-
-  Returns:
-    Pointer              -   A pointer to the newly created device path
-    NULL                 -   Memory could not be allocated or DevicePathInstance is NULL.
-
---*/
-{
-  return AppendDevicePathInstance (DevicePath, DevicePathInstance);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-GetNextDevicePathInstanceProtocolInterface (
-  IN OUT EFI_DEVICE_PATH_PROTOCOL   **DevicePathInstance,
-  OUT UINTN                         *DevicePathInstanceSize
-  )
-/*++
-
-  Routine Description:
-    Creates a copy of the current device path instance and returns a pointer to the next device path instance.
-
-  Arguments:
-    DevicePathInstance       -   On input, this holds the pointer to the current device path
-                                 instance. On output, this holds the pointer to the next
-                                 device path instance or NULL if there are no more device
-                                 path instances in the device path.
-    DevicePathInstanceSize   -   On output, this holds the size of the device path instance,
-                                 in bytes or zero, if DevicePathInstance is zero.
-
-  Returns:
-    Pointer                  -   A pointer to the copy of the current device path instance.
-    NULL                     -   DevicePathInstace was NULL on entry or there was insufficient memory.
-
---*/
-{
-  return GetNextDevicePathInstance (DevicePathInstance, DevicePathInstanceSize);
-}
-
-BOOLEAN
-IsDevicePathMultiInstanceProtocolInterface (
-  IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath
-  )
-/*++
-
-  Routine Description:
-    Returns whether a device path is multi-instance.
-
-  Arguments:
-    DevicePath  -   Points to the device path. If NULL, then ignored.
-
-  Returns:
-    TRUE        -   The device path has more than one instance
-    FALSE       -   The device path is empty or contains only a single instance.
-
---*/
-{
-  return IsDevicePathMultiInstance (DevicePath);
-}
-
-EFI_DEVICE_PATH_PROTOCOL *
-CreateDeviceNodeProtocolInterface (
-  IN UINT8  NodeType,
-  IN UINT8  NodeSubType,
-  IN UINT16 NodeLength
-  )
-/*++
-
-  Routine Description:
-    Creates a device node
-
-  Arguments:
-    NodeType     -    NodeType is the device node type (EFI_DEVICE_PATH.Type) for
-                      the new device node.
-    NodeSubType  -    NodeSubType is the device node sub-type
-                      EFI_DEVICE_PATH.SubType) for the new device node.
-    NodeLength   -    NodeLength is the length of the device node
-                      (EFI_DEVICE_PATH.Length) for the new device node.
-
-  Returns:
-    Pointer      -    A pointer to the newly created device node.
-    NULL         -    NodeLength is less than
-                      the size of the header or there was insufficient memory.
-
---*/
-{
-  return CreateDeviceNode (NodeType, NodeSubType, NodeLength);
-}
+/*++\r
+\r
+Copyright (c) 2006, Intel Corporation                                                     \r
+All rights reserved. This program and the accompanying materials                          \r
+are licensed and made available under the terms and conditions of the BSD License         \r
+which accompanies this distribution.  The full text of the license may be found at        \r
+http://opensource.org/licenses/bsd-license.php                                            \r
+                                                                                          \r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     \r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             \r
+\r
+Module Name:\r
+\r
+  DevicePathUtilities.c\r
+\r
+Abstract:\r
+\r
+  Implementation file for Device Path Utilities Protocol\r
+\r
+--*/\r
+\r
+#include "DevicePath.h"\r
+\r
+UINTN\r
+GetDevicePathSizeProtocolInterface (\r
+  IN CONST EFI_DEVICE_PATH_PROTOCOL  *DevicePath\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Returns the size of the device path, in bytes.\r
+\r
+  Arguments:\r
+    DevicePath  -   Points to the start of the EFI device path.\r
+\r
+  Returns:\r
+    Size        -   Size of the specified device path, in bytes, including the end-of-path tag.\r
+\r
+--*/\r
+{\r
+  return GetDevicePathSize (DevicePath);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+DuplicateDevicePathProtocolInterface (\r
+  IN CONST EFI_DEVICE_PATH_PROTOCOL  *DevicePath\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Create a duplicate of the specified path.\r
+\r
+  Arguments:\r
+    DevicePath  -   Points to the source EFI device path.\r
+\r
+  Returns:\r
+    Pointer     -   A pointer to the duplicate device path.\r
+    NULL        -   Insufficient memory.\r
+\r
+--*/\r
+{\r
+  return DuplicateDevicePath (DevicePath);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+AppendDevicePathProtocolInterface (\r
+  IN CONST EFI_DEVICE_PATH_PROTOCOL *Src1,\r
+  IN CONST EFI_DEVICE_PATH_PROTOCOL *Src2\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Create a new path by appending the second device path to the first.\r
+\r
+  Arguments:\r
+    Src1      -   Points to the first device path. If NULL, then it is ignored.\r
+    Src2      -   Points to the second device path. If NULL, then it is ignored.\r
+\r
+  Returns:\r
+    Pointer   -   A pointer to the newly created device path.\r
+    NULL      -   Memory could not be allocated\r
+                  or either DevicePath or DeviceNode is NULL.\r
+\r
+--*/\r
+{\r
+  return AppendDevicePath (Src1, Src2);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+AppendDeviceNodeProtocolInterface (\r
+  IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
+  IN CONST EFI_DEVICE_PATH_PROTOCOL *DeviceNode\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Creates a new path by appending the device node to the device path.\r
+\r
+  Arguments:\r
+    DevicePath   -   Points to the device path.\r
+    DeviceNode   -   Points to the device node.\r
+\r
+  Returns:\r
+    Pointer      -   A pointer to the allocated device node.\r
+    NULL         -   Memory could not be allocated\r
+                     or either DevicePath or DeviceNode is NULL.\r
+\r
+--*/\r
+{\r
+  return AppendDevicePathNode (DevicePath, DeviceNode);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+AppendDevicePathInstanceProtocolInterface (\r
+  IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath,\r
+  IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePathInstance\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Creates a new path by appending the specified device path instance to the specified device path.\r
+\r
+  Arguments:\r
+    DevicePath           -   Points to the device path. If NULL, then ignored.\r
+    DevicePathInstance   -   Points to the device path instance.\r
+\r
+  Returns:\r
+    Pointer              -   A pointer to the newly created device path\r
+    NULL                 -   Memory could not be allocated or DevicePathInstance is NULL.\r
+\r
+--*/\r
+{\r
+  return AppendDevicePathInstance (DevicePath, DevicePathInstance);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+GetNextDevicePathInstanceProtocolInterface (\r
+  IN OUT EFI_DEVICE_PATH_PROTOCOL   **DevicePathInstance,\r
+  OUT UINTN                         *DevicePathInstanceSize\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Creates a copy of the current device path instance and returns a pointer to the next device path instance.\r
+\r
+  Arguments:\r
+    DevicePathInstance       -   On input, this holds the pointer to the current device path\r
+                                 instance. On output, this holds the pointer to the next\r
+                                 device path instance or NULL if there are no more device\r
+                                 path instances in the device path.\r
+    DevicePathInstanceSize   -   On output, this holds the size of the device path instance,\r
+                                 in bytes or zero, if DevicePathInstance is zero.\r
+\r
+  Returns:\r
+    Pointer                  -   A pointer to the copy of the current device path instance.\r
+    NULL                     -   DevicePathInstace was NULL on entry or there was insufficient memory.\r
+\r
+--*/\r
+{\r
+  return GetNextDevicePathInstance (DevicePathInstance, DevicePathInstanceSize);\r
+}\r
+\r
+BOOLEAN\r
+IsDevicePathMultiInstanceProtocolInterface (\r
+  IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Returns whether a device path is multi-instance.\r
+\r
+  Arguments:\r
+    DevicePath  -   Points to the device path. If NULL, then ignored.\r
+\r
+  Returns:\r
+    TRUE        -   The device path has more than one instance\r
+    FALSE       -   The device path is empty or contains only a single instance.\r
+\r
+--*/\r
+{\r
+  return IsDevicePathMultiInstance (DevicePath);\r
+}\r
+\r
+EFI_DEVICE_PATH_PROTOCOL *\r
+CreateDeviceNodeProtocolInterface (\r
+  IN UINT8  NodeType,\r
+  IN UINT8  NodeSubType,\r
+  IN UINT16 NodeLength\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Creates a device node\r
+\r
+  Arguments:\r
+    NodeType     -    NodeType is the device node type (EFI_DEVICE_PATH.Type) for\r
+                      the new device node.\r
+    NodeSubType  -    NodeSubType is the device node sub-type\r
+                      EFI_DEVICE_PATH.SubType) for the new device node.\r
+    NodeLength   -    NodeLength is the length of the device node\r
+                      (EFI_DEVICE_PATH.Length) for the new device node.\r
+\r
+  Returns:\r
+    Pointer      -    A pointer to the newly created device node.\r
+    NULL         -    NodeLength is less than\r
+                      the size of the header or there was insufficient memory.\r
+\r
+--*/\r
+{\r
+  return CreateDeviceNode (NodeType, NodeSubType, NodeLength);\r
+}\r
index 35d2a19..1cb26fe 100644 (file)
-/*++
-
-Copyright (c) 2006, Intel Corporation
-All rights reserved. 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.
-
-Module Name:
-
-  DiskIo.c
-
-Abstract:
-
-  DiskIo driver that layers it's self on every Block IO protocol in the system.
-  DiskIo converts a block oriented device to a byte oriented device.
-
-  ReadDisk may have to do reads that are not aligned on sector boundaries.
-  There are three cases:
-
-    UnderRun - The first byte is not on a sector boundary or the read request is
-               less than a sector in length.
-
-    Aligned  - A read of N contiguous sectors.
-
-    OverRun  - The last byte is not on a sector boundary.
-
---*/
-
-#include "DiskIo.h"
-
-//
-// Prototypes
-// Driver model protocol interface
-//
-EFI_STATUS
-EFIAPI
-DiskIoDriverBindingSupported (
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,
-  IN EFI_HANDLE                     ControllerHandle,
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath
-  );
-
-EFI_STATUS
-EFIAPI
-DiskIoDriverBindingStart (
-  IN EFI_DRIVER_BINDING_PROTOCOL    *This,
-  IN EFI_HANDLE                     ControllerHandle,
-  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath
-  );
-
-EFI_STATUS
-EFIAPI
-DiskIoDriverBindingStop (
-  IN  EFI_DRIVER_BINDING_PROTOCOL    *This,
-  IN  EFI_HANDLE                     ControllerHandle,
-  IN  UINTN                          NumberOfChildren,
-  IN  EFI_HANDLE                     *ChildHandleBuffer
-  );
-
-//
-// Disk I/O Protocol Interface
-//
-EFI_STATUS
-EFIAPI
-DiskIoReadDisk (
-  IN EFI_DISK_IO_PROTOCOL  *This,
-  IN UINT32                MediaId,
-  IN UINT64                Offset,
-  IN UINTN                 BufferSize,
-  OUT VOID                 *Buffer
-  );
-
-EFI_STATUS
-EFIAPI
-DiskIoWriteDisk (
-  IN EFI_DISK_IO_PROTOCOL  *This,
-  IN UINT32                MediaId,
-  IN UINT64                Offset,
-  IN UINTN                 BufferSize,
-  IN VOID                  *Buffer
-  );
-
-EFI_DRIVER_BINDING_PROTOCOL gDiskIoDriverBinding = {
-  DiskIoDriverBindingSupported,
-  DiskIoDriverBindingStart,
-  DiskIoDriverBindingStop,
-  0x10,
-  NULL,
-  NULL
-};
-
-DISK_IO_PRIVATE_DATA        gDiskIoPrivateDataTemplate = {
-  DISK_IO_PRIVATE_DATA_SIGNATURE,
-  {
-    EFI_DISK_IO_PROTOCOL_REVISION,
-    DiskIoReadDisk,
-    DiskIoWriteDisk
-  },
-  NULL
-};
-
-EFI_STATUS
-EFIAPI
-DiskIoDriverBindingSupported (
-  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
-  IN EFI_HANDLE                   ControllerHandle,
-  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
-  )
-/*++
-
-  Routine Description:
-    Test to see if this driver supports ControllerHandle. Any ControllerHandle
-    than contains a BlockIo protocol can be supported.
-
-  Arguments:
-    This                - Protocol instance pointer.
-    ControllerHandle    - Handle of device to test.
-    RemainingDevicePath - Not used.
-
-  Returns:
-    EFI_SUCCESS         - This driver supports this device.
-    EFI_ALREADY_STARTED - This driver is already running on this device.
-    other               - This driver does not support this device.
-
---*/
-{
-  EFI_STATUS            Status;
-  EFI_BLOCK_IO_PROTOCOL *BlockIo;
-
-  //
-  // Open the IO Abstraction(s) needed to perform the supported test.
-  //
-  Status = gBS->OpenProtocol (
-                  ControllerHandle,
-                  &gEfiBlockIoProtocolGuid,
-                  (VOID **) &BlockIo,
-                  This->DriverBindingHandle,
-                  ControllerHandle,
-                  EFI_OPEN_PROTOCOL_BY_DRIVER
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-  //
-  // Close the I/O Abstraction(s) used to perform the supported test.
-  //
-  gBS->CloseProtocol (
-        ControllerHandle,
-        &gEfiBlockIoProtocolGuid,
-        This->DriverBindingHandle,
-        ControllerHandle
-        );
-  return EFI_SUCCESS;
-}
-
-EFI_STATUS
-EFIAPI
-DiskIoDriverBindingStart (
-  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
-  IN EFI_HANDLE                   ControllerHandle,
-  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
-  )
-/*++
-
-  Routine Description:
-    Start this driver on ControllerHandle by opening a Block IO protocol and
-    installing a Disk IO protocol on ControllerHandle.
-
-  Arguments:
-    This                - Protocol instance pointer.
-    ControllerHandle    - Handle of device to bind driver to.
-    RemainingDevicePath - Not used, always produce all possible children.
-
-  Returns:
-    EFI_SUCCESS         - This driver is added to ControllerHandle.
-    EFI_ALREADY_STARTED - This driver is already running on ControllerHandle.
-    other               - This driver does not support this device.
-
---*/
-{
-  EFI_STATUS            Status;
-  DISK_IO_PRIVATE_DATA  *Private;
-
-  Private = NULL;
-
-  //
-  // Connect to the Block IO interface on ControllerHandle.
-  //
-  Status = gBS->OpenProtocol (
-                  ControllerHandle,
-                  &gEfiBlockIoProtocolGuid,
-                  (VOID **) &gDiskIoPrivateDataTemplate.BlockIo,
-                  This->DriverBindingHandle,
-                  ControllerHandle,
-                  EFI_OPEN_PROTOCOL_BY_DRIVER
-                  );
-  if (EFI_ERROR (Status)) {
-    return Status;
-  }
-  //
-  // Initialize the Disk IO device instance.
-  //
-  Private = AllocateCopyPool (sizeof (DISK_IO_PRIVATE_DATA), &gDiskIoPrivateDataTemplate);
-  if (Private == NULL) {
-    Status = EFI_OUT_OF_RESOURCES;
-    goto ErrorExit;
-  }
-  //
-  // Install protocol interfaces for the Disk IO device.
-  //
-  Status = gBS->InstallProtocolInterface (
-                  &ControllerHandle,
-                  &gEfiDiskIoProtocolGuid,
-                  EFI_NATIVE_INTERFACE,
-                  &Private->DiskIo
-                  );
-
-ErrorExit:
-  if (EFI_ERROR (Status)) {
-
-    if (Private != NULL) {
-      gBS->FreePool (Private);
-    }
-
-    gBS->CloseProtocol (
-          ControllerHandle,
-          &gEfiBlockIoProtocolGuid,
-          This->DriverBindingHandle,
-          ControllerHandle
-          );
-  }
-
-  return Status;
-}
-
-EFI_STATUS
-EFIAPI
-DiskIoDriverBindingStop (
-  IN  EFI_DRIVER_BINDING_PROTOCOL    *This,
-  IN  EFI_HANDLE                     ControllerHandle,
-  IN  UINTN                          NumberOfChildren,
-  IN  EFI_HANDLE                     *ChildHandleBuffer
-  )
-/*++
-
-  Routine Description:
-    Stop this driver on ControllerHandle by removing Disk IO protocol and closing
-    the Block IO protocol on ControllerHandle.
-
-  Arguments:
-    This              - Protocol instance pointer.
-    ControllerHandle  - Handle of device to stop driver on.
-    NumberOfChildren  - Not used.
-    ChildHandleBuffer - Not used.
-
-  Returns:
-    EFI_SUCCESS         - This driver is removed ControllerHandle.
-    other               - This driver was not removed from this device.
-    EFI_UNSUPPORTED
-
---*/
-{
-  EFI_STATUS            Status;
-  EFI_DISK_IO_PROTOCOL  *DiskIo;
-  DISK_IO_PRIVATE_DATA  *Private;
-
-  //
-  // Get our context back.
-  //
-  Status = gBS->OpenProtocol (
-                  ControllerHandle,
-                  &gEfiDiskIoProtocolGuid,
-                  (VOID **) &DiskIo,
-                  This->DriverBindingHandle,
-                  ControllerHandle,
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
-                  );
-  if (EFI_ERROR (Status)) {
-    return EFI_UNSUPPORTED;
-  }
-
-  Private = DISK_IO_PRIVATE_DATA_FROM_THIS (DiskIo);
-
-  Status = gBS->UninstallProtocolInterface (
-                  ControllerHandle,
-                  &gEfiDiskIoProtocolGuid,
-                  &Private->DiskIo
-                  );
-  if (!EFI_ERROR (Status)) {
-
-    Status = gBS->CloseProtocol (
-                    ControllerHandle,
-                    &gEfiBlockIoProtocolGuid,
-                    This->DriverBindingHandle,
-                    ControllerHandle
-                    );
-  }
-
-  if (!EFI_ERROR (Status)) {
-    gBS->FreePool (Private);
-  }
-
-  return Status;
-}
-
-EFI_STATUS
-EFIAPI
-DiskIoReadDisk (
-  IN EFI_DISK_IO_PROTOCOL  *This,
-  IN UINT32                MediaId,
-  IN UINT64                Offset,
-  IN UINTN                 BufferSize,
-  OUT VOID                 *Buffer
-  )
-/*++
-
-  Routine Description:
-    Read BufferSize bytes from Offset into Buffer.
-
-    Reads may support reads that are not aligned on
-    sector boundaries. There are three cases:
-
-      UnderRun - The first byte is not on a sector boundary or the read request is
-                 less than a sector in length.
-
-      Aligned  - A read of N contiguous sectors.
-
-      OverRun  - The last byte is not on a sector boundary.
-
-
-  Arguments:
-    This       - Protocol instance pointer.
-    MediaId    - Id of the media, changes every time the media is replaced.
-    Offset     - The starting byte offset to read from.
-    BufferSize - Size of Buffer.
-    Buffer     - Buffer containing read data.
-
-  Returns:
-    EFI_SUCCESS           - The data was read correctly from the device.
-    EFI_DEVICE_ERROR      - The device reported an error while performing the read.
-    EFI_NO_MEDIA          - There is no media in the device.
-    EFI_MEDIA_CHNAGED     - The MediaId does not matched the current device.
-    EFI_INVALID_PARAMETER - The read request contains device addresses that are not
-                            valid for the device.
-    EFI_OUT_OF_RESOURCES
-
---*/
-{
-  EFI_STATUS            Status;
-  DISK_IO_PRIVATE_DATA  *Private;
-  EFI_BLOCK_IO_PROTOCOL *BlockIo;
-  EFI_BLOCK_IO_MEDIA    *Media;
-  UINT32                BlockSize;
-  UINT64                Lba;
-  UINT64                OverRunLba;
-  UINT32                UnderRun;
-  UINT32                OverRun;
-  BOOLEAN               TransactionComplete;
-  UINTN                 WorkingBufferSize;
-  UINT8                 *WorkingBuffer;
-  UINTN                 Length;
-  UINT8                 *Data;
-  UINT8                 *PreData;
-  UINTN                 IsBufferAligned;
-  UINTN                 DataBufferSize;
-  BOOLEAN               LastRead;
-
-  Private   = DISK_IO_PRIVATE_DATA_FROM_THIS (This);
-
-  BlockIo   = Private->BlockIo;
-  Media     = BlockIo->Media;
-  BlockSize = Media->BlockSize;
-
-  if (Media->MediaId != MediaId) {
-    return EFI_MEDIA_CHANGED;
-  }
-
-  WorkingBuffer     = Buffer;
-  WorkingBufferSize = BufferSize;
-
-  //
-  // Allocate a temporary buffer for operation
-  //
-  DataBufferSize = BlockSize * DATA_BUFFER_BLOCK_NUM;
-
-  if (Media->IoAlign > 1) {
-    PreData = AllocatePool (DataBufferSize + Media->IoAlign);
-    Data    = PreData - ((UINTN) PreData & (Media->IoAlign - 1)) + Media->IoAlign;
-  } else {
-    PreData = AllocatePool (DataBufferSize);
-    Data    = PreData;
-  }
-
-  if (PreData == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  Lba                 = DivU64x32Remainder (Offset, BlockSize, &UnderRun);
-
-  Length              = BlockSize - UnderRun;
-  TransactionComplete = FALSE;
-
-  Status              = EFI_SUCCESS;
-  if (UnderRun != 0) {
-    //
-    // Offset starts in the middle of an Lba, so read the entire block.
-    //
-    Status = BlockIo->ReadBlocks (
-                        BlockIo,
-                        MediaId,
-                        Lba,
-                        BlockSize,
-                        Data
-                        );
-
-    if (EFI_ERROR (Status)) {
-      goto Done;
-    }
-
-    if (Length > BufferSize) {
-      Length              = BufferSize;
-      TransactionComplete = TRUE;
-    }
-
-    CopyMem (WorkingBuffer, Data + UnderRun, Length);
-
-    WorkingBuffer += Length;
-
-    WorkingBufferSize -= Length;
-    if (WorkingBufferSize == 0) {
-      goto Done;
-    }
-
-    Lba += 1;
-  }
-
-  OverRunLba = Lba + DivU64x32Remainder (WorkingBufferSize, BlockSize, &OverRun);
-
-  if (!TransactionComplete && WorkingBufferSize >= BlockSize) {
-    //
-    // If the DiskIo maps directly to a BlockIo device do the read.
-    //
-    if (OverRun != 0) {
-      WorkingBufferSize -= OverRun;
-    }
-    //
-    // Check buffer alignment
-    //
-    IsBufferAligned = (UINTN) WorkingBuffer & (UINTN) (Media->IoAlign - 1);
-
-    if (Media->IoAlign <= 1 || IsBufferAligned == 0) {
-      //
-      // Alignment is satisfied, so read them together
-      //
-      Status = BlockIo->ReadBlocks (
-                          BlockIo,
-                          MediaId,
-                          Lba,
-                          WorkingBufferSize,
-                          WorkingBuffer
-                          );
-
-      if (EFI_ERROR (Status)) {
-        goto Done;
-      }
-
-      WorkingBuffer += WorkingBufferSize;
-
-    } else {
-      //
-      // Use the allocated buffer instead of the original buffer
-      // to avoid alignment issue.
-      // Here, the allocated buffer (8-byte align) can satisfy the alignment
-      //
-      LastRead = FALSE;
-      do {
-        if (WorkingBufferSize <= DataBufferSize) {
-          //
-          // It is the last calling to readblocks in this loop
-          //
-          DataBufferSize  = WorkingBufferSize;
-          LastRead        = TRUE;
-        }
-
-        Status = BlockIo->ReadBlocks (
-                            BlockIo,
-                            MediaId,
-                            Lba,
-                            DataBufferSize,
-                            Data
-                            );
-        if (EFI_ERROR (Status)) {
-          goto Done;
-        }
-
-        CopyMem (WorkingBuffer, Data, DataBufferSize);
-        WorkingBufferSize -= DataBufferSize;
-        WorkingBuffer += DataBufferSize;
-        Lba += DATA_BUFFER_BLOCK_NUM;
-      } while (!LastRead);
-    }
-  }
-
-  if (!TransactionComplete && OverRun != 0) {
-    //
-    // Last read is not a complete block.
-    //
-    Status = BlockIo->ReadBlocks (
-                        BlockIo,
-                        MediaId,
-                        OverRunLba,
-                        BlockSize,
-                        Data
-                        );
-
-    if (EFI_ERROR (Status)) {
-      goto Done;
-    }
-
-    CopyMem (WorkingBuffer, Data, OverRun);
-  }
-
-Done:
-  if (PreData != NULL) {
-    gBS->FreePool (PreData);
-  }
-
-  return Status;
-}
-
-EFI_STATUS
-EFIAPI
-DiskIoWriteDisk (
-  IN EFI_DISK_IO_PROTOCOL  *This,
-  IN UINT32                MediaId,
-  IN UINT64                Offset,
-  IN UINTN                 BufferSize,
-  IN VOID                  *Buffer
-  )
-/*++
-
-  Routine Description:
-    Read BufferSize bytes from Offset into Buffer.
-
-    Writes may require a read modify write to support writes that are not
-    aligned on sector boundaries. There are three cases:
-
-      UnderRun - The first byte is not on a sector boundary or the write request
-                 is less than a sector in length. Read modify write is required.
-
-      Aligned  - A write of N contiguous sectors.
-
-      OverRun  - The last byte is not on a sector boundary. Read modified write
-                 required.
-
-  Arguments:
-    This       - Protocol instance pointer.
-    MediaId    - Id of the media, changes every time the media is replaced.
-    Offset     - The starting byte offset to read from.
-    BufferSize - Size of Buffer.
-    Buffer     - Buffer containing read data.
-
-  Returns:
-    EFI_SUCCESS           - The data was written correctly to the device.
-    EFI_WRITE_PROTECTED   - The device can not be written to.
-    EFI_DEVICE_ERROR      - The device reported an error while performing the write.
-    EFI_NO_MEDIA          - There is no media in the device.
-    EFI_MEDIA_CHNAGED     - The MediaId does not matched the current device.
-    EFI_INVALID_PARAMETER - The write request contains device addresses that are not
-                            valid for the device.
-    EFI_OUT_OF_RESOURCES
-
---*/
-{
-  EFI_STATUS            Status;
-  DISK_IO_PRIVATE_DATA  *Private;
-  EFI_BLOCK_IO_PROTOCOL *BlockIo;
-  EFI_BLOCK_IO_MEDIA    *Media;
-  UINT32                BlockSize;
-  UINT64                Lba;
-  UINT64                OverRunLba;
-  UINT32                UnderRun;
-  UINT32                OverRun;
-  BOOLEAN               TransactionComplete;
-  UINTN                 WorkingBufferSize;
-  UINT8                 *WorkingBuffer;
-  UINTN                 Length;
-  UINT8                 *Data;
-  UINT8                 *PreData;
-  UINTN                 IsBufferAligned;
-  UINTN                 DataBufferSize;
-  BOOLEAN               LastWrite;
-
-  Private   = DISK_IO_PRIVATE_DATA_FROM_THIS (This);
-
-  BlockIo   = Private->BlockIo;
-  Media     = BlockIo->Media;
-  BlockSize = Media->BlockSize;
-
-  if (Media->ReadOnly) {
-    return EFI_WRITE_PROTECTED;
-  }
-
-  if (Media->MediaId != MediaId) {
-    return EFI_MEDIA_CHANGED;
-  }
-
-  DataBufferSize = BlockSize * DATA_BUFFER_BLOCK_NUM;
-
-  if (Media->IoAlign > 1) {
-    PreData = AllocatePool (DataBufferSize + Media->IoAlign);
-    Data    = PreData - ((UINTN) PreData & (Media->IoAlign - 1)) + Media->IoAlign;
-  } else {
-    PreData = AllocatePool (DataBufferSize);
-    Data    = PreData;
-  }
-
-  if (PreData == NULL) {
-    return EFI_OUT_OF_RESOURCES;
-  }
-
-  WorkingBuffer       = Buffer;
-  WorkingBufferSize   = BufferSize;
-
-  Lba                 = DivU64x32Remainder (Offset, BlockSize, &UnderRun);
-
-  Length              = BlockSize - UnderRun;
-  TransactionComplete = FALSE;
-
-  Status              = EFI_SUCCESS;
-  if (UnderRun != 0) {
-    //
-    // Offset starts in the middle of an Lba, so do read modify write.
-    //
-    Status = BlockIo->ReadBlocks (
-                        BlockIo,
-                        MediaId,
-                        Lba,
-                        BlockSize,
-                        Data
-                        );
-
-    if (EFI_ERROR (Status)) {
-      goto Done;
-    }
-
-    if (Length > BufferSize) {
-      Length              = BufferSize;
-      TransactionComplete = TRUE;
-    }
-
-    CopyMem (Data + UnderRun, WorkingBuffer, Length);
-
-    Status = BlockIo->WriteBlocks (
-                        BlockIo,
-                        MediaId,
-                        Lba,
-                        BlockSize,
-                        Data
-                        );
-    if (EFI_ERROR (Status)) {
-      goto Done;
-    }
-
-    WorkingBuffer += Length;
-    WorkingBufferSize -= Length;
-    if (WorkingBufferSize == 0) {
-      goto Done;
-    }
-
-    Lba += 1;
-  }
-
-  OverRunLba = Lba + DivU64x32Remainder (WorkingBufferSize, BlockSize, &OverRun);
-
-  if (!TransactionComplete && WorkingBufferSize >= BlockSize) {
-    //
-    // If the DiskIo maps directly to a BlockIo device do the write.
-    //
-    if (OverRun != 0) {
-      WorkingBufferSize -= OverRun;
-    }
-    //
-    // Check buffer alignment
-    //
-    IsBufferAligned = (UINTN) WorkingBuffer & (UINTN) (Media->IoAlign - 1);
-
-    if (Media->IoAlign <= 1 || IsBufferAligned == 0) {
-      //
-      // Alignment is satisfied, so write them together
-      //
-      Status = BlockIo->WriteBlocks (
-                          BlockIo,
-                          MediaId,
-                          Lba,
-                          WorkingBufferSize,
-                          WorkingBuffer
-                          );
-
-      if (EFI_ERROR (Status)) {
-        goto Done;
-      }
-
-      WorkingBuffer += WorkingBufferSize;
-
-    } else {
-      //
-      // The buffer parameter is not aligned with the request
-      // So use the allocated instead.
-      // It can fit almost all the cases.
-      //
-      LastWrite = FALSE;
-      do {
-        if (WorkingBufferSize <= DataBufferSize) {
-          //
-          // It is the last calling to writeblocks in this loop
-          //
-          DataBufferSize  = WorkingBufferSize;
-          LastWrite       = TRUE;
-        }
-
-        CopyMem (Data, WorkingBuffer, DataBufferSize);
-        Status = BlockIo->WriteBlocks (
-                            BlockIo,
-                            MediaId,
-                            Lba,
-                            DataBufferSize,
-                            Data
-                            );
-        if (EFI_ERROR (Status)) {
-          goto Done;
-        }
-
-        WorkingBufferSize -= DataBufferSize;
-        WorkingBuffer += DataBufferSize;
-        Lba += DATA_BUFFER_BLOCK_NUM;
-      } while (!LastWrite);
-    }
-  }
-
-  if (!TransactionComplete && OverRun != 0) {
-    //
-    // Last bit is not a complete block, so do a read modify write.
-    //
-    Status = BlockIo->ReadBlocks (
-                        BlockIo,
-                        MediaId,
-                        OverRunLba,
-                        BlockSize,
-                        Data
-                        );
-
-    if (EFI_ERROR (Status)) {
-      goto Done;
-    }
-
-    CopyMem (Data, WorkingBuffer, OverRun);
-
-    Status = BlockIo->WriteBlocks (
-                        BlockIo,
-                        MediaId,
-                        OverRunLba,
-                        BlockSize,
-                        Data
-                        );
-    if (EFI_ERROR (Status)) {
-      goto Done;
-    }
-  }
-
-Done:
-  if (PreData != NULL) {
-    gBS->FreePool (PreData);
-  }
-
-  return Status;
-}
+/*++\r
+\r
+Copyright (c) 2006, Intel Corporation\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+Module Name:\r
+\r
+  DiskIo.c\r
+\r
+Abstract:\r
+\r
+  DiskIo driver that layers it's self on every Block IO protocol in the system.\r
+  DiskIo converts a block oriented device to a byte oriented device.\r
+\r
+  ReadDisk may have to do reads that are not aligned on sector boundaries.\r
+  There are three cases:\r
+\r
+    UnderRun - The first byte is not on a sector boundary or the read request is\r
+               less than a sector in length.\r
+\r
+    Aligned  - A read of N contiguous sectors.\r
+\r
+    OverRun  - The last byte is not on a sector boundary.\r
+\r
+--*/\r
+\r
+#include "DiskIo.h"\r
+\r
+//\r
+// Prototypes\r
+// Driver model protocol interface\r
+//\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoDriverBindingSupported (\r
+  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
+  IN EFI_HANDLE                     ControllerHandle,\r
+  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoDriverBindingStart (\r
+  IN EFI_DRIVER_BINDING_PROTOCOL    *This,\r
+  IN EFI_HANDLE                     ControllerHandle,\r
+  IN EFI_DEVICE_PATH_PROTOCOL       *RemainingDevicePath\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoDriverBindingStop (\r
+  IN  EFI_DRIVER_BINDING_PROTOCOL    *This,\r
+  IN  EFI_HANDLE                     ControllerHandle,\r
+  IN  UINTN                          NumberOfChildren,\r
+  IN  EFI_HANDLE                     *ChildHandleBuffer\r
+  );\r
+\r
+//\r
+// Disk I/O Protocol Interface\r
+//\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoReadDisk (\r
+  IN EFI_DISK_IO_PROTOCOL  *This,\r
+  IN UINT32                MediaId,\r
+  IN UINT64                Offset,\r
+  IN UINTN                 BufferSize,\r
+  OUT VOID                 *Buffer\r
+  );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoWriteDisk (\r
+  IN EFI_DISK_IO_PROTOCOL  *This,\r
+  IN UINT32                MediaId,\r
+  IN UINT64                Offset,\r
+  IN UINTN                 BufferSize,\r
+  IN VOID                  *Buffer\r
+  );\r
+\r
+EFI_DRIVER_BINDING_PROTOCOL gDiskIoDriverBinding = {\r
+  DiskIoDriverBindingSupported,\r
+  DiskIoDriverBindingStart,\r
+  DiskIoDriverBindingStop,\r
+  0x10,\r
+  NULL,\r
+  NULL\r
+};\r
+\r
+DISK_IO_PRIVATE_DATA        gDiskIoPrivateDataTemplate = {\r
+  DISK_IO_PRIVATE_DATA_SIGNATURE,\r
+  {\r
+    EFI_DISK_IO_PROTOCOL_REVISION,\r
+    DiskIoReadDisk,\r
+    DiskIoWriteDisk\r
+  },\r
+  NULL\r
+};\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoDriverBindingSupported (\r
+  IN EFI_DRIVER_BINDING_PROTOCOL  *This,\r
+  IN EFI_HANDLE                   ControllerHandle,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Test to see if this driver supports ControllerHandle. Any ControllerHandle\r
+    than contains a BlockIo protocol can be supported.\r
+\r
+  Arguments:\r
+    This                - Protocol instance pointer.\r
+    ControllerHandle    - Handle of device to test.\r
+    RemainingDevicePath - Not used.\r
+\r
+  Returns:\r
+    EFI_SUCCESS         - This driver supports this device.\r
+    EFI_ALREADY_STARTED - This driver is already running on this device.\r
+    other               - This driver does not support this device.\r
+\r
+--*/\r
+{\r
+  EFI_STATUS            Status;\r
+  EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
+\r
+  //\r
+  // Open the IO Abstraction(s) needed to perform the supported test.\r
+  //\r
+  Status = gBS->OpenProtocol (\r
+                  ControllerHandle,\r
+                  &gEfiBlockIoProtocolGuid,\r
+                  (VOID **) &BlockIo,\r
+                  This->DriverBindingHandle,\r
+                  ControllerHandle,\r
+                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+  //\r
+  // Close the I/O Abstraction(s) used to perform the supported test.\r
+  //\r
+  gBS->CloseProtocol (\r
+        ControllerHandle,\r
+        &gEfiBlockIoProtocolGuid,\r
+        This->DriverBindingHandle,\r
+        ControllerHandle\r
+        );\r
+  return EFI_SUCCESS;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoDriverBindingStart (\r
+  IN EFI_DRIVER_BINDING_PROTOCOL  *This,\r
+  IN EFI_HANDLE                   ControllerHandle,\r
+  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Start this driver on ControllerHandle by opening a Block IO protocol and\r
+    installing a Disk IO protocol on ControllerHandle.\r
+\r
+  Arguments:\r
+    This                - Protocol instance pointer.\r
+    ControllerHandle    - Handle of device to bind driver to.\r
+    RemainingDevicePath - Not used, always produce all possible children.\r
+\r
+  Returns:\r
+    EFI_SUCCESS         - This driver is added to ControllerHandle.\r
+    EFI_ALREADY_STARTED - This driver is already running on ControllerHandle.\r
+    other               - This driver does not support this device.\r
+\r
+--*/\r
+{\r
+  EFI_STATUS            Status;\r
+  DISK_IO_PRIVATE_DATA  *Private;\r
+\r
+  Private = NULL;\r
+\r
+  //\r
+  // Connect to the Block IO interface on ControllerHandle.\r
+  //\r
+  Status = gBS->OpenProtocol (\r
+                  ControllerHandle,\r
+                  &gEfiBlockIoProtocolGuid,\r
+                  (VOID **) &gDiskIoPrivateDataTemplate.BlockIo,\r
+                  This->DriverBindingHandle,\r
+                  ControllerHandle,\r
+                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return Status;\r
+  }\r
+  //\r
+  // Initialize the Disk IO device instance.\r
+  //\r
+  Private = AllocateCopyPool (sizeof (DISK_IO_PRIVATE_DATA), &gDiskIoPrivateDataTemplate);\r
+  if (Private == NULL) {\r
+    Status = EFI_OUT_OF_RESOURCES;\r
+    goto ErrorExit;\r
+  }\r
+  //\r
+  // Install protocol interfaces for the Disk IO device.\r
+  //\r
+  Status = gBS->InstallProtocolInterface (\r
+                  &ControllerHandle,\r
+                  &gEfiDiskIoProtocolGuid,\r
+                  EFI_NATIVE_INTERFACE,\r
+                  &Private->DiskIo\r
+                  );\r
+\r
+ErrorExit:\r
+  if (EFI_ERROR (Status)) {\r
+\r
+    if (Private != NULL) {\r
+      gBS->FreePool (Private);\r
+    }\r
+\r
+    gBS->CloseProtocol (\r
+          ControllerHandle,\r
+          &gEfiBlockIoProtocolGuid,\r
+          This->DriverBindingHandle,\r
+          ControllerHandle\r
+          );\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoDriverBindingStop (\r
+  IN  EFI_DRIVER_BINDING_PROTOCOL    *This,\r
+  IN  EFI_HANDLE                     ControllerHandle,\r
+  IN  UINTN                          NumberOfChildren,\r
+  IN  EFI_HANDLE                     *ChildHandleBuffer\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Stop this driver on ControllerHandle by removing Disk IO protocol and closing\r
+    the Block IO protocol on ControllerHandle.\r
+\r
+  Arguments:\r
+    This              - Protocol instance pointer.\r
+    ControllerHandle  - Handle of device to stop driver on.\r
+    NumberOfChildren  - Not used.\r
+    ChildHandleBuffer - Not used.\r
+\r
+  Returns:\r
+    EFI_SUCCESS         - This driver is removed ControllerHandle.\r
+    other               - This driver was not removed from this device.\r
+    EFI_UNSUPPORTED\r
+\r
+--*/\r
+{\r
+  EFI_STATUS            Status;\r
+  EFI_DISK_IO_PROTOCOL  *DiskIo;\r
+  DISK_IO_PRIVATE_DATA  *Private;\r
+\r
+  //\r
+  // Get our context back.\r
+  //\r
+  Status = gBS->OpenProtocol (\r
+                  ControllerHandle,\r
+                  &gEfiDiskIoProtocolGuid,\r
+                  (VOID **) &DiskIo,\r
+                  This->DriverBindingHandle,\r
+                  ControllerHandle,\r
+                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+                  );\r
+  if (EFI_ERROR (Status)) {\r
+    return EFI_UNSUPPORTED;\r
+  }\r
+\r
+  Private = DISK_IO_PRIVATE_DATA_FROM_THIS (DiskIo);\r
+\r
+  Status = gBS->UninstallProtocolInterface (\r
+                  ControllerHandle,\r
+                  &gEfiDiskIoProtocolGuid,\r
+                  &Private->DiskIo\r
+                  );\r
+  if (!EFI_ERROR (Status)) {\r
+\r
+    Status = gBS->CloseProtocol (\r
+                    ControllerHandle,\r
+                    &gEfiBlockIoProtocolGuid,\r
+                    This->DriverBindingHandle,\r
+                    ControllerHandle\r
+                    );\r
+  }\r
+\r
+  if (!EFI_ERROR (Status)) {\r
+    gBS->FreePool (Private);\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoReadDisk (\r
+  IN EFI_DISK_IO_PROTOCOL  *This,\r
+  IN UINT32                MediaId,\r
+  IN UINT64                Offset,\r
+  IN UINTN                 BufferSize,\r
+  OUT VOID                 *Buffer\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Read BufferSize bytes from Offset into Buffer.\r
+\r
+    Reads may support reads that are not aligned on\r
+    sector boundaries. There are three cases:\r
+\r
+      UnderRun - The first byte is not on a sector boundary or the read request is\r
+                 less than a sector in length.\r
+\r
+      Aligned  - A read of N contiguous sectors.\r
+\r
+      OverRun  - The last byte is not on a sector boundary.\r
+\r
+\r
+  Arguments:\r
+    This       - Protocol instance pointer.\r
+    MediaId    - Id of the media, changes every time the media is replaced.\r
+    Offset     - The starting byte offset to read from.\r
+    BufferSize - Size of Buffer.\r
+    Buffer     - Buffer containing read data.\r
+\r
+  Returns:\r
+    EFI_SUCCESS           - The data was read correctly from the device.\r
+    EFI_DEVICE_ERROR      - The device reported an error while performing the read.\r
+    EFI_NO_MEDIA          - There is no media in the device.\r
+    EFI_MEDIA_CHNAGED     - The MediaId does not matched the current device.\r
+    EFI_INVALID_PARAMETER - The read request contains device addresses that are not\r
+                            valid for the device.\r
+    EFI_OUT_OF_RESOURCES\r
+\r
+--*/\r
+{\r
+  EFI_STATUS            Status;\r
+  DISK_IO_PRIVATE_DATA  *Private;\r
+  EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
+  EFI_BLOCK_IO_MEDIA    *Media;\r
+  UINT32                BlockSize;\r
+  UINT64                Lba;\r
+  UINT64                OverRunLba;\r
+  UINT32                UnderRun;\r
+  UINT32                OverRun;\r
+  BOOLEAN               TransactionComplete;\r
+  UINTN                 WorkingBufferSize;\r
+  UINT8                 *WorkingBuffer;\r
+  UINTN                 Length;\r
+  UINT8                 *Data;\r
+  UINT8                 *PreData;\r
+  UINTN                 IsBufferAligned;\r
+  UINTN                 DataBufferSize;\r
+  BOOLEAN               LastRead;\r
+\r
+  Private   = DISK_IO_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+  BlockIo   = Private->BlockIo;\r
+  Media     = BlockIo->Media;\r
+  BlockSize = Media->BlockSize;\r
+\r
+  if (Media->MediaId != MediaId) {\r
+    return EFI_MEDIA_CHANGED;\r
+  }\r
+\r
+  WorkingBuffer     = Buffer;\r
+  WorkingBufferSize = BufferSize;\r
+\r
+  //\r
+  // Allocate a temporary buffer for operation\r
+  //\r
+  DataBufferSize = BlockSize * DATA_BUFFER_BLOCK_NUM;\r
+\r
+  if (Media->IoAlign > 1) {\r
+    PreData = AllocatePool (DataBufferSize + Media->IoAlign);\r
+    Data    = PreData - ((UINTN) PreData & (Media->IoAlign - 1)) + Media->IoAlign;\r
+  } else {\r
+    PreData = AllocatePool (DataBufferSize);\r
+    Data    = PreData;\r
+  }\r
+\r
+  if (PreData == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  Lba                 = DivU64x32Remainder (Offset, BlockSize, &UnderRun);\r
+\r
+  Length              = BlockSize - UnderRun;\r
+  TransactionComplete = FALSE;\r
+\r
+  Status              = EFI_SUCCESS;\r
+  if (UnderRun != 0) {\r
+    //\r
+    // Offset starts in the middle of an Lba, so read the entire block.\r
+    //\r
+    Status = BlockIo->ReadBlocks (\r
+                        BlockIo,\r
+                        MediaId,\r
+                        Lba,\r
+                        BlockSize,\r
+                        Data\r
+                        );\r
+\r
+    if (EFI_ERROR (Status)) {\r
+      goto Done;\r
+    }\r
+\r
+    if (Length > BufferSize) {\r
+      Length              = BufferSize;\r
+      TransactionComplete = TRUE;\r
+    }\r
+\r
+    CopyMem (WorkingBuffer, Data + UnderRun, Length);\r
+\r
+    WorkingBuffer += Length;\r
+\r
+    WorkingBufferSize -= Length;\r
+    if (WorkingBufferSize == 0) {\r
+      goto Done;\r
+    }\r
+\r
+    Lba += 1;\r
+  }\r
+\r
+  OverRunLba = Lba + DivU64x32Remainder (WorkingBufferSize, BlockSize, &OverRun);\r
+\r
+  if (!TransactionComplete && WorkingBufferSize >= BlockSize) {\r
+    //\r
+    // If the DiskIo maps directly to a BlockIo device do the read.\r
+    //\r
+    if (OverRun != 0) {\r
+      WorkingBufferSize -= OverRun;\r
+    }\r
+    //\r
+    // Check buffer alignment\r
+    //\r
+    IsBufferAligned = (UINTN) WorkingBuffer & (UINTN) (Media->IoAlign - 1);\r
+\r
+    if (Media->IoAlign <= 1 || IsBufferAligned == 0) {\r
+      //\r
+      // Alignment is satisfied, so read them together\r
+      //\r
+      Status = BlockIo->ReadBlocks (\r
+                          BlockIo,\r
+                          MediaId,\r
+                          Lba,\r
+                          WorkingBufferSize,\r
+                          WorkingBuffer\r
+                          );\r
+\r
+      if (EFI_ERROR (Status)) {\r
+        goto Done;\r
+      }\r
+\r
+      WorkingBuffer += WorkingBufferSize;\r
+\r
+    } else {\r
+      //\r
+      // Use the allocated buffer instead of the original buffer\r
+      // to avoid alignment issue.\r
+      // Here, the allocated buffer (8-byte align) can satisfy the alignment\r
+      //\r
+      LastRead = FALSE;\r
+      do {\r
+        if (WorkingBufferSize <= DataBufferSize) {\r
+          //\r
+          // It is the last calling to readblocks in this loop\r
+          //\r
+          DataBufferSize  = WorkingBufferSize;\r
+          LastRead        = TRUE;\r
+        }\r
+\r
+        Status = BlockIo->ReadBlocks (\r
+                            BlockIo,\r
+                            MediaId,\r
+                            Lba,\r
+                            DataBufferSize,\r
+                            Data\r
+                            );\r
+        if (EFI_ERROR (Status)) {\r
+          goto Done;\r
+        }\r
+\r
+        CopyMem (WorkingBuffer, Data, DataBufferSize);\r
+        WorkingBufferSize -= DataBufferSize;\r
+        WorkingBuffer += DataBufferSize;\r
+        Lba += DATA_BUFFER_BLOCK_NUM;\r
+      } while (!LastRead);\r
+    }\r
+  }\r
+\r
+  if (!TransactionComplete && OverRun != 0) {\r
+    //\r
+    // Last read is not a complete block.\r
+    //\r
+    Status = BlockIo->ReadBlocks (\r
+                        BlockIo,\r
+                        MediaId,\r
+                        OverRunLba,\r
+                        BlockSize,\r
+                        Data\r
+                        );\r
+\r
+    if (EFI_ERROR (Status)) {\r
+      goto Done;\r
+    }\r
+\r
+    CopyMem (WorkingBuffer, Data, OverRun);\r
+  }\r
+\r
+Done:\r
+  if (PreData != NULL) {\r
+    gBS->FreePool (PreData);\r
+  }\r
+\r
+  return Status;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+DiskIoWriteDisk (\r
+  IN EFI_DISK_IO_PROTOCOL  *This,\r
+  IN UINT32                MediaId,\r
+  IN UINT64                Offset,\r
+  IN UINTN                 BufferSize,\r
+  IN VOID                  *Buffer\r
+  )\r
+/*++\r
+\r
+  Routine Description:\r
+    Read BufferSize bytes from Offset into Buffer.\r
+\r
+    Writes may require a read modify write to support writes that are not\r
+    aligned on sector boundaries. There are three cases:\r
+\r
+      UnderRun - The first byte is not on a sector boundary or the write request\r
+                 is less than a sector in length. Read modify write is required.\r
+\r
+      Aligned  - A write of N contiguous sectors.\r
+\r
+      OverRun  - The last byte is not on a sector boundary. Read modified write\r
+                 required.\r
+\r
+  Arguments:\r
+    This       - Protocol instance pointer.\r
+    MediaId    - Id of the media, changes every time the media is replaced.\r
+    Offset     - The starting byte offset to read from.\r
+    BufferSize - Size of Buffer.\r
+    Buffer     - Buffer containing read data.\r
+\r
+  Returns:\r
+    EFI_SUCCESS           - The data was written correctly to the device.\r
+    EFI_WRITE_PROTECTED   - The device can not be written to.\r
+    EFI_DEVICE_ERROR      - The device reported an error while performing the write.\r
+    EFI_NO_MEDIA          - There is no media in the device.\r
+    EFI_MEDIA_CHNAGED     - The MediaId does not matched the current device.\r
+    EFI_INVALID_PARAMETER - The write request contains device addresses that are not\r
+                            valid for the device.\r
+    EFI_OUT_OF_RESOURCES\r
+\r
+--*/\r
+{\r
+  EFI_STATUS            Status;\r
+  DISK_IO_PRIVATE_DATA  *Private;\r
+  EFI_BLOCK_IO_PROTOCOL *BlockIo;\r
+  EFI_BLOCK_IO_MEDIA    *Media;\r
+  UINT32                BlockSize;\r
+  UINT64                Lba;\r
+  UINT64                OverRunLba;\r
+  UINT32                UnderRun;\r
+  UINT32                OverRun;\r
+  BOOLEAN               TransactionComplete;\r
+  UINTN                 WorkingBufferSize;\r
+  UINT8                 *WorkingBuffer;\r
+  UINTN                 Length;\r
+  UINT8                 *Data;\r
+  UINT8                 *PreData;\r
+  UINTN                 IsBufferAligned;\r
+  UINTN                 DataBufferSize;\r
+  BOOLEAN               LastWrite;\r
+\r
+  Private   = DISK_IO_PRIVATE_DATA_FROM_THIS (This);\r
+\r
+  BlockIo   = Private->BlockIo;\r
+  Media     = BlockIo->Media;\r
+  BlockSize = Media->BlockSize;\r
+\r
+  if (Media->ReadOnly) {\r
+    return EFI_WRITE_PROTECTED;\r
+  }\r
+\r
+  if (Media->MediaId != MediaId) {\r
+    return EFI_MEDIA_CHANGED;\r
+  }\r
+\r
+  DataBufferSize = BlockSize * DATA_BUFFER_BLOCK_NUM;\r
+\r
+  if (Media->IoAlign > 1) {\r
+    PreData = AllocatePool (DataBufferSize + Media->IoAlign);\r
+    Data    = PreData - ((UINTN) PreData & (Media->IoAlign - 1)) + Media->IoAlign;\r
+  } else {\r
+    PreData = AllocatePool (DataBufferSize);\r
+    Data    = PreData;\r
+  }\r
+\r
+  if (PreData == NULL) {\r
+    return EFI_OUT_OF_RESOURCES;\r
+  }\r
+\r
+  WorkingBuffer       = Buffer;\r
+  WorkingBufferSize   = BufferSize;\r
+\r
+  Lba                 = DivU64x32Remainder (Offset, BlockSize, &UnderRun);\r
+\r
+  Length              = BlockSize - UnderRun;\r
+  TransactionComplete = FALSE;\r
+\r
+  Status              = EFI_SUCCESS;\r
+  if (UnderRun != 0) {\r
+    //\r
+    // Offset starts in the middle of an Lba, so do read modify write.\r
+    //\r
+    Status = BlockIo->ReadBlocks (\r
+                        BlockIo,\r
+                        MediaId,\r
+                        Lba,\r
+                        BlockSize,\r
+                        Data\r
+                        );\r
+\r
+    if (EFI_ERROR (Status)) {\r
+      goto Done;\r
+    }\r
+\r
+    if (Length > BufferSize) {\r
+      Length              = BufferSize;\r
+      TransactionComplete = TRUE;\r
+    }\r
+\r
+    CopyMem (Data + UnderRun, WorkingBuffer, Length);\r
+\r
+    Status = BlockIo->WriteBlocks (\r
+                        BlockIo,\r
+                        MediaId,\r
+                        Lba,\r
+                        BlockSize,\r
+                        Data\r
+                        );\r
+    if (EFI_ERROR (Status)) {\r
+      goto Done;\r
+    }\r
+\r
+    WorkingBuffer += Length;\r
+    WorkingBufferSize -= Length;\r
+    if (WorkingBufferSize == 0) {\r
+      goto Done;\r
+    }\r
+\r
+    Lba += 1;\r
+  }\r
+\r
+  OverRunLba = Lba + DivU64x32Remainder (WorkingBufferSize, BlockSize, &OverRun);\r
+\r
+  if (!TransactionComplete && WorkingBufferSize >= BlockSize) {\r
+    //\r
+    // If the DiskIo maps directly to a BlockIo device do the write.\r
+    //\r
+    if (OverRun != 0) {\r
+      WorkingBufferSize -= OverRun;\r
+    }\r
+    //\r
+    // Check buffer alignment\r
+    //\r
+    IsBufferAligned = (UINTN) WorkingBuffer & (UINTN) (Media->IoAlign - 1);\r
+\r
+    if (Media->IoAlign <= 1 || IsBufferAligned == 0) {\r
+      //\r
+      // Alignment is satisfied, so write them together\r
+      //\r
+      Status = BlockIo->WriteBlocks (\r
+                          BlockIo,\r
+                          MediaId,\r
+                          Lba,\r
+                          WorkingBufferSize,\r
+                          WorkingBuffer\r
+                          );\r
+\r
+      if (EFI_ERROR (Status)) {\r
+        goto Done;\r
+      }\r
+\r
+      WorkingBuffer += WorkingBufferSize;\r
+\r
+    } else {\r
+      //\r
+      // The buffer parameter is not aligned with the request\r
+      // So use the allocated instead.\r
+      // It can fit almost all the cases.\r
+      //\r
+      LastWrite = FALSE;\r
+      do {\r
+        if (WorkingBufferSize <= DataBufferSize) {\r
+          //\r
+          // It is the last calling to writeblocks in this loop\r
+          //\r
+          DataBufferSize  = WorkingBufferSize;\r
+          LastWrite       = TRUE;\r
+        }\r
+\r
+        CopyMem (Data, WorkingBuffer, DataBufferSize);\r
+        Status = BlockIo->WriteBlocks (\r
+                            BlockIo,\r
+                            MediaId,\r
+                            Lba,\r
+                            DataBufferSize,\r
+                            Data\r
+                            );\r
+        if (EFI_ERROR (Status)) {\r
+          goto Done;\r
+        }\r
+\r
+        WorkingBufferSize -= DataBufferSize;\r
+        WorkingBuffer += DataBufferSize;\r
+        Lba += DATA_BUFFER_BLOCK_NUM;\r
+      } while (!LastWrite);\r
+    }\r
+  }\r
+\r
+  if (!TransactionComplete && OverRun != 0) {\r
+    //\r
+    // Last bit is not a complete block, so do a read modify write.\r
+    //\r
+    Status = BlockIo->ReadBlocks (\r
+                        BlockIo,\r
+                        MediaId,\r
+                        OverRunLba,\r
+                        BlockSize,\r
+                        Data\r
+                        );\r
+\r
+    if (EFI_ERROR (Status)) {\r
+      goto Done;\r
+    }\r
+\r
+    CopyMem (Data, WorkingBuffer, OverRun);\r
+\r
+    Status = BlockIo->WriteBlocks (\r
+                        BlockIo,\r
+                        MediaId,\r
+                        OverRunLba,\r
+                        BlockSize,\r
+                        Data\r
+                        );\r
+    if (EFI_ERROR (Status)) {\r
+      goto Done;\r
+    }\r
+  }\r
+\r
+Done:\r
+  if (PreData != NULL) {\r
+    gBS->FreePool (PreData);\r
+  }\r
+\r
+  return Status;\r
+}\r
index 5bb54a2..43fe3fd 100644 (file)
@@ -27,7 +27,7 @@
                         This includes information about the class and subclass that is used to classify the entity \r
                         as well as an operation.  For progress codes, the operation is the current activity.  \r
                         For error codes, it is the exception.  For debug codes, it is not defined at this time.  \r
-                        Type EFI_STATUS_CODE_VALUE is defined in ¡°Related Definitions¡± below.  \r
+                        Type EFI_STATUS_CODE_VALUE is defined in "Related Definitions" below.  \r
                         Specific values are discussed in the Intel? Platform Innovation Framework for EFI Status Code Specification.\r
   @param  Instance      The enumeration of a hardware or software entity within the system.  \r
                         A system may contain multiple entities that match a class/subclass pairing.  \r
@@ -122,7 +122,7 @@ DxeStatusCodeDriverEntry (
                         This includes information about the class and subclass that is used to classify the entity \r
                         as well as an operation.  For progress codes, the operation is the current activity.  \r
                         For error codes, it is the exception.  For debug codes, it is not defined at this time.  \r
-                        Type EFI_STATUS_CODE_VALUE is defined in ¡°Related Definitions¡± below.  \r
+                        Type EFI_STATUS_CODE_VALUE is defined in "Related Definitions" below.  \r
                         Specific values are discussed in the Intel? Platform Innovation Framework for EFI Status Code Specification.\r
   @param  Instance      The enumeration of a hardware or software entity within the system.  \r
                         A system may contain multiple entities that match a class/subclass pairing.  \r
@@ -206,7 +206,7 @@ ReportDispatcher (
   to virtual address.\r
 \r
   @param  Event         Event whose notification function is being invoked.\r
-  @param  Context       Pointer to the notification function¡¯s context, which is\r
+  @param  Context       Pointer to the notification function's context, which is\r
                         always zero in current implementation.\r
 \r
 **/\r
index 1598397..c5da322 100644 (file)
@@ -88,13 +88,13 @@ FreeRecordBuffer (
 /**\r
   Report status code into DataHub.\r
  \r
-  @param  CodeType      Indicates the type of status code being reported.  Type EFI_STATUS_CODE_TYPE is defined in "Related Definitions¡± below.\r
+  @param  CodeType      Indicates the type of status code being reported.  Type EFI_STATUS_CODE_TYPE is defined in "Related Definitions" below.\r
  \r
   @param  Value         Describes the current status of a hardware or software entity.  \r
                         This included information about the class and subclass that is used to classify the entity \r
                         as well as an operation.  For progress codes, the operation is the current activity. \r
                         For error codes, it is the exception.  For debug codes, it is not defined at this time. \r
-                        Type EFI_STATUS_CODE_VALUE is defined in ¡°Related Definitions¡± below.  \r
+                        Type EFI_STATUS_CODE_VALUE is defined in "Related Definitions" below.  \r
                         Specific values are discussed in the Intel? Platform Innovation Framework for EFI Status Code Specification.\r
  \r
   @param  Instance      The enumeration of a hardware or software entity within the system.  \r
index 16fa3e8..e03dc37 100644 (file)
@@ -102,13 +102,13 @@ EfiSerialStatusCodeInitializeWorker (
 /**\r
   Convert status code value and extended data to readable ASCII string, send string to serial I/O device.\r
  \r
-  @param  CodeType      Indicates the type of status code being reported.  Type EFI_STATUS_CODE_TYPE is defined in "Related Definitions¡± below.\r
+  @param  CodeType      Indicates the type of status code being reported.  Type EFI_STATUS_CODE_TYPE is defined in "Related Definitions" below.\r
  \r
   @param  Value         Describes the current status of a hardware or software entity.  \r
                         This included information about the class and subclass that is used to classify the entity \r
                         as well as an operation.  For progress codes, the operation is the current activity. \r
                         For error codes, it is the exception.  For debug codes, it is not defined at this time. \r
-                        Type EFI_STATUS_CODE_VALUE is defined in ¡°Related Definitions¡± below.  \r
+                        Type EFI_STATUS_CODE_VALUE is defined in "Related Definitions" below.  \r
                         Specific values are discussed in the Intel? Platform Innovation Framework for EFI Status Code Specification.\r
  \r
   @param  Instance      The enumeration of a hardware or software entity within the system.  \r