 +      if ((FileSize >= 2) && (*((UINT16 *) Buffer) == EFI_UNICODE_BYTE_ORDER_MARK)) {
          //
          // Unicode file's size should be even
-         //
+         //
 Index: hexedit/libEditor.c
 ===================================================================
 --- hexedit/libEditor.c	(revision 30)
 +++ hexedit/libEditor.c	(working copy)
 @@ -100,8 +100,6 @@
- --*/
- {
-   EFI_STATUS  Status;
--  EFI_HANDLE  *HandleBuffer;
--  UINTN       HandleCount;
- 
-   //
-   // basic initialization
+ --*/
+ {
+   EFI_STATUS  Status;
+-  EFI_HANDLE  *HandleBuffer;
+-  UINTN       HandleCount;
+ 
+   //
+   // basic initialization
 @@ -129,36 +127,19 @@
-         &(HMainEditor.ScreenSize.Row)
-         );
- 
--  HandleBuffer = NULL;
--  Status = LibLocateHandle (
--            ByProtocol,
--            &gEfiPrimaryConsoleInDeviceGuid,
--            NULL,
--            &HandleCount,
--            &HandleBuffer
--            );
--
--  if (!EFI_ERROR (Status)) {
--
--    if (HandleCount > 0) {
--      Status = BS->HandleProtocol (
--                    HandleBuffer[0],
--                    &gEfiSimplePointerProtocolGuid,
--                    &HMainEditor.MouseInterface
--                    );
--      if (EFI_ERROR (Status)) {
--        HMainEditor.MouseInterface = NULL;
--      } else {
--        HMainEditor.MouseAccumulatorX = 0;
--        HMainEditor.MouseAccumulatorY = 0;
--        HMainEditor.MouseSupported    = TRUE;
--      }
--    }
-+  Status = BS->HandleProtocol (
-+                In,
-+                &gEfiSimplePointerProtocolGuid,
-+                &HMainEditor.MouseInterface
-+                );
-+  if (EFI_ERROR (Status)) {
-+    HMainEditor.MouseInterface = NULL;
-+  } else {
-+    HMainEditor.MouseAccumulatorX = 0;
-+    HMainEditor.MouseAccumulatorY = 0;
-+    HMainEditor.MouseSupported    = TRUE;
-   }
- 
--  if (HandleBuffer != NULL) {
--    FreePool (HandleBuffer);
--  }
-   //
-   // below will call the five components' init function
+         &(HMainEditor.ScreenSize.Row)
+         );
+ 
+-  HandleBuffer = NULL;
+-  Status = LibLocateHandle (
+-            ByProtocol,
+-            &gEfiPrimaryConsoleInDeviceGuid,
+-            NULL,
+-            &HandleCount,
+-            &HandleBuffer
+-            );
+-
+-  if (!EFI_ERROR (Status)) {
+-
+-    if (HandleCount > 0) {
+-      Status = BS->HandleProtocol (
+-                    HandleBuffer[0],
+-                    &gEfiSimplePointerProtocolGuid,
+-                    &HMainEditor.MouseInterface
+-                    );
+-      if (EFI_ERROR (Status)) {
+-        HMainEditor.MouseInterface = NULL;
+-      } else {
+-        HMainEditor.MouseAccumulatorX = 0;
+-        HMainEditor.MouseAccumulatorY = 0;
+-        HMainEditor.MouseSupported    = TRUE;
+-      }
+-    }
++  Status = BS->HandleProtocol (
++                In,
++                &gEfiSimplePointerProtocolGuid,
++                &HMainEditor.MouseInterface
++                );
++  if (EFI_ERROR (Status)) {
++    HMainEditor.MouseInterface = NULL;
++  } else {
++    HMainEditor.MouseAccumulatorX = 0;
++    HMainEditor.MouseAccumulatorY = 0;
++    HMainEditor.MouseSupported    = TRUE;
+   }
+ 
+-  if (HandleBuffer != NULL) {
+-    FreePool (HandleBuffer);
+-  }
+   //
+   // below will call the five components' init function
    //
 Index: Library/EfiShellLib.h
 ===================================================================

--- edit/libEditor.c	(revision 30)
+++ edit/libEditor.c	(working copy)
@@ -88,8 +88,6 @@
   )
 {
   EFI_STATUS  Status;
-  EFI_HANDLE  *HandleBuffer;
-  UINTN       HandleCount;
 
   //
   // basic initialization
@@ -117,38 +115,22 @@
         );
 
   //
-  // Find mouse
+  // Find mouse in System Table ConsoleInHandle
   //
-  HandleBuffer = NULL;
-  Status = LibLocateHandle (
-            ByProtocol,
-            &gEfiPrimaryConsoleInDeviceGuid,
-            NULL,
-            &HandleCount,
-            &HandleBuffer
-            );
+  Status = BS->HandleProtocol (
+                In,
+                &gEfiSimplePointerProtocolGuid,
+                &MainEditor.MouseInterface
+                );
 
-  if (!EFI_ERROR (Status)) {
-    if (HandleCount > 0) {
-      Status = BS->HandleProtocol (
-                    HandleBuffer[0],
-                    &gEfiSimplePointerProtocolGuid,
-                    &MainEditor.MouseInterface
-                    );
-
-      if (EFI_ERROR (Status)) {
-        MainEditor.MouseInterface = NULL;
-      } else {
-        MainEditor.MouseAccumulatorX  = 0;
-        MainEditor.MouseAccumulatorY  = 0;
-        MainEditor.MouseSupported     = TRUE;
-      }
-    }
+  if (EFI_ERROR (Status)) {
+    MainEditor.MouseInterface = NULL;
+  } else {
+    MainEditor.MouseAccumulatorX  = 0;
+    MainEditor.MouseAccumulatorY  = 0;
+    MainEditor.MouseSupported     = TRUE;
   }
 
-  if (HandleBuffer) {
-    FreePool (HandleBuffer);
-  }
   //
   // below will call the five components' init function
   //
Index: edit/libFileBuffer.c
===================================================================
--- edit/libFileBuffer.c	(revision 30)

--- shellenv/Connect.c	(revision 30)
+++ shellenv/Connect.c	(working copy)
@@ -831,6 +831,16 @@
     return Status;
   }
 
+  //
+  // Close proxy console before disconnect all devices.
+  //
+  SEnvCloseConsoleProxy (
+    ST->ConsoleInHandle,
+    &ST->ConIn,
+    ST->ConsoleOutHandle,
+    &ST->ConOut
+    );
+
   for (Index = 0; Index < AllHandleCount; Index++) {
     //
     // Check whether the handle is still in handle database
@@ -1004,7 +1014,6 @@
 VOID
 SEnvConnectConsole (
   CHAR16      *VariableName,
-  EFI_GUID    *PrimaryGuid,
   EFI_GUID    *ConsoleGuid,
   EFI_HANDLE  *ConsoleHandle,
   VOID        **ConsoleInterface
@@ -1018,27 +1027,36 @@
   EFI_HANDLE                *AllHandleBuffer;
   VOID                      *Interface;
 
-  *ConsoleHandle    = NULL;
-  *ConsoleInterface = NULL;
   ConsoleIndex      = 0;
+  AllHandleBuffer   = NULL;
 
   DevicePath        = LibGetVariable (VariableName, &gEfiGlobalVariableGuid);
-  if (DevicePath != NULL) {
-    SEnvConnectDevicePath (DevicePath);
-    FreePool (DevicePath);
+  if (DevicePath == NULL) {
+    //
+    // If no any device defined in EFI variable, do nothing
+    //
+    return;
   }
 
-  AllHandleBuffer = NULL;
-  Status = BS->LocateHandleBuffer (
-                ByProtocol,
-                PrimaryGuid,
-                NULL,
-                &AllHandleCount,
-                &AllHandleBuffer
-                );
-  if (!EFI_ERROR (Status) && AllHandleCount > 0) {
-    *ConsoleHandle = AllHandleBuffer[0];
-  } else if (*ConsoleHandle == NULL) {
+  //
+  // Connect all console devices
+  //
+  SEnvConnectDevicePath (DevicePath);
+  FreePool (DevicePath);
+
+  Status = EFI_NOT_FOUND;
+  //
+  // Check ConsoleHandle validation whatever it was updated or not.
+  //
+  if (*ConsoleHandle != NULL) {
+    Status = BS->HandleProtocol (
+                  *ConsoleHandle,
+                  ConsoleGuid,
+                  &Interface
+                  );
+  } 
+
+  if (EFI_ERROR (Status)) {
     AllHandleBuffer = NULL;
     Status = BS->LocateHandleBuffer (
                   ByProtocol,
@@ -1063,16 +1081,16 @@
                       &gEfiDevicePathProtocolGuid,
                       &Interface
                       );
-        if (EFI_ERROR (Status)) {
+        if (!EFI_ERROR (Status)) {
           ConsoleIndex = Index;
           break;
         }
       }
+      
+      *ConsoleHandle = AllHandleBuffer[ConsoleIndex];
     }
   }
 
-  *ConsoleHandle = AllHandleBuffer[ConsoleIndex];
-
   if (*ConsoleHandle != NULL) {
     BS->HandleProtocol (
           *ConsoleHandle,
@@ -1081,7 +1099,7 @@
           );
   }
 
-  if (AllHandleBuffer) {
+  if (AllHandleBuffer != NULL) {
     FreePool (AllHandleBuffer);
   }
 }
@@ -1189,8 +1207,7 @@
   EFI_STATUS  Status;
 
   //
-  // Check current ConIn and ConOut to ensure it is the ConsoleProxy
-  // Otherwise, the Console should not be close
+  // Check current ConIn and ConOut to judge it is the ConsoleProxy
   //
   Status = SEnvCheckConsoleProxy (
             ST->ConsoleInHandle,
@@ -1203,23 +1220,21 @@
   // Indicate the Console is replaced by redirection operation
   // It is not safe to connect Console here
   //
-  if (EFI_ERROR (Status)) {
-    return ;
+  if (!EFI_ERROR (Status)) {
+    //
+    // It is proxy console, to prevent the proxy console form being restored to original console,
+    // close it temporary before connect all console
+    //
+    SEnvCloseConsoleProxy (
+      ST->ConsoleInHandle,
+      &ST->ConIn,
+      ST->ConsoleOutHandle,
+      &ST->ConOut
+      );
   }
-  //
-  // To prevent the proxy console form being restored to original console,
-  // close it temporary before connect all console
-  //
-  SEnvCloseConsoleProxy (
-    ST->ConsoleInHandle,
-    &ST->ConIn,
-    ST->ConsoleOutHandle,
-    &ST->ConOut
-    );
 
   SEnvConnectConsole (
     VarErrorOut,
-    &gEfiPrimaryStandardErrorDeviceGuid,
     &gEfiSimpleTextOutProtocolGuid,
     &ST->StandardErrorHandle,
     (VOID **) &ST->StdErr
@@ -1227,7 +1242,6 @@
 
   SEnvConnectConsole (
     VarConsoleOut,
-    &gEfiPrimaryConsoleOutDeviceGuid,
     &gEfiSimpleTextOutProtocolGuid,
     &ST->ConsoleOutHandle,
     (VOID **) &ST->ConOut
@@ -1235,7 +1249,6 @@
 
   SEnvConnectConsole (
     VarConsoleIn,
-    &gEfiPrimaryConsoleInDeviceGuid,
     &gEfiSimpleTextInProtocolGuid,
     &ST->ConsoleInHandle,
     (VOID **) &ST->ConIn
@@ -1254,6 +1267,8 @@
   SetCrc (&ST->Hdr);
 }
 
+
+
 EFI_STATUS
 EFIAPI
 SEnvCmdReconnect (
Index: SmbiosView/PrintInfo.c
===================================================================
--- SmbiosView/PrintInfo.c	(revision 30)
