Revision: 16601
          http://sourceforge.net/p/edk2/code/16601
Author:   darylm503
Date:     2015-01-13 01:04:07 +0000 (Tue, 13 Jan 2015)
Log Message:
-----------
MdeModulePkg, MdePkg, NetworkPkg, OvmfPkg, PerformancePkg, ShellPkg: Library 
Migration.

Move libraries from ShellPkg into MdeModulePkg and MdePkg.

The following libraries are being migrated out of ShellPkg in order to make
their functionality more widely available.
  ?\226?\128?\162 PathLib:        Incorporate into MdePkg/Library/BaseLib
  ?\226?\128?\162 FileHandleLib:  MdePkg/Library/UefiFileHandleLib
  ?\226?\128?\162 BaseSortLib:    MdeModulePkg/Library/BaseSortLib
  ?\226?\128?\162 UefiSortLib:    MdeModulePkg/Library/UefiSortLib

Diffs showing file changes are in the attached file, LibMigration.patch.
A description of the changes follows:

  ?\226?\128?\162 Move ShellPkg/Include/Library/FileHandleLib.h to 
MdePkg/Include/Library/FileHandleLib.h
  ?\226?\128?\162 Move ShellPkg/Include/Library/SortLib.h to 
MdeModulePkg/Include/Library/SortLib.h
  ?\226?\128?\162 Move ShellPkg/Library/BaseSortLib to 
MdeModulePkg/Library/BaseSortLib
  ?\226?\128?\162 Move ShellPkg/Library/UefiSortLib to 
MdeModulePkg/Library/UefiSortLib
  ?\226?\128?\162 Move ShellPkg/Library/BasePathLib/BasePathLib.c to 
MdePkg/Library/BaseLib/FilePaths.c
  ?\226?\128?\162 Merge ShellPkg/Include/Library/PathLib.h into 
MdePkg/Include/Library/BaseLib.h
  ?\226?\128?\162 Delete  ShellPkg/Library/BasePathLib; Includes BasePathLib.c 
and BasePathLib.inf

  ?\226?\128?\162 NetworkPkg/NetworkPkg.dsc
  ?\226?\128?\162 PerformancePkg.dsc
  ?\226?\128?\162 OvmfPkg/OvmfPkgX64.dsc
  ?\226?\128?\162 OvmfPkg/OvmfPkgIa32X64.dsc
  ?\226?\128?\162 OvmfPkg/OvmfPkgIa32.dsc
    o Update SortLib and FileHandleLib library classes to point to the new 
library locations.
    o Remove PathLib library class and make sure that BaseLib is described.

  ?\226?\128?\162 MdeModulePkg/MdeModulePkg.dec
    o Add SortLib library class

  ?\226?\128?\162 MdePkg/MdePkg.dec
    o Add FileHandleLib library class
    o Add PcdUefiFileHandleLibPrintBufferSize PCD

  ?\226?\128?\162 MdePkg/Library/BaseLib/BaseLib.inf
    o Add FilePaths.c to [Sources]

  ?\226?\128?\162 MdePkg/Include/Library/BaseLib.h
    o Update file description to include "file path functions"

  ?\226?\128?\162 ShellPkg/ShellPkg.dsc
    o Change PACKAGE_GUID to { C1014BB7-4092-43D4-984F-0738EB424DBF }
    o Update PACKAGE_VERSION to 1.0
    o Update SortLib and FileHandleLib library classes to point to the new 
library locations.
    o Remove PathLib library class and make sure that BaseLib is described.
    o Remove ShellPkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf from 
[Components]

  ?\226?\128?\162 ShellPkg/ShellPkg.dec
    o Update PLATFORM_VERSION to 1.0
    o Remove declarations of the FileHandleLib, SortLib, and PathLib Library 
Classes
    o Update comment for the PcdShellPrintBufferSize PCD.

  ?\226?\128?\162 
ShellPkg/Library/UefiShellLevel2CommandsLib/UefiShellLevel2CommandsLib.inf
  ?\226?\128?\162 ShellPkg/Application/Shell/Shell.inf
    o Remove PathLib from [LibraryClasses]

  ?\226?\128?\162 
ShellPkg/Library/UefiShellLevel2CommandsLib/UefiShellLevel2CommandsLib.h
  ?\226?\128?\162 ShellPkg/Application/Shell/Shell.h
    o Remove #include <Library/PathLib.h>

  ?\226?\128?\162 
ShellPkg/Library/UefiShellLevel1CommandsLib/UefiShellLevel1CommandsLib.inf
    o Add PathLib to [LibraryClasses]

  ?\226?\128?\162 ShellPkg/Library/UefiShellLevel1CommandsLib/If.c
    o Remove #include <Library/PathLib.h>

  ?\226?\128?\162 ShellPkg/Application/ShellSortTestApp/ShellSortTestApp.inf
    o Add MdeModulePkg/MdeModulePkg.dec to [Packages]

  ?\226?\128?\162 MdeModulePkg/Library/BaseSortLib/BaseSortLib.inf
  ?\226?\128?\162 MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
    o Replace ShellPkg.dec with MdeModulePkg.dec in [Packages]

  ?\226?\128?\162 MdeModulePkg/Library/UefiSortLib/UefiSortLib.c
    o Remove #include <ShellBase.h>
    o Define USL_FREE_NON_NULL() to replace SHELL_FREE_NON_NULL()

Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by: Daryl McDaniel <[email protected]>
Reviewed-by: Jaben Carsey <[email protected]>
Reviewed-by: Erik Bjorge <[email protected]>

Modified Paths:
--------------
    trunk/edk2/MdeModulePkg/MdeModulePkg.dec
    trunk/edk2/MdePkg/Include/Library/BaseLib.h
    trunk/edk2/MdePkg/Library/BaseLib/BaseLib.inf
    trunk/edk2/MdePkg/MdePkg.dec
    trunk/edk2/NetworkPkg/NetworkPkg.dsc
    trunk/edk2/OvmfPkg/OvmfPkgIa32.dsc
    trunk/edk2/OvmfPkg/OvmfPkgIa32X64.dsc
    trunk/edk2/OvmfPkg/OvmfPkgX64.dsc
    trunk/edk2/PerformancePkg/PerformancePkg.dsc
    trunk/edk2/ShellPkg/Application/Shell/Shell.h
    trunk/edk2/ShellPkg/Application/Shell/Shell.inf
    trunk/edk2/ShellPkg/Application/ShellSortTestApp/ShellSortTestApp.inf
    trunk/edk2/ShellPkg/Library/UefiShellLevel1CommandsLib/If.c
    
trunk/edk2/ShellPkg/Library/UefiShellLevel1CommandsLib/UefiShellLevel1CommandsLib.inf
    
trunk/edk2/ShellPkg/Library/UefiShellLevel2CommandsLib/UefiShellLevel2CommandsLib.h
    
trunk/edk2/ShellPkg/Library/UefiShellLevel2CommandsLib/UefiShellLevel2CommandsLib.inf
    trunk/edk2/ShellPkg/ShellPkg.dec
    trunk/edk2/ShellPkg/ShellPkg.dsc

Added Paths:
-----------
    trunk/edk2/MdeModulePkg/Include/Library/SortLib.h
    trunk/edk2/MdeModulePkg/Library/BaseSortLib/
    trunk/edk2/MdeModulePkg/Library/BaseSortLib/BaseSortLib.c
    trunk/edk2/MdeModulePkg/Library/BaseSortLib/BaseSortLib.inf
    trunk/edk2/MdeModulePkg/Library/UefiSortLib/
    trunk/edk2/MdeModulePkg/Library/UefiSortLib/UefiSortLib.c
    trunk/edk2/MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
    trunk/edk2/MdePkg/Include/Library/FileHandleLib.h
    trunk/edk2/MdePkg/Library/BaseLib/FilePaths.c
    trunk/edk2/MdePkg/Library/UefiFileHandleLib/
    trunk/edk2/MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.c
    trunk/edk2/MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf

Removed Paths:
-------------
    trunk/edk2/ShellPkg/Include/Library/FileHandleLib.h
    trunk/edk2/ShellPkg/Include/Library/PathLib.h
    trunk/edk2/ShellPkg/Include/Library/SortLib.h
    trunk/edk2/ShellPkg/Library/BasePathLib/
    trunk/edk2/ShellPkg/Library/BaseSortLib/
    trunk/edk2/ShellPkg/Library/UefiFileHandleLib/
    trunk/edk2/ShellPkg/Library/UefiSortLib/

Added: trunk/edk2/MdeModulePkg/Include/Library/SortLib.h
===================================================================
--- trunk/edk2/MdeModulePkg/Include/Library/SortLib.h                           
(rev 0)
+++ trunk/edk2/MdeModulePkg/Include/Library/SortLib.h   2015-01-13 01:04:07 UTC 
(rev 16601)
@@ -0,0 +1,113 @@
+/** @file
+  Library used for sorting and comparison routines.
+
+  Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved. <BR>
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD 
License
+  which accompanies this distribution.  The full text of the license may be 
found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+#ifndef __SORT_LIB_H__
+#define __SORT_LIB_H__
+
+/**
+  Prototype for comparison function for any two element types.
+
+  @param[in] Buffer1                  The pointer to first buffer.
+  @param[in] Buffer2                  The pointer to second buffer.
+
+  @retval 0                           Buffer1 equal to Buffer2.
+  @return <0                          Buffer1 is less than Buffer2.
+  @return >0                          Buffer1 is greater than Buffer2.
+**/
+typedef
+INTN
+(EFIAPI *SORT_COMPARE)(
+  IN CONST VOID                 *Buffer1,
+  IN CONST VOID                 *Buffer2
+  );
+
+/**
+  Function to perform a Quick Sort on a buffer of comparable elements.
+
+  Each element must be equally sized.
+
+  If BufferToSort is NULL, then ASSERT.
+  If CompareFunction is NULL, then ASSERT.
+
+  If Count is < 2 , then perform no action.
+  If Size is < 1 , then perform no action.
+
+  @param[in, out] BufferToSort   On call, a Buffer of (possibly sorted) 
elements;
+                                 on return, a buffer of sorted elements.
+  @param[in]  Count              The number of elements in the buffer to sort.
+  @param[in]  ElementSize        The size of an element in bytes.
+  @param[in]  CompareFunction    The function to call to perform the comparison
+                                 of any two elements.
+**/
+VOID
+EFIAPI
+PerformQuickSort (
+  IN OUT VOID                   *BufferToSort,
+  IN CONST UINTN                Count,
+  IN CONST UINTN                ElementSize,
+  IN       SORT_COMPARE         CompareFunction
+  );
+
+
+/**
+  Function to compare 2 device paths for use as CompareFunction.
+
+  @param[in] Buffer1            The pointer to Device Path to compare.
+  @param[in] Buffer2            The pointer to second DevicePath to compare.
+
+  @retval 0                     Buffer1 equal to Buffer2.
+  @return < 0                   Buffer1 is less than Buffer2.
+  @return > 0                   Buffer1 is greater than Buffer2.
+**/
+INTN
+EFIAPI
+DevicePathCompare (
+  IN  CONST VOID                *Buffer1,
+  IN  CONST VOID                *Buffer2
+  );
+
+/**
+  Function to compare 2 strings without regard to case of the characters.
+
+  @param[in] Buffer1            The pointer to String to compare (CHAR16**).
+  @param[in] Buffer2            The pointer to second String to compare 
(CHAR16**).
+
+  @retval 0                     Buffer1 equal to Buffer2.
+  @return < 0                   Buffer1 is less than Buffer2.
+  @return > 0                   Buffer1 is greater than Buffer2.
+**/
+INTN
+EFIAPI
+StringNoCaseCompare (
+  IN  CONST VOID                *Buffer1,
+  IN  CONST VOID                *Buffer2
+  );
+
+/**
+  Function to compare 2 strings.
+
+  @param[in] Buffer1            The pointer to String to compare (CHAR16**).
+  @param[in] Buffer2            The pointer to second String to compare 
(CHAR16**).
+
+  @retval 0                     Buffer1 equal to Buffer2.
+  @return < 0                   Buffer1 is less than Buffer2.
+  @return > 0                   Buffer1 is greater than Buffer2.
+**/
+INTN
+EFIAPI
+StringCompare (
+  IN  CONST VOID                *Buffer1,
+  IN  CONST VOID                *Buffer2
+  );
+
+#endif //__SORT_LIB_H__

Added: trunk/edk2/MdeModulePkg/Library/BaseSortLib/BaseSortLib.c
===================================================================
--- trunk/edk2/MdeModulePkg/Library/BaseSortLib/BaseSortLib.c                   
        (rev 0)
+++ trunk/edk2/MdeModulePkg/Library/BaseSortLib/BaseSortLib.c   2015-01-13 
01:04:07 UTC (rev 16601)
@@ -0,0 +1,238 @@
+/** @file
+  Library used for sorting routines.
+
+  Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved. <BR>
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD 
License
+  which accompanies this distribution.  The full text of the license may be 
found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+#include <Uefi.h>
+
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/SortLib.h>
+
+/**
+  Worker function for QuickSorting.  This function is identical to 
PerformQuickSort,
+  except that is uses the pre-allocated buffer so the in place sorting does 
not need to
+  allocate and free buffers constantly.
+
+  Each element must be equal sized.
+
+  if BufferToSort is NULL, then ASSERT.
+  if CompareFunction is NULL, then ASSERT.
+  if Buffer is NULL, then ASSERT.
+
+  if Count is < 2 then perform no action.
+  if Size is < 1 then perform no action.
+
+  @param[in, out] BufferToSort   on call a Buffer of (possibly sorted) elements
+                                 on return a buffer of sorted elements
+  @param[in] Count               the number of elements in the buffer to sort
+  @param[in] ElementSize         Size of an element in bytes
+  @param[in] CompareFunction     The function to call to perform the comparison
+                                 of any 2 elements
+  @param[in] Buffer              Buffer of size ElementSize for use in swapping
+**/
+VOID
+EFIAPI
+QuickSortWorker (
+  IN OUT VOID                           *BufferToSort,
+  IN CONST UINTN                        Count,
+  IN CONST UINTN                        ElementSize,
+  IN       SORT_COMPARE                 CompareFunction,
+  IN VOID                               *Buffer
+  )
+{
+  VOID        *Pivot;
+  UINTN       LoopCount;
+  UINTN       NextSwapLocation;
+
+  ASSERT(BufferToSort     != NULL);
+  ASSERT(CompareFunction  != NULL);
+  ASSERT(Buffer  != NULL);
+
+  if ( Count < 2
+    || ElementSize  < 1
+   ){
+    return;
+  }
+
+  NextSwapLocation = 0;
+
+  //
+  // pick a pivot (we choose last element)
+  //
+  Pivot = ((UINT8*)BufferToSort+((Count-1)*ElementSize));
+
+  //
+  // Now get the pivot such that all on "left" are below it
+  // and everything "right" are above it
+  //
+  for ( LoopCount = 0
+      ; LoopCount < Count -1
+      ; LoopCount++
+     ){
+    //
+    // if the element is less than the pivot
+    //
+    if 
(CompareFunction((VOID*)((UINT8*)BufferToSort+((LoopCount)*ElementSize)),Pivot) 
<= 0){
+      //
+      // swap
+      //
+      CopyMem (Buffer, (UINT8*)BufferToSort+(NextSwapLocation*ElementSize), 
ElementSize);
+      CopyMem ((UINT8*)BufferToSort+(NextSwapLocation*ElementSize), 
(UINT8*)BufferToSort+((LoopCount)*ElementSize), ElementSize);
+      CopyMem ((UINT8*)BufferToSort+((LoopCount)*ElementSize), Buffer, 
ElementSize);
+
+      //
+      // increment NextSwapLocation
+      //
+      NextSwapLocation++;
+    }
+  }
+  //
+  // swap pivot to it's final position (NextSwapLocaiton)
+  //
+  CopyMem (Buffer, Pivot, ElementSize);
+  CopyMem (Pivot, (UINT8*)BufferToSort+(NextSwapLocation*ElementSize), 
ElementSize);
+  CopyMem ((UINT8*)BufferToSort+(NextSwapLocation*ElementSize), Buffer, 
ElementSize);
+
+  //
+  // Now recurse on 2 paritial lists.  neither of these will have the 'pivot' 
element
+  // IE list is sorted left half, pivot element, sorted right half...
+  //
+  if (NextSwapLocation >= 2) {
+    QuickSortWorker(
+      BufferToSort,
+      NextSwapLocation,
+      ElementSize,
+      CompareFunction,
+      Buffer);
+  }
+
+  if ((Count - NextSwapLocation - 1) >= 2) {
+    QuickSortWorker(
+      (UINT8 *)BufferToSort + (NextSwapLocation+1) * ElementSize,
+      Count - NextSwapLocation - 1,
+      ElementSize,
+      CompareFunction,
+      Buffer);
+  }
+  return;
+}
+/**
+  Function to perform a Quick Sort alogrithm on a buffer of comparable 
elements.
+
+  Each element must be equal sized.
+
+  if BufferToSort is NULL, then ASSERT.
+  if CompareFunction is NULL, then ASSERT.
+
+  if Count is < 2 then perform no action.
+  if Size is < 1 then perform no action.
+
+  @param[in, out] BufferToSort   on call a Buffer of (possibly sorted) elements
+                                 on return a buffer of sorted elements
+  @param[in] Count               the number of elements in the buffer to sort
+  @param[in] ElementSize         Size of an element in bytes
+  @param[in] CompareFunction     The function to call to perform the comparison
+                                 of any 2 elements
+**/
+VOID
+EFIAPI
+PerformQuickSort (
+  IN OUT VOID                           *BufferToSort,
+  IN CONST UINTN                        Count,
+  IN CONST UINTN                        ElementSize,
+  IN       SORT_COMPARE                 CompareFunction
+  )
+{
+  VOID  *Buffer;
+
+  ASSERT(BufferToSort     != NULL);
+  ASSERT(CompareFunction  != NULL);
+
+  Buffer = AllocateZeroPool(ElementSize);
+  ASSERT(Buffer != NULL);
+
+  QuickSortWorker(
+    BufferToSort,
+    Count,
+    ElementSize,
+    CompareFunction,
+    Buffer);
+
+  FreePool(Buffer);
+  return;
+}
+
+/**
+  Not supported in Base version.
+
+  @param[in] Buffer1  Ignored.
+  @param[in] Buffer2  Ignored.
+
+  ASSERT and return 0.
+**/
+INTN
+EFIAPI
+DevicePathCompare (
+  IN  CONST VOID             *Buffer1,
+  IN  CONST VOID             *Buffer2
+  )
+{
+  ASSERT(FALSE);
+  return 0;
+}
+
+/**
+  Function to compare 2 strings without regard to case of the characters.
+
+  @param[in] Buffer1            Pointer to String to compare.
+  @param[in] Buffer2            Pointer to second String to compare.
+
+  @retval 0                     Buffer1 equal to Buffer2.
+  @return < 0                   Buffer1 is less than Buffer2.
+  @return > 0                   Buffer1 is greater than Buffer2.
+**/
+INTN
+EFIAPI
+StringNoCaseCompare (
+  IN  CONST VOID             *Buffer1,
+  IN  CONST VOID             *Buffer2
+  )
+{
+  ASSERT(FALSE);
+  return 0;
+}
+
+
+/**
+  Function to compare 2 strings.
+
+  @param[in] Buffer1            Pointer to String to compare (CHAR16**).
+  @param[in] Buffer2            Pointer to second String to compare (CHAR16**).
+
+  @retval 0                     Buffer1 equal to Buffer2.
+  @return < 0                   Buffer1 is less than Buffer2.
+  @return > 0                   Buffer1 is greater than Buffer2.
+**/
+INTN
+EFIAPI
+StringCompare (
+  IN  CONST VOID                *Buffer1,
+  IN  CONST VOID                *Buffer2
+  )
+{
+  ASSERT(FALSE);
+  return 0;
+}
+
+

Added: trunk/edk2/MdeModulePkg/Library/BaseSortLib/BaseSortLib.inf
===================================================================
--- trunk/edk2/MdeModulePkg/Library/BaseSortLib/BaseSortLib.inf                 
        (rev 0)
+++ trunk/edk2/MdeModulePkg/Library/BaseSortLib/BaseSortLib.inf 2015-01-13 
01:04:07 UTC (rev 16601)
@@ -0,0 +1,41 @@
+##  @file
+#   Library used for sorting routines.
+#
+#  Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved. <BR>
+#
+#  This program and the accompanying materials
+#  are licensed and made available under the terms and conditions of the BSD 
License
+#  which accompanies this distribution. The full text of the license may be 
found at
+#  http://opensource.org/licenses/bsd-license.php
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
IMPLIED.
+#
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010006
+  BASE_NAME                      = BaseSortLib
+  FILE_GUID                      = 03F3331B-F12D-494f-BF37-E55A657F2497
+  MODULE_TYPE                    = UEFI_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = SortLib|UEFI_APPLICATION UEFI_DRIVER
+
+#
+#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC
+#
+
+[Sources.common]
+  BaseSortLib.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+
+[LibraryClasses]
+  MemoryAllocationLib
+  BaseLib
+  BaseMemoryLib
+  DebugLib
+
+

Added: trunk/edk2/MdeModulePkg/Library/UefiSortLib/UefiSortLib.c
===================================================================
--- trunk/edk2/MdeModulePkg/Library/UefiSortLib/UefiSortLib.c                   
        (rev 0)
+++ trunk/edk2/MdeModulePkg/Library/UefiSortLib/UefiSortLib.c   2015-01-13 
01:04:07 UTC (rev 16601)
@@ -0,0 +1,322 @@
+/** @file
+  Library used for sorting routines.
+
+  Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved. <BR>
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD 
License
+  which accompanies this distribution.  The full text of the license may be 
found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <Uefi.h>
+
+#include <Protocol/UnicodeCollation.h>
+#include <Protocol/DevicePath.h>
+
+#include <Library/UefiBootServicesTableLib.h>
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/SortLib.h>
+#include <Library/DevicePathLib.h>
+
+STATIC EFI_UNICODE_COLLATION_PROTOCOL   *mUnicodeCollation = NULL;
+
+#define USL_FREE_NON_NULL(Pointer)  \
+{                                     \
+  if ((Pointer) != NULL) {            \
+  FreePool((Pointer));                \
+  (Pointer) = NULL;                   \
+  }                                   \
+}
+
+/**
+  Worker function for QuickSorting.  This function is identical to 
PerformQuickSort,
+  except that is uses the pre-allocated buffer so the in place sorting does 
not need to
+  allocate and free buffers constantly.
+
+  Each element must be equal sized.
+
+  if BufferToSort is NULL, then ASSERT.
+  if CompareFunction is NULL, then ASSERT.
+  if Buffer is NULL, then ASSERT.
+
+  if Count is < 2 then perform no action.
+  if Size is < 1 then perform no action.
+
+  @param[in, out] BufferToSort   on call a Buffer of (possibly sorted) elements
+                                 on return a buffer of sorted elements
+  @param[in] Count               the number of elements in the buffer to sort
+  @param[in] ElementSize         Size of an element in bytes
+  @param[in] CompareFunction     The function to call to perform the comparison
+                                 of any 2 elements
+  @param[in] Buffer              Buffer of size ElementSize for use in swapping
+**/
+VOID
+EFIAPI
+QuickSortWorker (
+  IN OUT VOID                           *BufferToSort,
+  IN CONST UINTN                        Count,
+  IN CONST UINTN                        ElementSize,
+  IN       SORT_COMPARE                 CompareFunction,
+  IN VOID                               *Buffer
+  )
+{
+  VOID        *Pivot;
+  UINTN       LoopCount;
+  UINTN       NextSwapLocation;
+
+  ASSERT(BufferToSort     != NULL);
+  ASSERT(CompareFunction  != NULL);
+  ASSERT(Buffer  != NULL);
+
+  if ( Count < 2
+    || ElementSize  < 1
+   ){
+    return;
+  }
+
+  NextSwapLocation = 0;
+
+  //
+  // pick a pivot (we choose last element)
+  //
+  Pivot = ((UINT8*)BufferToSort+((Count-1)*ElementSize));
+
+  //
+  // Now get the pivot such that all on "left" are below it
+  // and everything "right" are above it
+  //
+  for ( LoopCount = 0
+      ; LoopCount < Count -1
+      ; LoopCount++
+     ){
+    //
+    // if the element is less than the pivot
+    //
+    if 
(CompareFunction((VOID*)((UINT8*)BufferToSort+((LoopCount)*ElementSize)),Pivot) 
<= 0){
+      //
+      // swap
+      //
+      CopyMem (Buffer, (UINT8*)BufferToSort+(NextSwapLocation*ElementSize), 
ElementSize);
+      CopyMem ((UINT8*)BufferToSort+(NextSwapLocation*ElementSize), 
(UINT8*)BufferToSort+((LoopCount)*ElementSize), ElementSize);
+      CopyMem ((UINT8*)BufferToSort+((LoopCount)*ElementSize), Buffer, 
ElementSize);
+
+      //
+      // increment NextSwapLocation
+      //
+      NextSwapLocation++;
+    }
+  }
+  //
+  // swap pivot to it's final position (NextSwapLocaiton)
+  //
+  CopyMem (Buffer, Pivot, ElementSize);
+  CopyMem (Pivot, (UINT8*)BufferToSort+(NextSwapLocation*ElementSize), 
ElementSize);
+  CopyMem ((UINT8*)BufferToSort+(NextSwapLocation*ElementSize), Buffer, 
ElementSize);
+
+  //
+  // Now recurse on 2 paritial lists.  neither of these will have the 'pivot' 
element
+  // IE list is sorted left half, pivot element, sorted right half...
+  //
+  if (NextSwapLocation >= 2) {
+    QuickSortWorker(
+      BufferToSort,
+      NextSwapLocation,
+      ElementSize,
+      CompareFunction,
+      Buffer);
+  }
+
+  if ((Count - NextSwapLocation - 1) >= 2) {
+    QuickSortWorker(
+      (UINT8 *)BufferToSort + (NextSwapLocation+1) * ElementSize,
+      Count - NextSwapLocation - 1,
+      ElementSize,
+      CompareFunction,
+      Buffer);
+  }
+
+  return;
+}
+/**
+  Function to perform a Quick Sort alogrithm on a buffer of comparable 
elements.
+
+  Each element must be equal sized.
+
+  if BufferToSort is NULL, then ASSERT.
+  if CompareFunction is NULL, then ASSERT.
+
+  if Count is < 2 then perform no action.
+  if Size is < 1 then perform no action.
+
+  @param[in, out] BufferToSort   on call a Buffer of (possibly sorted) elements
+                                 on return a buffer of sorted elements
+  @param[in] Count               the number of elements in the buffer to sort
+  @param[in] ElementSize         Size of an element in bytes
+  @param[in] CompareFunction     The function to call to perform the comparison
+                                 of any 2 elements
+**/
+VOID
+EFIAPI
+PerformQuickSort (
+  IN OUT VOID                           *BufferToSort,
+  IN CONST UINTN                        Count,
+  IN CONST UINTN                        ElementSize,
+  IN       SORT_COMPARE                 CompareFunction
+  )
+{
+  VOID  *Buffer;
+
+  ASSERT(BufferToSort     != NULL);
+  ASSERT(CompareFunction  != NULL);
+
+  Buffer = AllocateZeroPool(ElementSize);
+  ASSERT(Buffer != NULL);
+
+  QuickSortWorker(
+    BufferToSort,
+    Count,
+    ElementSize,
+    CompareFunction,
+    Buffer);
+
+  FreePool(Buffer);
+  return;
+}
+
+/**
+  Function to compare 2 device paths for use in QuickSort.
+
+  @param[in] Buffer1            pointer to Device Path poiner to compare
+  @param[in] Buffer2            pointer to second DevicePath pointer to compare
+
+  @retval 0                     Buffer1 equal to Buffer2
+  @retval <0                    Buffer1 is less than Buffer2
+  @retval >0                    Buffer1 is greater than Buffer2
+**/
+INTN
+EFIAPI
+DevicePathCompare (
+  IN  CONST VOID             *Buffer1,
+  IN  CONST VOID             *Buffer2
+  )
+{
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath1;
+  EFI_DEVICE_PATH_PROTOCOL  *DevicePath2;
+  CHAR16                    *TextPath1;
+  CHAR16                    *TextPath2;
+  EFI_STATUS                Status;
+  INTN                      RetVal;
+
+  DevicePath1 = *(EFI_DEVICE_PATH_PROTOCOL**)Buffer1;
+  DevicePath2 = *(EFI_DEVICE_PATH_PROTOCOL**)Buffer2;
+
+  if (DevicePath1 == NULL) {
+    if (DevicePath2 == NULL) {
+      return 0;
+    }
+
+    return -1;
+  }
+
+  if (DevicePath2 == NULL) {
+    return 1;
+  }
+
+  if (mUnicodeCollation == NULL) {
+    Status = gBS->LocateProtocol(
+      &gEfiUnicodeCollation2ProtocolGuid,
+      NULL,
+      (VOID**)&mUnicodeCollation);
+
+    ASSERT_EFI_ERROR(Status);
+  }
+
+  TextPath1 = ConvertDevicePathToText(
+    DevicePath1,
+    FALSE,
+    FALSE);
+
+  TextPath2 = ConvertDevicePathToText(
+    DevicePath2,
+    FALSE,
+    FALSE);
+
+  if (TextPath1 == NULL) {
+    RetVal = -1;
+  } else if (TextPath2 == NULL) {
+    RetVal = 1;
+  } else {
+    RetVal = mUnicodeCollation->StriColl(
+      mUnicodeCollation,
+      TextPath1,
+      TextPath2);
+  }
+
+  USL_FREE_NON_NULL(TextPath1);
+  USL_FREE_NON_NULL(TextPath2);
+
+  return (RetVal);
+}
+
+/**
+  Function to compare 2 strings without regard to case of the characters.
+
+  @param[in] Buffer1            Pointer to String to compare.
+  @param[in] Buffer2            Pointer to second String to compare.
+
+  @retval 0                     Buffer1 equal to Buffer2.
+  @retval <0                    Buffer1 is less than Buffer2.
+  @retval >0                    Buffer1 is greater than Buffer2.
+**/
+INTN
+EFIAPI
+StringNoCaseCompare (
+  IN  CONST VOID             *Buffer1,
+  IN  CONST VOID             *Buffer2
+  )
+{
+  EFI_STATUS                Status;
+  if (mUnicodeCollation == NULL) {
+    Status = gBS->LocateProtocol(
+      &gEfiUnicodeCollation2ProtocolGuid,
+      NULL,
+      (VOID**)&mUnicodeCollation);
+
+    ASSERT_EFI_ERROR(Status);
+  }
+
+  return (mUnicodeCollation->StriColl(
+    mUnicodeCollation,
+    *(CHAR16**)Buffer1,
+    *(CHAR16**)Buffer2));
+}
+
+
+/**
+  Function to compare 2 strings.
+
+  @param[in] Buffer1            Pointer to String to compare (CHAR16**).
+  @param[in] Buffer2            Pointer to second String to compare (CHAR16**).
+
+  @retval 0                     Buffer1 equal to Buffer2.
+  @retval <0                    Buffer1 is less than Buffer2.
+  @retval >0                    Buffer1 is greater than Buffer2.
+**/
+INTN
+EFIAPI
+StringCompare (
+  IN  CONST VOID                *Buffer1,
+  IN  CONST VOID                *Buffer2
+  )
+{
+  return (StrCmp(
+    *(CHAR16**)Buffer1,
+    *(CHAR16**)Buffer2));
+}

Added: trunk/edk2/MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
===================================================================
--- trunk/edk2/MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf                 
        (rev 0)
+++ trunk/edk2/MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf 2015-01-13 
01:04:07 UTC (rev 16601)
@@ -0,0 +1,46 @@
+##  @file
+#   Library used for sorting routines.
+#
+#  Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved. <BR>
+#
+#  This program and the accompanying materials
+#  are licensed and made available under the terms and conditions of the BSD 
License
+#  which accompanies this distribution. The full text of the license may be 
found at
+#  http://opensource.org/licenses/bsd-license.php
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
IMPLIED.
+#
+#
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010006
+  BASE_NAME                      = UefiSortLib
+  FILE_GUID                      = 4264A823-45A3-42db-B92C-AA078555CBD3
+  MODULE_TYPE                    = UEFI_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = SortLib|UEFI_APPLICATION UEFI_DRIVER 
UEFI_DRIVER DXE_RUNTIME_DRIVER DXE_DRIVER
+
+#
+#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC
+#
+
+[Sources.common]
+  UefiSortLib.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+  MdeModulePkg/MdeModulePkg.dec
+
+[LibraryClasses]
+  MemoryAllocationLib
+  BaseLib
+  BaseMemoryLib
+  DebugLib
+  UefiBootServicesTableLib
+  DevicePathLib
+
+[Protocols]
+  gEfiUnicodeCollation2ProtocolGuid                       # ALWAYS_CONSUMED
+  gEfiDevicePathProtocolGuid                              # ALWAYS_CONSUMED
+

Modified: trunk/edk2/MdeModulePkg/MdeModulePkg.dec
===================================================================
--- trunk/edk2/MdeModulePkg/MdeModulePkg.dec    2015-01-12 12:28:36 UTC (rev 
16600)
+++ trunk/edk2/MdeModulePkg/MdeModulePkg.dec    2015-01-13 01:04:07 UTC (rev 
16601)
@@ -102,6 +102,9 @@
   #
   CustomizedDisplayLib|Include/Library/CustomizedDisplayLib.h
 
+  ## @libraryclass   Provides sorting functions
+  SortLib|Include/Library/SortLib.h
+
 [Guids]
   ## MdeModule package token space guid
   # Include/Guid/MdeModulePkgTokenSpace.h

Modified: trunk/edk2/MdePkg/Include/Library/BaseLib.h
===================================================================
--- trunk/edk2/MdePkg/Include/Library/BaseLib.h 2015-01-12 12:28:36 UTC (rev 
16600)
+++ trunk/edk2/MdePkg/Include/Library/BaseLib.h 2015-01-13 01:04:07 UTC (rev 
16601)
@@ -1,8 +1,8 @@
 /** @file
   Provides string functions, linked list functions, math functions, 
synchronization
-  functions, and CPU architecture-specific functions.
+  functions, file path functions, and CPU architecture-specific functions.
 
-Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR>
 Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
 This program and the accompanying materials
 are licensed and made available under the terms and conditions of the BSD 
License
@@ -484,7 +484,7 @@
 #ifndef DISABLE_NEW_DEPRECATED_INTERFACES
 
 /**
-  [ATTENTION] This function will be deprecated for security reason.
+  [ATTENTION] This function is deprecated for security reason.
 
   Copies one Null-terminated Unicode string to another Null-terminated Unicode
   string and returns the new Unicode string.
@@ -517,7 +517,7 @@
 
 
 /**
-  [ATTENTION] This function will be deprecated for security reason.
+  [ATTENTION] This function is deprecated for security reason.
 
   Copies up to a specified length from one Null-terminated Unicode string to 
   another Null-terminated Unicode string and returns the new Unicode string.
@@ -686,7 +686,7 @@
 #ifndef DISABLE_NEW_DEPRECATED_INTERFACES
 
 /**
-  [ATTENTION] This function will be deprecated for security reason.
+  [ATTENTION] This function is deprecated for security reason.
 
   Concatenates one Null-terminated Unicode string to another Null-terminated
   Unicode string, and returns the concatenated Unicode string.
@@ -728,7 +728,7 @@
 
 
 /**
-  [ATTENTION] This function will be deprecated for security reason.
+  [ATTENTION] This function is deprecated for security reason.
 
   Concatenates up to a specified length one Null-terminated Unicode to the end 
   of another Null-terminated Unicode string, and returns the concatenated 
@@ -1016,7 +1016,7 @@
 #ifndef DISABLE_NEW_DEPRECATED_INTERFACES
 
 /**
-  [ATTENTION] This function will be deprecated for security reason.
+  [ATTENTION] This function is deprecated for security reason.
 
   Copies one Null-terminated ASCII string to another Null-terminated ASCII
   string and returns the new ASCII string.
@@ -1047,7 +1047,7 @@
 
 
 /**
-  [ATTENTION] This function will be deprecated for security reason.
+  [ATTENTION] This function is deprecated for security reason.
 
   Copies up to a specified length one Null-terminated ASCII string to another 
   Null-terminated ASCII string and returns the new ASCII string.
@@ -1245,7 +1245,7 @@
 #ifndef DISABLE_NEW_DEPRECATED_INTERFACES
 
 /**
-  [ATTENTION] This function will be deprecated for security reason.
+  [ATTENTION] This function is deprecated for security reason.
 
   Concatenates one Null-terminated ASCII string to another Null-terminated
   ASCII string, and returns the concatenated ASCII string.
@@ -1282,7 +1282,7 @@
 
 
 /**
-  [ATTENTION] This function will be deprecated for security reason.
+  [ATTENTION] This function is deprecated for security reason.
 
   Concatenates up to a specified length one Null-terminated ASCII string to 
   the end of another Null-terminated ASCII string, and returns the 
@@ -1591,7 +1591,44 @@
   IN      UINT8                     Value
   );
 
+//
+//  File Path Manipulation Functions
+//
 
+/**
+  Removes the last directory or file entry in a path by changing the last
+  L'\' to a CHAR_NULL.
+
+  @param[in, out] Path    The pointer to the path to modify.
+
+  @retval FALSE     Nothing was found to remove.
+  @retval TRUE      A directory or file was removed.
+**/
+BOOLEAN
+EFIAPI
+PathRemoveLastItem(
+  IN OUT CHAR16 *Path
+  );
+
+/**
+  Function to clean up paths.
+    - Single periods in the path are removed.
+    - Double periods in the path are removed along with a single parent 
directory.
+    - Forward slashes L'/' are converted to backward slashes L'\'.
+
+  This will be done inline and the existing buffer may be larger than required
+  upon completion.
+
+  @param[in] Path       The pointer to the string containing the path.
+
+  @return       Returns Path, otherwise returns NULL to indicate that an error 
has occured.
+**/
+CHAR16*
+EFIAPI
+PathCleanUpDirectories(
+  IN CHAR16 *Path
+);
+
 //
 // Linked List Functions and Macros
 //

Added: trunk/edk2/MdePkg/Include/Library/FileHandleLib.h
===================================================================
--- trunk/edk2/MdePkg/Include/Library/FileHandleLib.h                           
(rev 0)
+++ trunk/edk2/MdePkg/Include/Library/FileHandleLib.h   2015-01-13 01:04:07 UTC 
(rev 16601)
@@ -0,0 +1,498 @@
+/** @file
+  Provides interface to EFI_FILE_HANDLE functionality.
+
+  Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD 
License
+  which accompanies this distribution.  The full text of the license may be 
found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#ifndef _FILE_HANDLE_LIBRARY_HEADER_
+#define _FILE_HANDLE_LIBRARY_HEADER_
+
+#include <Protocol/SimpleFileSystem.h>
+
+/// The tag for use in identifying UNICODE files.
+/// If the file is UNICODE, the first 16 bits of the file will equal this 
value.
+extern CONST UINT16 gUnicodeFileTag;
+
+/**
+  This function retrieves information about the file for the handle
+  specified and stores it in the allocated pool memory.
+
+  This function allocates a buffer to store the file's information. It is the
+  caller's responsibility to free the buffer.
+
+  @param[in] FileHandle         The file handle of the file for which 
information is
+                                being requested.
+
+  @retval NULL                  Information could not be retrieved.
+  @retval !NULL                 The information about the file.
+**/
+EFI_FILE_INFO*
+EFIAPI
+FileHandleGetInfo (
+  IN EFI_FILE_HANDLE            FileHandle
+  );
+
+/**
+  This function sets the information about the file for the opened handle
+  specified.
+
+  @param[in]  FileHandle        The file handle of the file for which 
information
+                                is being set.
+
+  @param[in]  FileInfo          The information to set.
+
+  @retval EFI_SUCCESS           The information was set.
+  @retval EFI_INVALID_PARAMETER A parameter was out of range or invalid.
+  @retval EFI_UNSUPPORTED       The FileHandle does not support FileInfo.
+  @retval EFI_NO_MEDIA          The device has no medium.
+  @retval EFI_DEVICE_ERROR      The device reported an error.
+  @retval EFI_VOLUME_CORRUPTED  The file system structures are corrupted.
+  @retval EFI_WRITE_PROTECTED   The file or medium is write protected.
+  @retval EFI_ACCESS_DENIED     The file was opened read only.
+  @retval EFI_VOLUME_FULL       The volume is full.
+**/
+EFI_STATUS
+EFIAPI
+FileHandleSetInfo (
+  IN EFI_FILE_HANDLE            FileHandle,
+  IN CONST EFI_FILE_INFO        *FileInfo
+  );
+
+/**
+  This function reads information from an opened file.
+
+  If FileHandle is not a directory, the function reads the requested number of
+  bytes from the file at the file's current position and returns them in 
Buffer.
+  If the read goes beyond the end of the file, the read length is truncated to 
the
+  end of the file. The file's current position is increased by the number of 
bytes
+  returned.  If FileHandle is a directory, the function reads the directory 
entry
+  at the file's current position and returns the entry in Buffer. If the Buffer
+  is not large enough to hold the current directory entry, then
+  EFI_BUFFER_TOO_SMALL is returned and the current file position is not 
updated.
+  BufferSize is set to be the size of the buffer needed to read the entry. On
+  success, the current position is updated to the next directory entry. If 
there
+  are no more directory entries, the read returns a zero-length buffer.
+  EFI_FILE_INFO is the structure returned as the directory entry.
+
+  @param[in] FileHandle          The opened file handle.
+  @param[in, out] BufferSize     On input, the size of buffer in bytes.  On 
return,
+                                 the number of bytes written.
+  @param[out] Buffer             The buffer to put read data into.
+
+  @retval EFI_SUCCESS         Data was read.
+  @retval EFI_NO_MEDIA          The device has no media.
+  @retval EFI_DEVICE_ERROR  The device reported an error.
+  @retval EFI_VOLUME_CORRUPTED  The file system structures are corrupted.
+  @retval EFI_BUFFER_TO_SMALL Buffer is too small. ReadSize contains required
+                                size.
+
+**/
+EFI_STATUS
+EFIAPI
+FileHandleRead(
+  IN EFI_FILE_HANDLE            FileHandle,
+  IN OUT UINTN                  *BufferSize,
+  OUT VOID                      *Buffer
+  );
+
+/**
+  Write data to a file.
+
+  This function writes the specified number of bytes to the file at the current
+  file position. The current file position is advanced the actual number of 
bytes
+  written, which is returned in BufferSize. Partial writes only occur when 
there
+  has been a data error during the write attempt (such as "volume space full").
+  The file is automatically grown to hold the data if required. Direct writes 
to
+  opened directories are not supported.
+
+  @param[in] FileHandle          The opened file for writing.
+  @param[in, out] BufferSize     On input, the number of bytes in Buffer.  On 
output,
+                                 the number of bytes written.
+  @param[in] Buffer              The buffer containing data to write is stored.
+
+  @retval EFI_SUCCESS         Data was written.
+  @retval EFI_UNSUPPORTED       Writes to an open directory are not supported.
+  @retval EFI_NO_MEDIA          The device has no media.
+  @retval EFI_DEVICE_ERROR  The device reported an error.
+  @retval EFI_VOLUME_CORRUPTED  The file system structures are corrupted.
+  @retval EFI_WRITE_PROTECTED The device is write-protected.
+  @retval EFI_ACCESS_DENIED The file was opened for read only.
+  @retval EFI_VOLUME_FULL The volume is full.
+**/
+EFI_STATUS
+EFIAPI
+FileHandleWrite(
+  IN EFI_FILE_HANDLE            FileHandle,
+  IN OUT UINTN                  *BufferSize,
+  IN VOID                       *Buffer
+  );
+
+/**
+  Close an open file handle.
+
+  This function closes a specified file handle. All "dirty" cached file data is
+  flushed to the device, and the file is closed. In all cases the handle is
+  closed.
+
+  @param[in] FileHandle           The file handle to close.
+
+  @retval EFI_SUCCESS             The file handle was closed successfully.
+**/
+EFI_STATUS
+EFIAPI
+FileHandleClose (
+  IN EFI_FILE_HANDLE            FileHandle
+  );
+
+/**
+  Delete a file and close the handle.
+
+  This function closes and deletes a file. In all cases the file handle is 
closed.
+  If the file cannot be deleted, the warning code EFI_WARN_DELETE_FAILURE is
+  returned, but the handle is still closed.
+
+  @param[in] FileHandle             The file handle to delete.
+
+  @retval EFI_SUCCESS               The file was closed successfully.
+  @retval EFI_WARN_DELETE_FAILURE   The handle was closed, but the file was not
+                                    deleted.
+  @retval INVALID_PARAMETER         One of the parameters has an invalid value.
+**/
+EFI_STATUS
+EFIAPI
+FileHandleDelete (
+  IN EFI_FILE_HANDLE    FileHandle
+  );
+
+/**
+  Set the current position in a file.
+
+  This function sets the current file position for the handle to the position
+  supplied. With the exception of moving to position 0xFFFFFFFFFFFFFFFF, only
+  absolute positioning is supported, and moving past the end of the file is
+  allowed (a subsequent write would grow the file). Moving to position
+  0xFFFFFFFFFFFFFFFF causes the current position to be set to the end of the 
file.
+  If FileHandle is a directory, the only position that may be set is zero. This
+  has the effect of starting the read process of the directory entries over 
again.
+
+  @param[in] FileHandle         The file handle on which the position is being 
set.
+  @param[in] Position           The byte position from the begining of the 
file.
+
+  @retval EFI_SUCCESS           The operation completed sucessfully.
+  @retval EFI_UNSUPPORTED       The request for non-zero is not valid on
+                                directories.
+  @retval INVALID_PARAMETER     One of the parameters has an invalid value.
+**/
+EFI_STATUS
+EFIAPI
+FileHandleSetPosition (
+  IN EFI_FILE_HANDLE    FileHandle,
+  IN UINT64             Position
+  );
+
+/**
+  Gets a file's current position.
+
+  This function retrieves the current file position for the file handle. For
+  directories, the current file position has no meaning outside of the file
+  system driver. As such, the operation is not supported. An error is returned
+  if FileHandle is a directory.
+
+  @param[in] FileHandle         The open file handle on which to get the 
position.
+  @param[out] Position          The byte position from begining of file.
+
+  @retval EFI_SUCCESS           The operation completed successfully.
+  @retval INVALID_PARAMETER     One of the parameters has an invalid value.
+  @retval EFI_UNSUPPORTED       The request is not valid on directories.
+**/
+EFI_STATUS
+EFIAPI
+FileHandleGetPosition (
+  IN EFI_FILE_HANDLE            FileHandle,
+  OUT UINT64                    *Position
+  );
+/**
+  Flushes data on a file.
+
+  This function flushes all modified data associated with a file to a device.
+
+  @param[in] FileHandle         The file handle on which to flush data.
+
+  @retval EFI_SUCCESS           The data was flushed.
+  @retval EFI_NO_MEDIA          The device has no media.
+  @retval EFI_DEVICE_ERROR      The device reported an error.
+  @retval EFI_VOLUME_CORRUPTED  The file system structures are corrupted.
+  @retval EFI_WRITE_PROTECTED   The file or medium is write protected.
+  @retval EFI_ACCESS_DENIED     The file was opened for read only.
+**/
+EFI_STATUS
+EFIAPI
+FileHandleFlush (
+  IN EFI_FILE_HANDLE            FileHandle
+  );
+
+/**
+  Function to determine if a given handle is a directory handle.
+
+  If DirHandle is NULL, then ASSERT().
+
+  Open the file information on the DirHandle, and verify that the Attribute
+  includes EFI_FILE_DIRECTORY bit set.
+
+  @param[in] DirHandle          The handle to open the file.
+
+  @retval EFI_SUCCESS           DirHandle is a directory.
+  @retval EFI_INVALID_PARAMETER DirHandle did not have EFI_FILE_INFO available.
+  @retval EFI_NOT_FOUND         DirHandle is not a directory.
+**/
+EFI_STATUS
+EFIAPI
+FileHandleIsDirectory (
+  IN EFI_FILE_HANDLE            DirHandle
+  );
+
+/** Retrieve first entry from a directory.
+
+  This function takes an open directory handle and gets information from the
+  first entry in the directory.  A buffer is allocated to contain
+  the information and a pointer to the buffer is returned in *Buffer.  The
+  caller can use FileHandleFindNextFile() to get subsequent directory entries.
+
+  The buffer will be freed by FileHandleFindNextFile() when the last directory
+  entry is read.  Otherwise, the caller must free the buffer, using FreePool,
+  when finished with it.
+
+  @param[in]  DirHandle         The file handle of the directory to search.
+  @param[out] Buffer            The pointer to pointer to buffer for file's 
information.
+
+  @retval EFI_SUCCESS           Found the first file.
+  @retval EFI_NOT_FOUND         Cannot find the directory.
+  @retval EFI_NO_MEDIA          The device has no media.
+  @retval EFI_DEVICE_ERROR      The device reported an error.
+  @retval EFI_VOLUME_CORRUPTED  The file system structures are corrupted.
+  @return Others                The status of FileHandleGetInfo, 
FileHandleSetPosition,
+                                or FileHandleRead.
+**/
+EFI_STATUS
+EFIAPI
+FileHandleFindFirstFile (
+  IN EFI_FILE_HANDLE            DirHandle,
+  OUT EFI_FILE_INFO             **Buffer
+  );
+
+/** Retrieve next entries from a directory.
+
+  To use this function, the caller must first call the 
FileHandleFindFirstFile()
+  function to get the first directory entry.  Subsequent directory entries are
+  retrieved by using the FileHandleFindNextFile() function.  This function can
+  be called several times to get each entry from the directory.  If the call of
+  FileHandleFindNextFile() retrieved the last directory entry, the next call of
+  this function will set *NoFile to TRUE and free the buffer.
+
+  @param[in]  DirHandle         The file handle of the directory.
+  @param[out] Buffer            The pointer to buffer for file's information.
+  @param[out] NoFile            The pointer to boolean when last file is found.
+
+  @retval EFI_SUCCESS           Found the next file, or reached last file.
+  @retval EFI_NO_MEDIA          The device has no media.
+  @retval EFI_DEVICE_ERROR      The device reported an error.
+  @retval EFI_VOLUME_CORRUPTED  The file system structures are corrupted.
+**/
+EFI_STATUS
+EFIAPI
+FileHandleFindNextFile(
+  IN EFI_FILE_HANDLE             DirHandle,
+  OUT EFI_FILE_INFO              *Buffer,
+  OUT BOOLEAN                    *NoFile
+  );
+
+/**
+  Retrieve the size of a file.
+
+  If FileHandle is NULL then ASSERT().
+  If Size is NULL then ASSERT().
+
+  This function extracts the file size info from the FileHandle's EFI_FILE_INFO
+  data.
+
+  @param[in] FileHandle         The file handle from which size is retrieved.
+  @param[out] Size              The pointer to size.
+
+  @retval EFI_SUCCESS           The operation completed successfully.
+  @retval EFI_DEVICE_ERROR      Cannot access the file.
+**/
+EFI_STATUS
+EFIAPI
+FileHandleGetSize (
+  IN EFI_FILE_HANDLE            FileHandle,
+  OUT UINT64                    *Size
+  );
+
+/**
+  Set the size of a file.
+
+  If FileHandle is NULL then ASSERT().
+
+  This function changes the file size info from the FileHandle's EFI_FILE_INFO
+  data.
+
+  @param[in] FileHandle         The file handle whose size is to be changed.
+  @param[in] Size               The new size.
+
+  @retval EFI_SUCCESS           The operation completed successfully.
+  @retval EFI_DEVICE_ERROR      Cannot access the file.
+**/
+EFI_STATUS
+EFIAPI
+FileHandleSetSize (
+  IN EFI_FILE_HANDLE            FileHandle,
+  IN UINT64                     Size
+  );
+
+/**
+  Function to get a full filename given a EFI_FILE_HANDLE somewhere lower on 
the
+  directory 'stack'.
+
+  @param[in] Handle             Handle to the Directory or File to create path 
to.
+  @param[out] FullFileName      Pointer to pointer to generated full file 
name.  It
+                                is the responsibility of the caller to free 
this memory
+                                with a call to FreePool().
+  @retval EFI_SUCCESS           The operation was successful and FullFileName 
is valid.
+  @retval EFI_INVALID_PARAMETER Handle was NULL.
+  @retval EFI_INVALID_PARAMETER FullFileName was NULL.
+  @retval EFI_OUT_OF_MEMORY     A memory allocation failed.
+**/
+EFI_STATUS
+EFIAPI
+FileHandleGetFileName (
+  IN CONST EFI_FILE_HANDLE      Handle,
+  OUT CHAR16                    **FullFileName
+  );
+
+/**
+  Function to read a single line (up to but not including the \n) from a file.
+
+  If the position upon start is 0, then the Ascii Boolean will be set.  This 
should be
+  maintained and not changed for all operations with the same file.
+
+  @param[in]       Handle        FileHandle to read from.
+  @param[in, out]  Buffer        The pointer to buffer to read into.
+  @param[in, out]  Size          The pointer to number of bytes in Buffer.
+  @param[in]       Truncate      If the buffer is large enough, this has no 
effect.
+                                 If the buffer is is too small and Truncate is 
TRUE,
+                                 the line will be truncated.
+                                 If the buffer is is too small and Truncate is 
FALSE,
+                                 then no read will occur.
+
+  @param[in, out]  Ascii         Boolean value for indicating whether the file 
is
+                                 Ascii (TRUE) or UCS2 (FALSE).
+
+  @retval EFI_SUCCESS           The operation was successful.  The line is 
stored in
+                                Buffer.
+  @retval EFI_INVALID_PARAMETER Handle was NULL.
+  @retval EFI_INVALID_PARAMETER Size was NULL.
+  @retval EFI_BUFFER_TOO_SMALL  Size was not large enough to store the line.
+                                Size was updated to the minimum space required.
+  @sa FileHandleRead
+**/
+EFI_STATUS
+EFIAPI
+FileHandleReadLine(
+  IN EFI_FILE_HANDLE            Handle,
+  IN OUT CHAR16                 *Buffer,
+  IN OUT UINTN                  *Size,
+  IN BOOLEAN                    Truncate,
+  IN OUT BOOLEAN                *Ascii
+  );
+
+/**
+  Function to read a single line from a file. The \n is not included in the 
returned
+  buffer.  The returned buffer must be callee freed.
+
+  If the position upon start is 0, then the Ascii Boolean will be set.  This 
should be
+  maintained and not changed for all operations with the same file.
+
+  @param[in]       Handle        FileHandle to read from.
+  @param[in, out]  Ascii         Boolean value for indicating whether the file 
is
+                                 Ascii (TRUE) or UCS2 (FALSE).
+
+  @return                       The line of text from the file.
+
+  @sa FileHandleReadLine
+**/
+CHAR16*
+EFIAPI
+FileHandleReturnLine(
+  IN EFI_FILE_HANDLE            Handle,
+  IN OUT BOOLEAN                *Ascii
+  );
+
+/**
+  Function to write a line of unicode text to a file.
+
+  If Handle is NULL, ASSERT.
+
+  @param[in]     Handle         FileHandle to write to.
+  @param[in]     Buffer         Buffer to write, if NULL the function will
+                                take no action and return EFI_SUCCESS.
+
+  @retval  EFI_SUCCESS          The data was written.
+  @retval  other                Failure.
+
+  @sa FileHandleWrite
+**/
+EFI_STATUS
+EFIAPI
+FileHandleWriteLine(
+  IN EFI_FILE_HANDLE Handle,
+  IN CHAR16          *Buffer
+  );
+
+/**
+  Function to take a formatted argument and print it to a file.
+
+  @param[in] Handle   The file handle for the file to write to.
+  @param[in] Format   The format argument (see printlib for the format 
specifier).
+  @param[in] ...      The variable arguments for the format.
+
+  @retval EFI_SUCCESS The operation was successful.
+  @retval other       A return value from FileHandleWriteLine.
+
+  @sa FileHandleWriteLine
+**/
+EFI_STATUS
+EFIAPI
+FileHandlePrintLine(
+  IN EFI_FILE_HANDLE  Handle,
+  IN CONST CHAR16     *Format,
+  ...
+  );
+
+/**
+  Function to determine if a FILE_HANDLE is at the end of the file.
+
+  This will NOT work on directories.
+
+  If Handle is NULL, then ASSERT().
+
+  @param[in] Handle     The file handle.
+
+  @retval TRUE          The position is at the end of the file.
+  @retval FALSE         The position is not at the end of the file.
+**/
+BOOLEAN
+EFIAPI
+FileHandleEof(
+  IN EFI_FILE_HANDLE Handle
+  );
+
+#endif //_FILE_HANDLE_LIBRARY_HEADER_
+

Modified: trunk/edk2/MdePkg/Library/BaseLib/BaseLib.inf
===================================================================
--- trunk/edk2/MdePkg/Library/BaseLib/BaseLib.inf       2015-01-12 12:28:36 UTC 
(rev 16600)
+++ trunk/edk2/MdePkg/Library/BaseLib/BaseLib.inf       2015-01-13 01:04:07 UTC 
(rev 16601)
@@ -63,6 +63,7 @@
   LinkedList.c
   SafeString.c
   String.c
+  FilePaths.c
   BaseLibInternals.h
 
 [Sources.Ia32]

Added: trunk/edk2/MdePkg/Library/BaseLib/FilePaths.c
===================================================================
--- trunk/edk2/MdePkg/Library/BaseLib/FilePaths.c                               
(rev 0)
+++ trunk/edk2/MdePkg/Library/BaseLib/FilePaths.c       2015-01-13 01:04:07 UTC 
(rev 16601)
@@ -0,0 +1,126 @@
+/** @file
+  Defines file-path manipulation functions.
+
+  Copyright (c) 2011 - 2014, Intel Corporation. All rights reserved.<BR>
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD 
License
+  which accompanies this distribution.  The full text of the license may be 
found at
+  http://opensource.org/licenses/bsd-license.php.
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+**/
+#include  <Uefi/UefiBaseType.h>
+#include  <Library/BaseMemoryLib.h>
+#include  <Library/BaseLib.h>
+#include  <Protocol/SimpleTextIn.h>
+
+/**
+  Removes the last directory or file entry in a path by changing the last
+  L'\' to a CHAR_NULL.
+
+  @param[in,out] Path     A pointer to the path to modify.
+
+  @retval FALSE     Nothing was found to remove.
+  @retval TRUE      A directory or file was removed.
+**/
+BOOLEAN
+EFIAPI
+PathRemoveLastItem(
+  IN OUT CHAR16 *Path
+  )
+{
+  CHAR16        *Walker;
+  CHAR16        *LastSlash;
+  //
+  // get directory name from path... ('chop' off extra)
+  //
+  for ( Walker = Path, LastSlash = NULL
+      ; Walker != NULL && *Walker != CHAR_NULL
+      ; Walker++
+     ){
+    if (*Walker == L'\\' && *(Walker + 1) != CHAR_NULL) {
+      LastSlash = Walker+1;
+    }
+  }
+  if (LastSlash != NULL) {
+    *LastSlash = CHAR_NULL;
+    return (TRUE);
+  }
+  return (FALSE);
+}
+
+/**
+  Function to clean up paths.
+
+  - Single periods in the path are removed.
+  - Double periods in the path are removed along with a single parent 
directory.
+  - Forward slashes L'/' are converted to backward slashes L'\'.
+
+  This will be done inline and the existing buffer may be larger than required
+  upon completion.
+
+  @param[in] Path       The pointer to the string containing the path.
+
+  @return       Returns Path, otherwise returns NULL to indicate that an error 
has occured.
+**/
+CHAR16*
+EFIAPI
+PathCleanUpDirectories(
+  IN CHAR16 *Path
+  )
+{
+  CHAR16  *TempString;
+  UINTN   TempSize;
+
+  if (Path==NULL) {
+    return(NULL);
+  }
+  //
+  // Fix up the '/' vs '\'
+  //
+  for (TempString = Path ; TempString != NULL && *TempString != CHAR_NULL ; 
TempString++) {
+    if (*TempString == L'/') {
+      *TempString = L'\\';
+    }
+  }
+  //
+  // Fix up the ..
+  //
+  while ((TempString = StrStr(Path, L"\\..\\")) != NULL) {
+    *TempString = CHAR_NULL;
+    TempString  += 4;
+    PathRemoveLastItem(Path);
+    TempSize = StrSize(TempString);
+    CopyMem(Path+StrLen(Path), TempString, TempSize);
+  }
+  if ((TempString = StrStr(Path, L"\\..")) != NULL && *(TempString + 3) == 
CHAR_NULL) {
+    *TempString = CHAR_NULL;
+    PathRemoveLastItem(Path);
+  }
+  //
+  // Fix up the .
+  //
+  while ((TempString = StrStr(Path, L"\\.\\")) != NULL) {
+    *TempString = CHAR_NULL;
+    TempString  += 2;
+    TempSize = StrSize(TempString);
+    CopyMem(Path+StrLen(Path), TempString, TempSize);
+  }
+  if ((TempString = StrStr(Path, L"\\.")) != NULL && *(TempString + 2) == 
CHAR_NULL) {
+    *(TempString + 1) = CHAR_NULL;
+  }
+
+  while ((TempString = StrStr(Path, L"\\\\")) != NULL) {
+    *TempString = CHAR_NULL;
+    TempString  += 1;
+    TempSize = StrSize(TempString);
+    CopyMem(Path+StrLen(Path), TempString, TempSize);
+  }
+  if ((TempString = StrStr(Path, L"\\\\")) != NULL && *(TempString + 1) == 
CHAR_NULL) {
+    *(TempString) = CHAR_NULL;
+  }
+
+  return (Path);
+}
+

Added: trunk/edk2/MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.c
===================================================================
--- trunk/edk2/MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.c             
                (rev 0)
+++ trunk/edk2/MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.c     
2015-01-13 01:04:07 UTC (rev 16601)
@@ -0,0 +1,1155 @@
+/** @file
+  Provides interface to EFI_FILE_HANDLE functionality.
+
+  Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved. <BR>
+  This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD 
License
+  which accompanies this distribution.  The full text of the license may be 
found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+**/
+
+#include <Uefi.h>
+
+#include <Protocol/SimpleFileSystem.h>
+#include <Protocol/UnicodeCollation.h>
+
+#include <Guid/FileInfo.h>
+
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/FileHandleLib.h>
+#include <Library/PcdLib.h>
+#include <Library/PrintLib.h>
+
+CONST UINT16 gUnicodeFileTag = EFI_UNICODE_BYTE_ORDER_MARK;
+
+#define MAX_FILE_NAME_LEN 522 // (20 * (6+5+2))+1) unicode characters from EFI 
FAT spec (doubled for bytes)
+#define FIND_XXXXX_FILE_BUFFER_SIZE (SIZE_OF_EFI_FILE_INFO + MAX_FILE_NAME_LEN)
+
+/**
+  This function will retrieve the information about the file for the handle
+  specified and store it in allocated pool memory.
+
+  This function allocates a buffer to store the file's information. It is the
+  caller's responsibility to free the buffer
+
+  @param  FileHandle  The file handle of the file for which information is
+  being requested.
+
+  @retval NULL information could not be retrieved.
+
+  @return the information about the file
+**/
+EFI_FILE_INFO*
+EFIAPI
+FileHandleGetInfo (
+  IN EFI_FILE_HANDLE            FileHandle
+  )
+{
+  EFI_FILE_INFO   *FileInfo;
+  UINTN           FileInfoSize;
+  EFI_STATUS      Status;
+
+  if (FileHandle == NULL) {
+    return (NULL);
+  }
+
+  //
+  // Get the required size to allocate
+  //
+  FileInfoSize = 0;
+  FileInfo = NULL;
+  Status = FileHandle->GetInfo(FileHandle,
+                               &gEfiFileInfoGuid,
+                               &FileInfoSize,
+                               NULL);
+  if (Status == EFI_BUFFER_TOO_SMALL){
+    //
+    // error is expected.  getting size to allocate
+    //
+    FileInfo = AllocateZeroPool(FileInfoSize);
+    //
+    // now get the information
+    //
+    Status = FileHandle->GetInfo(FileHandle,
+                                 &gEfiFileInfoGuid,
+                                 &FileInfoSize,
+                                 FileInfo);
+    //
+    // if we got an error free the memory and return NULL
+    //
+    if (EFI_ERROR(Status) && (FileInfo != NULL)) {
+      FreePool(FileInfo);
+      FileInfo = NULL;
+    }
+  }
+  return (FileInfo);
+}
+
+/**
+  This function sets the information about the file for the opened handle
+  specified.
+
+  @param[in]  FileHandle        The file handle of the file for which 
information
+                                is being set.
+
+  @param[in]  FileInfo          The information to set.
+
+  @retval EFI_SUCCESS           The information was set.
+  @retval EFI_INVALID_PARAMETER A parameter was out of range or invalid.
+  @retval EFI_UNSUPPORTED       The FileHandle does not support FileInfo.
+  @retval EFI_NO_MEDIA          The device has no medium.
+  @retval EFI_DEVICE_ERROR      The device reported an error.
+  @retval EFI_VOLUME_CORRUPTED  The file system structures are corrupted.
+  @retval EFI_WRITE_PROTECTED   The file or medium is write protected.
+  @retval EFI_ACCESS_DENIED     The file was opened read only.
+  @retval EFI_VOLUME_FULL       The volume is full.
+**/
+EFI_STATUS
+EFIAPI
+FileHandleSetInfo (
+  IN EFI_FILE_HANDLE            FileHandle,
+  IN CONST EFI_FILE_INFO        *FileInfo
+  )
+{
+
+  if (FileHandle == NULL || FileInfo == NULL) {
+    return (EFI_INVALID_PARAMETER);
+  }
+
+  //
+  // Set the info
+  //
+  return (FileHandle->SetInfo(FileHandle,
+                              &gEfiFileInfoGuid,
+                              (UINTN)FileInfo->Size,
+                              (EFI_FILE_INFO*)FileInfo));
+}
+
+/**
+  This function reads information from an opened file.
+
+  If FileHandle is not a directory, the function reads the requested number of
+  bytes from the file at the file's current position and returns them in 
Buffer.
+  If the read goes beyond the end of the file, the read length is truncated to 
the
+  end of the file. The file's current position is increased by the number of 
bytes
+  returned.  If FileHandle is a directory, the function reads the directory 
entry
+  at the file's current position and returns the entry in Buffer. If the Buffer
+  is not large enough to hold the current directory entry, then
+  EFI_BUFFER_TOO_SMALL is returned and the current file position is not 
updated.
+  BufferSize is set to be the size of the buffer needed to read the entry. On
+  success, the current position is updated to the next directory entry. If 
there
+  are no more directory entries, the read returns a zero-length buffer.
+  EFI_FILE_INFO is the structure returned as the directory entry.
+
+  @param FileHandle             the opened file handle
+  @param BufferSize             on input the size of buffer in bytes.  on 
return
+                                the number of bytes written.
+  @param Buffer                 the buffer to put read data into.
+
+  @retval EFI_SUCCESS           Data was read.
+  @retval EFI_NO_MEDIA          The device has no media.
+  @retval EFI_DEVICE_ERROR      The device reported an error.
+  @retval EFI_VOLUME_CORRUPTED  The file system structures are corrupted.
+  @retval EFI_BUFFER_TO_SMALL   Buffer is too small. ReadSize contains required
+                                size.
+
+**/
+EFI_STATUS
+EFIAPI
+FileHandleRead(
+  IN EFI_FILE_HANDLE            FileHandle,
+  IN OUT UINTN                  *BufferSize,
+  OUT VOID                      *Buffer
+  )
+{
+  if (FileHandle == NULL) {
+    return (EFI_INVALID_PARAMETER);
+  }
+
+  //
+  // Perform the read based on EFI_FILE_PROTOCOL
+  //
+  return (FileHandle->Read(FileHandle, BufferSize, Buffer));
+}
+
+
+/**
+  Write data to a file.
+
+  This function writes the specified number of bytes to the file at the current
+  file position. The current file position is advanced the actual number of 
bytes
+  written, which is returned in BufferSize. Partial writes only occur when 
there
+  has been a data error during the write attempt (such as "volume space full").
+  The file is automatically grown to hold the data if required. Direct writes 
to
+  opened directories are not supported.
+
+  @param FileHandle           The opened file for writing
+  @param BufferSize           on input the number of bytes in Buffer.  On 
output
+                              the number of bytes written.
+  @param Buffer               the buffer containing data to write is stored.
+
+ @retval EFI_SUCCESS          Data was written.
+ @retval EFI_UNSUPPORTED      Writes to an open directory are not supported.
+ @retval EFI_NO_MEDIA         The device has no media.
+ @retval EFI_DEVICE_ERROR     The device reported an error.
+ @retval EFI_VOLUME_CORRUPTED The file system structures are corrupted.
+ @retval EFI_WRITE_PROTECTED  The device is write-protected.
+ @retval EFI_ACCESS_DENIED    The file was open for read only.
+ @retval EFI_VOLUME_FULL      The volume is full.
+**/
+EFI_STATUS
+EFIAPI
+FileHandleWrite(
+  IN EFI_FILE_HANDLE            FileHandle,
+  IN OUT UINTN                  *BufferSize,
+  IN VOID                       *Buffer
+  )
+{
+  if (FileHandle == NULL) {
+    return (EFI_INVALID_PARAMETER);
+  }
+
+  //
+  // Perform the write based on EFI_FILE_PROTOCOL
+  //
+  return (FileHandle->Write(FileHandle, BufferSize, Buffer));
+}
+
+/**
+  Close an open file handle.
+
+  This function closes a specified file handle. All "dirty" cached file data is
+  flushed to the device, and the file is closed. In all cases the handle is
+  closed.
+
+@param FileHandle               the file handle to close.
+
+@retval EFI_SUCCESS             the file handle was closed sucessfully.
+**/
+EFI_STATUS
+EFIAPI
+FileHandleClose (
+  IN EFI_FILE_HANDLE            FileHandle
+  )
+{
+  EFI_STATUS Status;
+
+  if (FileHandle == NULL) {
+    return (EFI_INVALID_PARAMETER);
+  }
+
+  //
+  // Perform the Close based on EFI_FILE_PROTOCOL
+  //
+  Status = FileHandle->Close(FileHandle);
+  return Status;
+}
+
+/**
+  Delete a file and close the handle
+
+  This function closes and deletes a file. In all cases the file handle is 
closed.
+  If the file cannot be deleted, the warning code EFI_WARN_DELETE_FAILURE is
+  returned, but the handle is still closed.
+
+  @param FileHandle             the file handle to delete
+
+  @retval EFI_SUCCESS           the file was closed sucessfully
+  @retval EFI_WARN_DELETE_FAILURE the handle was closed, but the file was not
+                                deleted
+  @retval INVALID_PARAMETER     One of the parameters has an invalid value.
+**/
+EFI_STATUS
+EFIAPI
+FileHandleDelete (
+  IN EFI_FILE_HANDLE    FileHandle
+  )
+{
+  EFI_STATUS Status;
+
+  if (FileHandle == NULL) {
+    return (EFI_INVALID_PARAMETER);
+  }
+
+  //
+  // Perform the Delete based on EFI_FILE_PROTOCOL
+  //
+  Status = FileHandle->Delete(FileHandle);
+  return Status;
+}
+
+/**
+  Set the current position in a file.
+
+  This function sets the current file position for the handle to the position
+  supplied. With the exception of seeking to position 0xFFFFFFFFFFFFFFFF, only
+  absolute positioning is supported, and seeking past the end of the file is
+  allowed (a subsequent write would grow the file). Seeking to position
+  0xFFFFFFFFFFFFFFFF causes the current position to be set to the end of the 
file.
+  If FileHandle is a directory, the only position that may be set is zero. This
+  has the effect of starting the read process of the directory entries over.
+
+  @param FileHandle             The file handle on which the position is being 
set
+  @param Position               Byte position from begining of file
+
+  @retval EFI_SUCCESS           Operation completed sucessfully.
+  @retval EFI_UNSUPPORTED       the seek request for non-zero is not valid on
+                                directories.
+  @retval INVALID_PARAMETER     One of the parameters has an invalid value.
+**/
+EFI_STATUS
+EFIAPI
+FileHandleSetPosition (
+  IN EFI_FILE_HANDLE    FileHandle,
+  IN UINT64             Position
+  )
+{
+  if (FileHandle == NULL) {
+    return (EFI_INVALID_PARAMETER);
+  }
+
+  //
+  // Perform the SetPosition based on EFI_FILE_PROTOCOL
+  //
+  return (FileHandle->SetPosition(FileHandle, Position));
+}
+
+/**
+  Gets a file's current position
+
+  This function retrieves the current file position for the file handle. For
+  directories, the current file position has no meaning outside of the file
+  system driver and as such the operation is not supported. An error is 
returned
+  if FileHandle is a directory.
+
+  @param FileHandle             The open file handle on which to get the 
position.
+  @param Position               Byte position from begining of file.
+
+  @retval EFI_SUCCESS           the operation completed sucessfully.
+  @retval INVALID_PARAMETER     One of the parameters has an invalid value.
+  @retval EFI_UNSUPPORTED       the request is not valid on directories.
+**/
+EFI_STATUS
+EFIAPI
+FileHandleGetPosition (
+  IN EFI_FILE_HANDLE            FileHandle,
+  OUT UINT64                    *Position
+  )
+{
+  if (Position == NULL || FileHandle == NULL) {
+    return (EFI_INVALID_PARAMETER);
+  }
+
+  //
+  // Perform the GetPosition based on EFI_FILE_PROTOCOL
+  //
+  return (FileHandle->GetPosition(FileHandle, Position));
+}
+/**
+  Flushes data on a file
+
+  This function flushes all modified data associated with a file to a device.
+
+  @param FileHandle             The file handle on which to flush data
+
+  @retval EFI_SUCCESS           The data was flushed.
+  @retval EFI_NO_MEDIA          The device has no media.
+  @retval EFI_DEVICE_ERROR      The device reported an error.
+  @retval EFI_VOLUME_CORRUPTED  The file system structures are corrupted.
+  @retval EFI_WRITE_PROTECTED   The file or medium is write protected.
+  @retval EFI_ACCESS_DENIED     The file was opened for read only.
+**/
+EFI_STATUS
+EFIAPI
+FileHandleFlush (
+  IN EFI_FILE_HANDLE            FileHandle
+  )
+{
+  if (FileHandle == NULL) {
+    return (EFI_INVALID_PARAMETER);
+  }
+
+  //
+  // Perform the Flush based on EFI_FILE_PROTOCOL
+  //
+  return (FileHandle->Flush(FileHandle));
+}
+
+/**
+  function to determine if a given handle is a directory handle
+
+  if DirHandle is NULL then return error
+
+  open the file information on the DirHandle and verify that the Attribute
+  includes EFI_FILE_DIRECTORY bit set.
+
+  @param DirHandle              Handle to open file
+
+  @retval EFI_SUCCESS           DirHandle is a directory
+  @retval EFI_INVALID_PARAMETER DirHandle did not have EFI_FILE_INFO available
+  @retval EFI_NOT_FOUND         DirHandle is not a directory
+**/
+EFI_STATUS
+EFIAPI
+FileHandleIsDirectory (
+  IN EFI_FILE_HANDLE            DirHandle
+  )
+{
+  EFI_FILE_INFO *DirInfo;
+
+  if (DirHandle == NULL) {
+    return (EFI_INVALID_PARAMETER);
+  }
+
+  //
+  // get the file information for DirHandle
+  //
+  DirInfo = FileHandleGetInfo (DirHandle);
+
+  //
+  // Parse DirInfo
+  //
+  if (DirInfo == NULL) {
+    //
+    // We got nothing...
+    //
+    return (EFI_INVALID_PARAMETER);
+  }
+  if ((DirInfo->Attribute & EFI_FILE_DIRECTORY) == 0) {
+    //
+    // Attributes say this is not a directory
+    //
+    FreePool (DirInfo);
+    return (EFI_NOT_FOUND);
+  }
+  //
+  // all good...
+  //
+  FreePool (DirInfo);
+  return (EFI_SUCCESS);
+}
+
+/** Retrieve first entry from a directory.
+
+  This function takes an open directory handle and gets information from the
+  first entry in the directory.  A buffer is allocated to contain
+  the information and a pointer to the buffer is returned in *Buffer.  The
+  caller can use FileHandleFindNextFile() to get subsequent directory entries.
+
+  The buffer will be freed by FileHandleFindNextFile() when the last directory
+  entry is read.  Otherwise, the caller must free the buffer, using FreePool,
+  when finished with it.
+
+  @param[in]  DirHandle         The file handle of the directory to search.
+  @param[out] Buffer            The pointer to pointer to buffer for file's 
information.
+
+  @retval EFI_SUCCESS           Found the first file.
+  @retval EFI_NOT_FOUND         Cannot find the directory.
+  @retval EFI_NO_MEDIA          The device has no media.
+  @retval EFI_DEVICE_ERROR      The device reported an error.
+  @retval EFI_VOLUME_CORRUPTED  The file system structures are corrupted.
+  @return Others                status of FileHandleGetInfo, 
FileHandleSetPosition,
+                                or FileHandleRead
+**/
+EFI_STATUS
+EFIAPI
+FileHandleFindFirstFile (
+  IN EFI_FILE_HANDLE            DirHandle,
+  OUT EFI_FILE_INFO             **Buffer
+  )
+{
+  EFI_STATUS    Status;
+  UINTN         BufferSize;
+
+  if (Buffer == NULL || DirHandle == NULL) {
+    return (EFI_INVALID_PARAMETER);
+  }
+
+  //
+  // verify that DirHandle is a directory
+  //
+  Status = FileHandleIsDirectory(DirHandle);
+  if (EFI_ERROR(Status)) {
+    return (Status);
+  }
+
+  //
+  // Allocate a buffer sized to struct size + enough for the string at the end
+  //
+  BufferSize = FIND_XXXXX_FILE_BUFFER_SIZE;
+  *Buffer = AllocateZeroPool(BufferSize);
+  if (*Buffer == NULL){
+    return (EFI_OUT_OF_RESOURCES);
+  }
+
+  //
+  // reset to the begining of the directory
+  //
+  Status = FileHandleSetPosition(DirHandle, 0);
+  if (EFI_ERROR(Status)) {
+    FreePool(*Buffer);
+    *Buffer = NULL;
+    return (Status);
+  }
+
+  //
+  // read in the info about the first file
+  //
+  Status = FileHandleRead (DirHandle, &BufferSize, *Buffer);
+  ASSERT(Status != EFI_BUFFER_TOO_SMALL);
+  if (EFI_ERROR(Status) || BufferSize == 0) {
+    FreePool(*Buffer);
+    *Buffer = NULL;
+    if (BufferSize == 0) {
+      return (EFI_NOT_FOUND);
+    }
+    return (Status);
+  }
+  return (EFI_SUCCESS);
+}
+
+/** Retrieve next entries from a directory.
+
+  To use this function, the caller must first call the 
FileHandleFindFirstFile()
+  function to get the first directory entry.  Subsequent directory entries are
+  retrieved by using the FileHandleFindNextFile() function.  This function can
+  be called several times to get each entry from the directory.  If the call of
+  FileHandleFindNextFile() retrieved the last directory entry, the next call of
+  this function will set *NoFile to TRUE and free the buffer.
+
+  @param[in]  DirHandle         The file handle of the directory.
+  @param[out] Buffer            The pointer to buffer for file's information.
+  @param[out] NoFile            The pointer to boolean when last file is found.
+
+  @retval EFI_SUCCESS           Found the next file, or reached last file
+  @retval EFI_NO_MEDIA          The device has no media.
+  @retval EFI_DEVICE_ERROR      The device reported an error.
+  @retval EFI_VOLUME_CORRUPTED  The file system structures are corrupted.
+**/
+EFI_STATUS
+EFIAPI
+FileHandleFindNextFile(
+  IN EFI_FILE_HANDLE          DirHandle,
+  OUT EFI_FILE_INFO          *Buffer,
+  OUT BOOLEAN                *NoFile
+  )
+{
+  EFI_STATUS    Status;
+  UINTN         BufferSize;
+
+  if (DirHandle == NULL || Buffer == NULL || NoFile == NULL) {
+    return (EFI_INVALID_PARAMETER);
+  }
+
+  //
+  // This BufferSize MUST stay equal to the originally allocated one in 
GetFirstFile
+  //
+  BufferSize = FIND_XXXXX_FILE_BUFFER_SIZE;
+
+  //
+  // read in the info about the next file
+  //
+  Status = FileHandleRead (DirHandle, &BufferSize, Buffer);
+  ASSERT(Status != EFI_BUFFER_TOO_SMALL);
+  if (EFI_ERROR(Status)) {
+    return (Status);
+  }
+
+  //
+  // If we read 0 bytes (but did not have erros) we already read in the last 
file.
+  //
+  if (BufferSize == 0) {
+    FreePool(Buffer);
+    *NoFile = TRUE;
+  }
+
+  return (EFI_SUCCESS);
+}
+
+/**
+  Retrieve the size of a file.
+
+  if FileHandle is NULL then return error
+  if Size is NULL then return error
+
+  This function extracts the file size info from the FileHandle's EFI_FILE_INFO
+  data.
+
+  @param FileHandle             file handle from which size is retrieved
+  @param Size                   pointer to size
+
+  @retval EFI_SUCCESS           operation was completed sucessfully
+  @retval EFI_DEVICE_ERROR      cannot access the file
+**/
+EFI_STATUS
+EFIAPI
+FileHandleGetSize (
+  IN EFI_FILE_HANDLE            FileHandle,
+  OUT UINT64                    *Size
+  )
+{
+  EFI_FILE_INFO                 *FileInfo;
+
+  if (FileHandle == NULL || Size == NULL) {
+    return (EFI_INVALID_PARAMETER);
+  }
+
+  //
+  // get the FileInfo structure
+  //
+  FileInfo = FileHandleGetInfo(FileHandle);
+  if (FileInfo == NULL) {
+    return (EFI_DEVICE_ERROR);
+  }
+
+  //
+  // Assign the Size pointer to the correct value
+  //
+  *Size = FileInfo->FileSize;
+
+  //
+  // free the FileInfo memory
+  //
+  FreePool(FileInfo);
+
+  return (EFI_SUCCESS);
+}
+
+/**
+  Set the size of a file.
+
+  If FileHandle is NULL then return error.
+
+  This function changes the file size info from the FileHandle's EFI_FILE_INFO
+  data.
+
+  @param FileHandle             File handle whose size is to be changed.
+  @param Size                   New size.
+
+  @retval EFI_SUCCESS           operation was completed sucessfully.
+  @retval EFI_DEVICE_ERROR      cannot access the file.
+**/
+EFI_STATUS
+EFIAPI
+FileHandleSetSize (
+  IN EFI_FILE_HANDLE            FileHandle,
+  IN UINT64                     Size
+  )
+{
+  EFI_FILE_INFO                 *FileInfo;
+  EFI_STATUS                    Status;
+
+  if (FileHandle == NULL) {
+    return (EFI_INVALID_PARAMETER);
+  }
+
+  //
+  // get the FileInfo structure
+  //
+  FileInfo = FileHandleGetInfo(FileHandle);
+  if (FileInfo == NULL) {
+    return (EFI_DEVICE_ERROR);
+  }
+
+  //
+  // Assign the FileSize pointer to the new value
+  //
+  FileInfo->FileSize = Size;
+
+  Status = FileHandleSetInfo(FileHandle, FileInfo);
+  //
+  // free the FileInfo memory
+  //
+  FreePool(FileInfo);
+
+  return (Status);
+}
+
+/**
+  Safely append (on the left) with automatic string resizing given length of 
Destination and
+  desired length of copy from Source.
+
+  append the first D characters of Source to the end of Destination, where D is
+  the lesser of Count and the StrLen() of Source. If appending those D 
characters
+  will fit within Destination (whose Size is given as CurrentSize) and
+  still leave room for a NULL terminator, then those characters are appended,
+  starting at the original terminating NULL of Destination, and a new 
terminating
+  NULL is appended.
+
+  If appending D characters onto Destination will result in a overflow of the 
size
+  given in CurrentSize the string will be grown such that the copy can be 
performed
+  and CurrentSize will be updated to the new size.
+
+  If Source is NULL, there is nothing to append, just return the current 
buffer in
+  Destination.
+
+  if Destination is NULL, then return error
+  if Destination's current length (including NULL terminator) is already more 
then
+  CurrentSize, then ASSERT()
+
+  @param[in, out] Destination   The String to append onto
+  @param[in, out] CurrentSize   on call the number of bytes in Destination.  On
+                                return possibly the new size (still in bytes). 
 if NULL
+                                then allocate whatever is needed.
+  @param[in]      Source        The String to append from
+  @param[in]      Count         Maximum number of characters to append.  if 0 
then
+                                all are appended.
+
+  @return Destination           return the resultant string.
+**/
+CHAR16*
+EFIAPI
+StrnCatGrowLeft (
+  IN OUT CHAR16           **Destination,
+  IN OUT UINTN            *CurrentSize,
+  IN     CONST CHAR16     *Source,
+  IN     UINTN            Count
+  )
+{
+  UINTN DestinationStartSize;
+  UINTN NewSize;
+  UINTN CopySize;
+
+  if (Destination == NULL) {
+    return (NULL);
+  }
+
+  //
+  // If there's nothing to do then just return Destination
+  //
+  if (Source == NULL) {
+    return (*Destination);
+  }
+
+  //
+  // allow for NULL pointers address as Destination
+  //
+  if (*Destination != NULL) {
+    ASSERT(CurrentSize != 0);
+    DestinationStartSize = StrSize(*Destination);
+    ASSERT(DestinationStartSize <= *CurrentSize);
+  } else {
+    DestinationStartSize = 0;
+//    ASSERT(*CurrentSize == 0);
+  }
+
+  //
+  // Append all of Source?
+  //
+  if (Count == 0) {
+    Count = StrSize(Source);
+  }
+
+  //
+  // Test and grow if required
+  //
+  if (CurrentSize != NULL) {
+    NewSize = *CurrentSize;
+    while (NewSize < (DestinationStartSize + Count)) {
+      NewSize += 2 * Count;
+    }
+    *Destination = ReallocatePool(*CurrentSize, NewSize, *Destination);
+    *CurrentSize = NewSize;
+  } else {
+    *Destination = AllocateZeroPool(Count+sizeof(CHAR16));
+  }
+  if (*Destination == NULL) {
+    return NULL;
+  }
+
+  CopySize = StrSize(*Destination);
+  CopyMem((*Destination)+((Count-2)/sizeof(CHAR16)), *Destination, CopySize);
+  CopyMem(*Destination, Source, Count-2);
+  return (*Destination);
+}
+
+/**
+  Function to get a full filename given a EFI_FILE_HANDLE somewhere lower on 
the
+  directory 'stack'.
+
+  if Handle is NULL, return EFI_INVALID_PARAMETER
+
+  @param[in] Handle             Handle to the Directory or File to create path 
to.
+  @param[out] FullFileName      pointer to pointer to generated full file 
name.  It
+                                is the responsibility of the caller to free 
this memory
+                                with a call to FreePool().
+  @retval EFI_SUCCESS           the operation was sucessful and the 
FullFileName is valid.
+  @retval EFI_INVALID_PARAMETER Handle was NULL.
+  @retval EFI_INVALID_PARAMETER FullFileName was NULL.
+  @retval EFI_OUT_OF_RESOURCES  a memory allocation failed.
+**/
+EFI_STATUS
+EFIAPI
+FileHandleGetFileName (
+  IN CONST EFI_FILE_HANDLE      Handle,
+  OUT CHAR16                    **FullFileName
+  )
+{
+  EFI_STATUS      Status;
+  UINTN           Size;
+  EFI_FILE_HANDLE CurrentHandle;
+  EFI_FILE_HANDLE NextHigherHandle;
+  EFI_FILE_INFO   *FileInfo;
+
+  Size = 0;
+
+  //
+  // Check our parameters
+  //
+  if (FullFileName == NULL || Handle == NULL) {
+    return (EFI_INVALID_PARAMETER);
+  }
+
+  *FullFileName = NULL;
+  CurrentHandle = NULL;
+
+  Status = Handle->Open(Handle, &CurrentHandle, L".", EFI_FILE_MODE_READ, 0);
+  if (!EFI_ERROR(Status)) {
+    //
+    // Reverse out the current directory on the device
+    //
+    for (;;) {
+      FileInfo = FileHandleGetInfo(CurrentHandle);
+      if (FileInfo == NULL) {
+        Status = EFI_OUT_OF_RESOURCES;
+        break;
+      } else {
+        //
+        // We got info... do we have a name? if yes preceed the current path 
with it...
+        //
+        if (StrLen (FileInfo->FileName) == 0) {
+          if (*FullFileName == NULL) {
+            ASSERT((*FullFileName == NULL && Size == 0) || (*FullFileName != 
NULL));
+            *FullFileName = StrnCatGrowLeft(FullFileName, &Size, L"\\", 0);
+          }
+          FreePool(FileInfo);
+          break;
+        } else {
+          if (*FullFileName == NULL) {
+            ASSERT((*FullFileName == NULL && Size == 0) || (*FullFileName != 
NULL));
+            *FullFileName = StrnCatGrowLeft(FullFileName, &Size, L"\\", 0);
+          }
+          ASSERT((*FullFileName == NULL && Size == 0) || (*FullFileName != 
NULL));
+          *FullFileName = StrnCatGrowLeft(FullFileName, &Size, 
FileInfo->FileName, 0);
+          *FullFileName = StrnCatGrowLeft(FullFileName, &Size, L"\\", 0);
+          FreePool(FileInfo);
+        }
+      }
+      //
+      // Move to the parent directory
+      //
+      Status = CurrentHandle->Open (CurrentHandle, &NextHigherHandle, L"..", 
EFI_FILE_MODE_READ, 0);
+      if (EFI_ERROR (Status)) {
+        break;
+      }
+
+      FileHandleClose(CurrentHandle);
+      CurrentHandle = NextHigherHandle;
+    }
+  } else if (Status == EFI_NOT_FOUND) {
+    Status = EFI_SUCCESS;
+    ASSERT((*FullFileName == NULL && Size == 0) || (*FullFileName != NULL));
+    *FullFileName = StrnCatGrowLeft(FullFileName, &Size, L"\\", 0);
+  }
+
+  if (CurrentHandle != NULL) {
+    CurrentHandle->Close (CurrentHandle);
+  }
+
+  if (EFI_ERROR(Status) && *FullFileName != NULL) {
+    FreePool(*FullFileName);
+  }
+
+  return (Status);
+}
+
+/**
+  Function to read a single line from a file. The \n is not included in the 
returned
+  buffer.  The returned buffer must be callee freed.
+
+  If the position upon start is 0, then the Ascii Boolean will be set.  This 
should be
+  maintained and not changed for all operations with the same file.
+
+  @param[in]       Handle        FileHandle to read from.
+  @param[in, out]  Ascii         Boolean value for indicating whether the file 
is Ascii (TRUE) or UCS2 (FALSE);
+
+  @return                       The line of text from the file.
+
+  @sa FileHandleReadLine
+**/
+CHAR16*
+EFIAPI
+FileHandleReturnLine(
+  IN EFI_FILE_HANDLE            Handle,
+  IN OUT BOOLEAN                *Ascii
+  )
+{
+  CHAR16          *RetVal;
+  UINTN           Size;
+  EFI_STATUS      Status;
+
+  Size = 0;
+  RetVal = NULL;
+
+  Status = FileHandleReadLine(Handle, RetVal, &Size, FALSE, Ascii);
+  if (Status == EFI_BUFFER_TOO_SMALL) {
+    RetVal = AllocateZeroPool(Size);
+    Status = FileHandleReadLine(Handle, RetVal, &Size, FALSE, Ascii);
+  }
+  ASSERT_EFI_ERROR(Status);
+  if (EFI_ERROR(Status) && (RetVal != NULL)) {
+    FreePool(RetVal);
+    RetVal = NULL;
+  }
+  return (RetVal);
+}
+
+/**
+  Function to read a single line (up to but not including the \n) from a 
EFI_FILE_HANDLE.
+
+  If the position upon start is 0, then the Ascii Boolean will be set.  This 
should be
+  maintained and not changed for all operations with the same file.
+
+  @param[in]       Handle        FileHandle to read from
+  @param[in, out]  Buffer        pointer to buffer to read into
+  @param[in, out]  Size          pointer to number of bytes in buffer
+  @param[in]       Truncate      if TRUE then allows for truncation of the 
line to fit.
+                                 if FALSE will reset the position to the 
begining of the
+                                 line if the buffer is not large enough.
+  @param[in, out]  Ascii         Boolean value for indicating whether the file 
is Ascii (TRUE) or UCS2 (FALSE);
+
+  @retval EFI_SUCCESS           the operation was sucessful.  the line is 
stored in
+                                Buffer.
+  @retval EFI_INVALID_PARAMETER Handle was NULL.
+  @retval EFI_INVALID_PARAMETER Size was NULL.
+  @retval EFI_BUFFER_TOO_SMALL  Size was not enough space to store the line.
+                                Size was updated to minimum space required.
+  @sa FileHandleRead
+**/
+EFI_STATUS
+EFIAPI
+FileHandleReadLine(
+  IN EFI_FILE_HANDLE            Handle,
+  IN OUT CHAR16                 *Buffer,
+  IN OUT UINTN                  *Size,
+  IN BOOLEAN                    Truncate,
+  IN OUT BOOLEAN                *Ascii
+  )
+{
+  EFI_STATUS  Status;
+  CHAR16      CharBuffer;
+  UINTN       CharSize;
+  UINTN       CountSoFar;
+  UINT64      OriginalFilePosition;
+
+
+  if (Handle == NULL
+    ||Size   == NULL
+    ||(Buffer==NULL&&*Size!=0)
+   ){
+    return (EFI_INVALID_PARAMETER);
+  }
+  if (Buffer != NULL) {
+    *Buffer = CHAR_NULL;
+  }
+  FileHandleGetPosition(Handle, &OriginalFilePosition);
+  if (OriginalFilePosition == 0) {
+    CharSize = sizeof(CHAR16);
+    Status = FileHandleRead(Handle, &CharSize, &CharBuffer);
+    ASSERT_EFI_ERROR(Status);
+    if (CharBuffer == gUnicodeFileTag) {
+      *Ascii = FALSE;
+    } else {
+      *Ascii = TRUE;
+      FileHandleSetPosition(Handle, OriginalFilePosition);
+    }
+  }
+
+  for (CountSoFar = 0;;CountSoFar++){
+    CharBuffer = 0;
+    if (*Ascii) {
+      CharSize = sizeof(CHAR8);
+    } else {
+      CharSize = sizeof(CHAR16);
+    }
+    Status = FileHandleRead(Handle, &CharSize, &CharBuffer);
+    if (  EFI_ERROR(Status)
+       || CharSize == 0
+       || (CharBuffer == L'\n' && !(*Ascii))
+       || (CharBuffer ==  '\n' && *Ascii)
+     ){
+      break;
+    }
+    //
+    // if we have space save it...
+    //
+    if ((CountSoFar+1)*sizeof(CHAR16) < *Size){
+      ASSERT(Buffer != NULL);
+      ((CHAR16*)Buffer)[CountSoFar] = CharBuffer;
+      ((CHAR16*)Buffer)[CountSoFar+1] = CHAR_NULL;
+    }
+  }
+
+  //
+  // if we ran out of space tell when...
+  //
+  if ((CountSoFar+1)*sizeof(CHAR16) > *Size){
+    *Size = (CountSoFar+1)*sizeof(CHAR16);
+    if (!Truncate) {
+      FileHandleSetPosition(Handle, OriginalFilePosition);
+    } else {
+      DEBUG((DEBUG_WARN, "The line was truncated in FileHandleReadLine"));
+    }
+    return (EFI_BUFFER_TOO_SMALL);
+  }
+  while(Buffer[StrLen(Buffer)-1] == L'\r') {
+    Buffer[StrLen(Buffer)-1] = CHAR_NULL;
+  }
+
+  return (Status);
+}
+
+/**
+  function to write a line of unicode text to a file.
+
+  if Handle is NULL, return error.
+  if Buffer is NULL, do nothing.  (return SUCCESS)
+
+  @param[in]     Handle         FileHandle to write to
+  @param[in]     Buffer         Buffer to write
+
+  @retval  EFI_SUCCESS          the data was written.
+  @retval  other                failure.
+
+  @sa FileHandleWrite
+**/
+EFI_STATUS
+EFIAPI
+FileHandleWriteLine(
+  IN EFI_FILE_HANDLE Handle,
+  IN CHAR16          *Buffer
+  )
+{
+  EFI_STATUS Status;
+  UINTN      Size;
+
+  if (Buffer == NULL) {
+    return (EFI_SUCCESS);
+  }
+
+  if (Handle == NULL) {
+    return (EFI_INVALID_PARAMETER);
+  }
+
+  Size = StrSize(Buffer) - sizeof(Buffer[0]);
+  Status = FileHandleWrite(Handle, &Size, Buffer);
+  if (EFI_ERROR(Status)) {
+    return (Status);
+  }
+  Size = StrSize(L"\r\n") - sizeof(CHAR16);
+  return FileHandleWrite(Handle, &Size, L"\r\n");
+}
+
+/**
+  function to take a formatted argument and print it to a file.
+
+  @param[in] Handle   the file handle for the file to write to
+  @param[in] Format   the format argument (see printlib for format specifier)
+  @param[in] ...      the variable arguments for the format
+
+  @retval EFI_SUCCESS the operation was sucessful
+  @return other       a return value from FileHandleWriteLine
+
+  @sa FileHandleWriteLine
+**/
+EFI_STATUS
+EFIAPI
+FileHandlePrintLine(
+  IN EFI_FILE_HANDLE  Handle,
+  IN CONST CHAR16     *Format,
+  ...
+  )
+{
+  VA_LIST           Marker;
+  CHAR16            *Buffer;
+  EFI_STATUS        Status;
+
+  //
+  // Get a buffer to print into
+  //
+  Buffer = AllocateZeroPool (PcdGet16 (PcdUefiFileHandleLibPrintBufferSize));
+  if (Buffer == NULL) {
+    return (EFI_OUT_OF_RESOURCES);
+  }
+
+  //
+  // Print into our buffer
+  //
+  VA_START (Marker, Format);
+  UnicodeVSPrint (Buffer, PcdGet16 (PcdUefiFileHandleLibPrintBufferSize), 
Format, Marker);
+  VA_END (Marker);
+
+  //
+  // Print buffer into file
+  //
+  Status = FileHandleWriteLine(Handle, Buffer);
+
+  //
+  // Cleanup and return
+  //
+  FreePool(Buffer);
+  return (Status);
+}
+
+/**
+  Function to determine if a FILE_HANDLE is at the end of the file.
+
+  This will NOT work on directories.
+
+  If Handle is NULL, then return False.
+
+  @param[in] Handle     the file handle
+
+  @retval TRUE          the position is at the end of the file
+  @retval FALSE         the position is not at the end of the file
+**/
+BOOLEAN
+EFIAPI
+FileHandleEof(
+  IN EFI_FILE_HANDLE Handle
+  )
+{
+  EFI_FILE_INFO *Info;
+  UINT64        Pos;
+  BOOLEAN       RetVal;
+
+  if (Handle == NULL) {
+    return (FALSE);
+  }
+
+  FileHandleGetPosition(Handle, &Pos);
+  Info = FileHandleGetInfo (Handle);
+
+  if (Info == NULL) {
+    return (FALSE);
+  }
+
+  FileHandleSetPosition(Handle, Pos);
+
+  if (Pos == Info->FileSize) {
+    RetVal = TRUE;
+  } else {
+    RetVal = FALSE;
+  }
+
+  FreePool (Info);
+
+  return (RetVal);
+}

Added: trunk/edk2/MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
===================================================================
--- trunk/edk2/MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf           
                (rev 0)
+++ trunk/edk2/MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf   
2015-01-13 01:04:07 UTC (rev 16601)
@@ -0,0 +1,47 @@
+##  @file
+# Provides interface to shell functionality for shell commands and 
applications.
+#
+#   Copyright (c) 2006 - 2014, Intel Corporation. All rights reserved. <BR>
+#   This program and the accompanying materials
+#   are licensed and made available under the terms and conditions of the BSD 
License
+#   which accompanies this distribution. The full text of the license may be 
found at
+#   http://opensource.org/licenses/bsd-license.php
+#
+#  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+#  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR 
IMPLIED.
+##
+
+[Defines]
+  INF_VERSION                    = 0x00010006
+  BASE_NAME                      = BaseFileHandleLib
+  FILE_GUID                      = 9495D344-9D8A-41f3-8D17-E2FD238C4E71
+  MODULE_TYPE                    = DXE_DRIVER
+  VERSION_STRING                 = 1.0
+  LIBRARY_CLASS                  = FileHandleLib|DXE_DRIVER UEFI_APPLICATION 
UEFI_DRIVER DXE_RUNTIME_DRIVER
+
+#
+#  VALID_ARCHITECTURES           = IA32 X64 IPF EBC
+#
+
+[Sources.common]
+  UefiFileHandleLib.c
+
+[Packages]
+  MdePkg/MdePkg.dec
+
+[LibraryClasses]
+  MemoryAllocationLib
+  BaseLib
+  BaseMemoryLib
+  DebugLib
+  PrintLib
+  PcdLib
+
+[Protocols]
+  gEfiSimpleFileSystemProtocolGuid             # ALWAYS_USED
+
+[Guids]
+  gEfiFileInfoGuid                              # ALWAYS_CONSUMED
+
+[Pcd.common]
+  gEfiMdePkgTokenSpaceGuid.PcdUefiFileHandleLibPrintBufferSize  # 
ALWAYS_CONSUMED

Modified: trunk/edk2/MdePkg/MdePkg.dec
===================================================================
--- trunk/edk2/MdePkg/MdePkg.dec        2015-01-12 12:28:36 UTC (rev 16600)
+++ trunk/edk2/MdePkg/MdePkg.dec        2015-01-13 01:04:07 UTC (rev 16601)
@@ -226,6 +226,9 @@
   ##  @libraryclass  Defines library APIs used by modules to get/set print 
error level.
   DebugPrintErrorLevelLib|Include/Library/DebugPrintErrorLevelLib.h
 
+  ##  @libraryclass  provides EFI_FILE_HANDLE services
+  FileHandleLib|Include/Library/FileHandleLib.h
+
 [LibraryClasses.IA32, LibraryClasses.X64]
   ##  @libraryclass  Abstracts both S/W SMI generation and detection.
   ##
@@ -1706,6 +1709,11 @@
   # @Prompt Maximum Printable Number of Characters.
   gEfiMdePkgTokenSpaceGuid.PcdUefiLibMaxPrintBufferSize|320|UINT32|0x101
 
+  ## This is the print buffer length for FileHandleLib.
+  #  FileHandlePrintLine() sizes buffers based on this PCD value for printing.
+  # @Prompt Number of Printable Characters.
+  
gEfiMdePkgTokenSpaceGuid.PcdUefiFileHandleLibPrintBufferSize|1536|UINT16|0x201
+
   ## Indicates the allowable maximum number in extract handler table.
   # @Prompt Maximum Number of GuidedExtractHandler.
   
gEfiMdePkgTokenSpaceGuid.PcdMaximumGuidedExtractHandler|0x10|UINT32|0x00000025
@@ -1785,4 +1793,4 @@
   gEfiMdePkgTokenSpaceGuid.PcdDefaultTerminalType|0|UINT8|0x00000024
 
 [UserExtensions.TianoCore."ExtraFiles"]
-  MdePkgExtra.uni
\ No newline at end of file
+  MdePkgExtra.uni

Modified: trunk/edk2/NetworkPkg/NetworkPkg.dsc
===================================================================
--- trunk/edk2/NetworkPkg/NetworkPkg.dsc        2015-01-12 12:28:36 UTC (rev 
16600)
+++ trunk/edk2/NetworkPkg/NetworkPkg.dsc        2015-01-13 01:04:07 UTC (rev 
16601)
@@ -48,14 +48,14 @@
   OpensslLib|CryptoPkg/Library/OpensslLib/OpensslLib.inf
   IntrinsicLib|CryptoPkg/Library/IntrinsicLib/IntrinsicLib.inf
   
DebugPrintErrorLevelLib|MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.inf
  
+  FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
+  SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
 
 [LibraryClasses.common.UEFI_DRIVER]
   DebugLib|MdePkg/Library/UefiDebugLibConOut/UefiDebugLibConOut.inf
 
 [LibraryClasses.common.UEFI_APPLICATION]
   DebugLib|MdePkg/Library/UefiDebugLibStdErr/UefiDebugLibStdErr.inf
-  FileHandleLib|ShellPkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
-  SortLib|ShellPkg/Library/UefiSortLib/UefiSortLib.inf
   ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
 
 [LibraryClasses.ARM, LibraryClasses.AARCH64]

Modified: trunk/edk2/OvmfPkg/OvmfPkgIa32.dsc
===================================================================
--- trunk/edk2/OvmfPkg/OvmfPkgIa32.dsc  2015-01-12 12:28:36 UTC (rev 16600)
+++ trunk/edk2/OvmfPkg/OvmfPkgIa32.dsc  2015-01-13 01:04:07 UTC (rev 16601)
@@ -88,7 +88,7 @@
   
UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
   
DevicePathLib|MdePkg/Library/UefiDevicePathLibDevicePathProtocol/UefiDevicePathLibDevicePathProtocol.inf
   NvVarsFileLib|OvmfPkg/Library/NvVarsFileLib/NvVarsFileLib.inf
-  FileHandleLib|ShellPkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
+  FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
   UefiCpuLib|UefiCpuPkg/Library/BaseUefiCpuLib/BaseUefiCpuLib.inf
   
SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf
   NetLib|MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf
@@ -571,11 +571,10 @@
       
NULL|ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.inf
       
NULL|ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
       
HandleParsingLib|ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf
-      FileHandleLib|ShellPkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
       ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
-      SortLib|ShellPkg/Library/UefiSortLib/UefiSortLib.inf
+      FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
+      SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
       PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
-      PathLib|ShellPkg/Library/BasePathLib/BasePathLib.inf
 #      SafeBlockIoLib|ShellPkg/Library/SafeBlockIoLib/SafeBlockIoLib.inf
 #      
SafeOpenProtocolLib|ShellPkg/Library/SafeOpenProtocolLib/SafeOpenProtocolLib.inf
       
BcfgCommandLib|ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.inf

Modified: trunk/edk2/OvmfPkg/OvmfPkgIa32X64.dsc
===================================================================
--- trunk/edk2/OvmfPkg/OvmfPkgIa32X64.dsc       2015-01-12 12:28:36 UTC (rev 
16600)
+++ trunk/edk2/OvmfPkg/OvmfPkgIa32X64.dsc       2015-01-13 01:04:07 UTC (rev 
16601)
@@ -93,7 +93,7 @@
   
UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
   
DevicePathLib|MdePkg/Library/UefiDevicePathLibDevicePathProtocol/UefiDevicePathLibDevicePathProtocol.inf
   NvVarsFileLib|OvmfPkg/Library/NvVarsFileLib/NvVarsFileLib.inf
-  FileHandleLib|ShellPkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
+  FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
   UefiCpuLib|UefiCpuPkg/Library/BaseUefiCpuLib/BaseUefiCpuLib.inf
   
SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf
   NetLib|MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf
@@ -578,11 +578,10 @@
       
NULL|ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.inf
       
NULL|ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
       
HandleParsingLib|ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf
-      FileHandleLib|ShellPkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
       ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
-      SortLib|ShellPkg/Library/UefiSortLib/UefiSortLib.inf
+      FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
+      SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
       PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
-      PathLib|ShellPkg/Library/BasePathLib/BasePathLib.inf
 #      SafeBlockIoLib|ShellPkg/Library/SafeBlockIoLib/SafeBlockIoLib.inf
 #      
SafeOpenProtocolLib|ShellPkg/Library/SafeOpenProtocolLib/SafeOpenProtocolLib.inf
       
BcfgCommandLib|ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.inf

Modified: trunk/edk2/OvmfPkg/OvmfPkgX64.dsc
===================================================================
--- trunk/edk2/OvmfPkg/OvmfPkgX64.dsc   2015-01-12 12:28:36 UTC (rev 16600)
+++ trunk/edk2/OvmfPkg/OvmfPkgX64.dsc   2015-01-13 01:04:07 UTC (rev 16601)
@@ -93,7 +93,7 @@
   
UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
   
DevicePathLib|MdePkg/Library/UefiDevicePathLibDevicePathProtocol/UefiDevicePathLibDevicePathProtocol.inf
   NvVarsFileLib|OvmfPkg/Library/NvVarsFileLib/NvVarsFileLib.inf
-  FileHandleLib|ShellPkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
+  FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
   UefiCpuLib|UefiCpuPkg/Library/BaseUefiCpuLib/BaseUefiCpuLib.inf
   
SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf
   NetLib|MdeModulePkg/Library/DxeNetLib/DxeNetLib.inf
@@ -576,11 +576,10 @@
       
NULL|ShellPkg/Library/UefiShellInstall1CommandsLib/UefiShellInstall1CommandsLib.inf
       
NULL|ShellPkg/Library/UefiShellNetwork1CommandsLib/UefiShellNetwork1CommandsLib.inf
       
HandleParsingLib|ShellPkg/Library/UefiHandleParsingLib/UefiHandleParsingLib.inf
-      FileHandleLib|ShellPkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
       ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
-      SortLib|ShellPkg/Library/UefiSortLib/UefiSortLib.inf
+      FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
+      SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
       PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf
-      PathLib|ShellPkg/Library/BasePathLib/BasePathLib.inf
 #      SafeBlockIoLib|ShellPkg/Library/SafeBlockIoLib/SafeBlockIoLib.inf
 #      
SafeOpenProtocolLib|ShellPkg/Library/SafeOpenProtocolLib/SafeOpenProtocolLib.inf
       
BcfgCommandLib|ShellPkg/Library/UefiShellBcfgCommandLib/UefiShellBcfgCommandLib.inf

Modified: trunk/edk2/PerformancePkg/PerformancePkg.dsc
===================================================================
--- trunk/edk2/PerformancePkg/PerformancePkg.dsc        2015-01-12 12:28:36 UTC 
(rev 16600)
+++ trunk/edk2/PerformancePkg/PerformancePkg.dsc        2015-01-13 01:04:07 UTC 
(rev 16601)
@@ -1,7 +1,7 @@
 ## @file
 # Build description file to generate Shell DP application.
 #
-# Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>
+# Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
 # This program and the accompanying materials
 # are licensed and made available under the terms and conditions of the BSD 
License
 # which accompanies this distribution.  The full text of the license may be 
found at
@@ -47,10 +47,10 @@
   
UefiHiiServicesLib|MdeModulePkg/Library/UefiHiiServicesLib/UefiHiiServicesLib.inf
   PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf
   IoLib|MdePkg/Library/BaseIoLibIntrinsic/BaseIoLibIntrinsic.inf
+  FileHandleLib|MdePkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
+  SortLib|MdeModulePkg/Library/UefiSortLib/UefiSortLib.inf
 
-  SortLib|ShellPkg/Library/UefiSortLib/UefiSortLib.inf
   ShellLib|ShellPkg/Library/UefiShellLib/UefiShellLib.inf
-  FileHandleLib|ShellPkg/Library/UefiFileHandleLib/UefiFileHandleLib.inf
 
   PciLib|MdePkg/Library/BasePciLibCf8/BasePciLibCf8.inf
   PciCf8Lib|MdePkg/Library/BasePciCf8Lib/BasePciCf8Lib.inf

Modified: trunk/edk2/ShellPkg/Application/Shell/Shell.h
===================================================================
--- trunk/edk2/ShellPkg/Application/Shell/Shell.h       2015-01-12 12:28:36 UTC 
(rev 16600)
+++ trunk/edk2/ShellPkg/Application/Shell/Shell.h       2015-01-13 01:04:07 UTC 
(rev 16601)
@@ -46,7 +46,6 @@
 #include <Library/HiiLib.h>
 #include <Library/PrintLib.h>
 #include <Library/HandleParsingLib.h>
-#include <Library/PathLib.h>
 #include <Library/FileHandleLib.h>
 
 #include "ShellParametersProtocol.h"

Modified: trunk/edk2/ShellPkg/Application/Shell/Shell.inf
===================================================================
--- trunk/edk2/ShellPkg/Application/Shell/Shell.inf     2015-01-12 12:28:36 UTC 
(rev 16600)
+++ trunk/edk2/ShellPkg/Application/Shell/Shell.inf     2015-01-13 01:04:07 UTC 
(rev 16601)
@@ -2,7 +2,7 @@
 #  This is the shell application
 #
 #  Copyright (c) 2013, Hewlett-Packard Development Company, L.P.
-#  Copyright (c) 2009 - 2013, Intel Corporation. All rights reserved.<BR>
+#  Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
 #
 #  This program and the accompanying materials
 #  are licensed and made available under the terms and conditions of the BSD 
License
@@ -70,7 +70,6 @@
   HiiLib
   SortLib
   HandleParsingLib
-  PathLib
 
 [Guids]
   gShellVariableGuid                                      # ALWAYS_CONSUMES

Modified: trunk/edk2/ShellPkg/Application/ShellSortTestApp/ShellSortTestApp.inf
===================================================================
--- trunk/edk2/ShellPkg/Application/ShellSortTestApp/ShellSortTestApp.inf       
2015-01-12 12:28:36 UTC (rev 16600)
+++ trunk/edk2/ShellPkg/Application/ShellSortTestApp/ShellSortTestApp.inf       
2015-01-13 01:04:07 UTC (rev 16601)
@@ -1,7 +1,7 @@
 ## @file
 #  This is the shell sorting testing application
 #
-#  Copyright (c) 2009 - 2010, Intel Corporation. All rights reserved.<BR>
+#  Copyright (c) 2009 - 2014, Intel Corporation. All rights reserved.<BR>
 #
 #  This program and the accompanying materials
 #  are licensed and made available under the terms and conditions of the BSD 
License
@@ -33,6 +33,7 @@
 [Packages]
   MdePkg/MdePkg.dec
   ShellPkg/ShellPkg.dec
+  MdeModulePkg/MdeModulePkg.dec
 
 [LibraryClasses]
   ShellCEntryLib

Deleted: trunk/edk2/ShellPkg/Include/Library/FileHandleLib.h
===================================================================
--- trunk/edk2/ShellPkg/Include/Library/FileHandleLib.h 2015-01-12 12:28:36 UTC 
(rev 16600)
+++ trunk/edk2/ShellPkg/Include/Library/FileHandleLib.h 2015-01-13 01:04:07 UTC 
(rev 16601)
@@ -1,498 +0,0 @@
-/** @file
-  Provides interface to EFI_FILE_HANDLE functionality.
-
-  Copyright (c) 2009 - 2011, Intel Corporation. All rights reserved.<BR>
-  This program and the accompanying materials
-  are licensed and made available under the terms and conditions of the BSD 
License
-  which accompanies this distribution.  The full text of the license may be 
found at
-  http://opensource.org/licenses/bsd-license.php
-
-  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
-  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-
-**/
-
-#ifndef _FILE_HANDLE_LIBRARY_HEADER_
-#define _FILE_HANDLE_LIBRARY_HEADER_
-
-#include <Protocol/SimpleFileSystem.h>
-
-/// The tag for use in identifying UNICODE files.
-/// If the file is UNICODE, the first 16 bits of the file will equal this 
value.
-extern CONST UINT16 gUnicodeFileTag;
-
-/**
-  This function retrieves information about the file for the handle
-  specified and stores it in the allocated pool memory.
-
-  This function allocates a buffer to store the file's information. It is the
-  caller's responsibility to free the buffer.
-
-  @param[in] FileHandle         The file handle of the file for which 
information is
-                                being requested.
-
-  @retval NULL                  Information could not be retrieved.
-  @retval !NULL                 The information about the file.
-**/
-EFI_FILE_INFO*
-EFIAPI
-FileHandleGetInfo (
-  IN EFI_FILE_HANDLE            FileHandle
-  );
-
-/**
-  This function sets the information about the file for the opened handle
-  specified.
-
-  @param[in]  FileHandle        The file handle of the file for which 
information
-                                is being set.

@@ Diff output truncated at 100000 characters. @@

------------------------------------------------------------------------------
New Year. New Location. New Benefits. New Data Center in Ashburn, VA.
GigeNET is offering a free month of service with a new server in Ashburn.
Choose from 2 high performing configs, both with 100TB of bandwidth.
Higher redundancy.Lower latency.Increased capacity.Completely compliant.
http://p.sf.net/sfu/gigenet
_______________________________________________
edk2-commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/edk2-commits

Reply via email to