fixed one bug when "reconnect -r"

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8116 6f19259b-4bc3-4df7-8a09-765794883524
diff --git a/EdkShellPkg/ShellHotFix.patch b/EdkShellPkg/ShellHotFix.patch
index e4aa54b..23ca26c 100644
--- a/EdkShellPkg/ShellHotFix.patch
+++ b/EdkShellPkg/ShellHotFix.patch
@@ -168,65 +168,65 @@
 --- edit/libEditor.c	(revision 30)

 +++ edit/libEditor.c	(working copy)

 @@ -88,8 +88,6 @@

-   )

- {

-   EFI_STATUS  Status;

--  EFI_HANDLE  *HandleBuffer;

--  UINTN       HandleCount;

- 

-   //

-   // basic initialization

+   )
+ {
+   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

-   //

+         );
+ 
+   //
+-  // 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)

@@ -248,67 +248,67 @@
 +      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

 ===================================================================

@@ -504,171 +504,182 @@
 --- 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

+     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,9 +1027,8 @@

-   EFI_HANDLE                *AllHandleBuffer;

-   VOID                      *Interface;

- 

--  *ConsoleHandle    = NULL;

--  *ConsoleInterface = NULL;

-   ConsoleIndex      = 0;

-+  AllHandleBuffer   = NULL;

- 

-   DevicePath        = LibGetVariable (VariableName, &gEfiGlobalVariableGuid);

-   if (DevicePath != NULL) {

-@@ -1028,17 +1036,19 @@

-     FreePool (DevicePath);

-   }

- 

--  AllHandleBuffer = NULL;

--  Status = BS->LocateHandleBuffer (

--                ByProtocol,

--                PrimaryGuid,

--                NULL,

--                &AllHandleCount,

--                &AllHandleBuffer

--                );

--  if (!EFI_ERROR (Status) && AllHandleCount > 0) {

--    *ConsoleHandle = AllHandleBuffer[0];

--  } else if (*ConsoleHandle == NULL) {

-+  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 +1073,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 +1091,7 @@

-           );

-   }

- 

--  if (AllHandleBuffer) {

-+  if (AllHandleBuffer != NULL) {

-     FreePool (AllHandleBuffer);

-   }

- }

-@@ -1189,8 +1199,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 +1212,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 +1234,6 @@

- 

-   SEnvConnectConsole (

-     VarConsoleOut,

--    &gEfiPrimaryConsoleOutDeviceGuid,

-     &gEfiSimpleTextOutProtocolGuid,

-     &ST->ConsoleOutHandle,

-     (VOID **) &ST->ConOut

-@@ -1235,7 +1241,6 @@

- 

-   SEnvConnectConsole (

-     VarConsoleIn,

--    &gEfiPrimaryConsoleInDeviceGuid,

-     &gEfiSimpleTextInProtocolGuid,

-     &ST->ConsoleInHandle,

-     (VOID **) &ST->ConIn

-@@ -1254,6 +1259,8 @@

-   SetCrc (&ST->Hdr);

- }

- 

-+

-+

- EFI_STATUS

- EFIAPI

- SEnvCmdReconnect (

+ 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)