From: vanjeff Date: Fri, 17 Apr 2009 05:40:21 +0000 (+0000) Subject: fixed one bug when "reconnect -r" X-Git-Tag: edk2-stable201903~18148 X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=commitdiff_plain;h=e672aebac6f0acbe8c9000cd1857b7a4a9e5080a 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 e4aa54bb78..23ca26c3df 100644 --- a/EdkShellPkg/ShellHotFix.patch +++ b/EdkShellPkg/ShellHotFix.patch @@ -168,65 +168,65 @@ Index: edit/libEditor.c --- 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 @@ Index: edit/libFileBuffer.c + 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 @@ Index: shellenv/Connect.c --- 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)