]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Console/ConSplitterDxe/ConSplitter.c
Retired gSimpleTextInExNotifyGuid, used local structure address to be notify handle.
[mirror_edk2.git] / MdeModulePkg / Universal / Console / ConSplitterDxe / ConSplitter.c
index 6e996c5fc2aa12d2fa53521f83d796b1acd60e2e..78d9e9497f6d5d25094c0556c0a74c15ed939157 100644 (file)
@@ -1,6 +1,7 @@
 /** @file\r
-  Console Splitter Driver. Any Handle that attatched\r
-  EFI_CONSOLE_IDENTIFIER_PROTOCOL can be bound by this driver.\r
+  Console Splitter Driver. Any Handle that attatched console I/O protocols\r
+  (Console In device, Console Out device, Console Error device, Simple Pointer\r
+  protocol, Absolute Pointer protocol) can be bound by this driver.\r
 \r
   So far it works like any other driver by opening a SimpleTextIn and/or\r
   SimpleTextOut protocol with EFI_OPEN_PROTOCOL_BY_DRIVER attributes. The big\r
@@ -8,13 +9,12 @@
   handle, or construct a child handle like a standard device or bus driver.\r
   This driver produces three virtual handles as children, one for console input\r
   splitter, one for console output splitter and one for error output splitter.\r
-  EFI_CONSOLE_SPLIT_PROTOCOL will be attatched onto each virtual handle to\r
-  identify the splitter type.\r
+  These 3 virtual handles would be installed on gST.\r
 \r
-  Each virtual handle, that supports both the EFI_CONSOLE_SPLIT_PROTOCOL\r
-  and Console I/O protocol, will be produced in the driver entry point.\r
-  The virtual handle are added on driver entry and never removed.\r
-  Such design ensures sytem function well during none console device situation.\r
+  Each virtual handle, that supports the Console I/O protocol, will be produced\r
+  in the driver entry point. The virtual handle are added on driver entry and\r
+  never removed. Such design ensures sytem function well during none console\r
+  device situation.\r
 \r
 Copyright (c) 2006 - 2008 Intel Corporation. <BR>\r
 All rights reserved. This program and the accompanying materials\r
@@ -30,9 +30,9 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 #include "ConSplitter.h"\r
 \r
 //\r
-// Global Variables\r
+// Text In Splitter Private Data template\r
 //\r
-STATIC TEXT_IN_SPLITTER_PRIVATE_DATA  mConIn = {\r
+GLOBAL_REMOVE_IF_UNREFERENCED TEXT_IN_SPLITTER_PRIVATE_DATA  mConIn = {\r
   TEXT_IN_SPLITTER_PRIVATE_DATA_SIGNATURE,\r
   (EFI_HANDLE) NULL,\r
   {\r
@@ -84,13 +84,13 @@ STATIC TEXT_IN_SPLITTER_PRIVATE_DATA  mConIn = {
   },\r
 \r
   {\r
-    0,       //AbsoluteMinX\r
-    0,       //AbsoluteMinY\r
-    0,       //AbsoluteMinZ\r
-    0x10000, //AbsoluteMaxX\r
-    0x10000, //AbsoluteMaxY\r
-    0x10000, //AbsoluteMaxZ\r
-    0        //Attributes\r
+    0,       // AbsoluteMinX\r
+    0,       // AbsoluteMinY\r
+    0,       // AbsoluteMinZ\r
+    0x10000, // AbsoluteMaxX\r
+    0x10000, // AbsoluteMaxY\r
+    0x10000, // AbsoluteMaxZ\r
+    0        // Attributes\r
   },\r
   0,\r
   (EFI_ABSOLUTE_POINTER_PROTOCOL **) NULL,\r
@@ -117,20 +117,31 @@ STATIC TEXT_IN_SPLITTER_PRIVATE_DATA  mConIn = {
   FALSE\r
 };\r
 \r
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_UGA_DRAW_PROTOCOL gUgaDrawProtocolTemplate = {\r
+\r
+//\r
+// Uga Draw Protocol Private Data template\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED EFI_UGA_DRAW_PROTOCOL mUgaDrawProtocolTemplate = {\r
   ConSpliterUgaDrawGetMode,\r
   ConSpliterUgaDrawSetMode,\r
   ConSpliterUgaDrawBlt\r
 };\r
 \r
-GLOBAL_REMOVE_IF_UNREFERENCED EFI_GRAPHICS_OUTPUT_PROTOCOL gGraphicsOutputProtocolTemplate = {\r
+//\r
+// Graphics Output Protocol Private Data template\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED EFI_GRAPHICS_OUTPUT_PROTOCOL mGraphicsOutputProtocolTemplate = {\r
   ConSpliterGraphicsOutputQueryMode,\r
   ConSpliterGraphicsOutputSetMode,\r
   ConSpliterGraphicsOutputBlt,\r
   NULL\r
 };\r
 \r
-STATIC TEXT_OUT_SPLITTER_PRIVATE_DATA mConOut = {\r
+\r
+//\r
+// Text Out Splitter Private Data template\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED TEXT_OUT_SPLITTER_PRIVATE_DATA mConOut = {\r
   TEXT_OUT_SPLITTER_PRIVATE_DATA_SIGNATURE,\r
   (EFI_HANDLE) NULL,\r
   {\r
@@ -194,7 +205,10 @@ STATIC TEXT_OUT_SPLITTER_PRIVATE_DATA mConOut = {
   (INT32 *) NULL\r
 };\r
 \r
-STATIC TEXT_OUT_SPLITTER_PRIVATE_DATA mStdErr = {\r
+//\r
+// Standard Error Text Out Splitter Data Template\r
+//\r
+GLOBAL_REMOVE_IF_UNREFERENCED TEXT_OUT_SPLITTER_PRIVATE_DATA mStdErr = {\r
   TEXT_OUT_SPLITTER_PRIVATE_DATA_SIGNATURE,\r
   (EFI_HANDLE) NULL,\r
   {\r
@@ -258,6 +272,9 @@ STATIC TEXT_OUT_SPLITTER_PRIVATE_DATA mStdErr = {
   (INT32 *) NULL\r
 };\r
 \r
+//\r
+// Driver binding instance for Console Input Device\r
+//\r
 EFI_DRIVER_BINDING_PROTOCOL           gConSplitterConInDriverBinding = {\r
   ConSplitterConInDriverBindingSupported,\r
   ConSplitterConInDriverBindingStart,\r
@@ -267,47 +284,61 @@ EFI_DRIVER_BINDING_PROTOCOL           gConSplitterConInDriverBinding = {
   NULL\r
 };\r
 \r
-EFI_DRIVER_BINDING_PROTOCOL           gConSplitterSimplePointerDriverBinding = {\r
-  ConSplitterSimplePointerDriverBindingSupported,\r
-  ConSplitterSimplePointerDriverBindingStart,\r
-  ConSplitterSimplePointerDriverBindingStop,\r
+//\r
+// Driver binding instance for Console Out device\r
+//\r
+EFI_DRIVER_BINDING_PROTOCOL           gConSplitterConOutDriverBinding = {\r
+  ConSplitterConOutDriverBindingSupported,\r
+  ConSplitterConOutDriverBindingStart,\r
+  ConSplitterConOutDriverBindingStop,\r
   0xa,\r
   NULL,\r
   NULL\r
 };\r
 \r
 //\r
-// Driver binding instance for Absolute Pointer protocol\r
+// Driver binding instance for Standard Error device\r
 //\r
-EFI_DRIVER_BINDING_PROTOCOL           gConSplitterAbsolutePointerDriverBinding = {\r
-  ConSplitterAbsolutePointerDriverBindingSupported,\r
-  ConSplitterAbsolutePointerDriverBindingStart,\r
-  ConSplitterAbsolutePointerDriverBindingStop,\r
+EFI_DRIVER_BINDING_PROTOCOL           gConSplitterStdErrDriverBinding = {\r
+  ConSplitterStdErrDriverBindingSupported,\r
+  ConSplitterStdErrDriverBindingStart,\r
+  ConSplitterStdErrDriverBindingStop,\r
   0xa,\r
   NULL,\r
   NULL\r
 };\r
 \r
-EFI_DRIVER_BINDING_PROTOCOL           gConSplitterConOutDriverBinding = {\r
-  ConSplitterConOutDriverBindingSupported,\r
-  ConSplitterConOutDriverBindingStart,\r
-  ConSplitterConOutDriverBindingStop,\r
+//\r
+// Driver binding instance for Simple Pointer protocol\r
+//\r
+EFI_DRIVER_BINDING_PROTOCOL           gConSplitterSimplePointerDriverBinding = {\r
+  ConSplitterSimplePointerDriverBindingSupported,\r
+  ConSplitterSimplePointerDriverBindingStart,\r
+  ConSplitterSimplePointerDriverBindingStop,\r
   0xa,\r
   NULL,\r
   NULL\r
 };\r
 \r
-EFI_DRIVER_BINDING_PROTOCOL           gConSplitterStdErrDriverBinding = {\r
-  ConSplitterStdErrDriverBindingSupported,\r
-  ConSplitterStdErrDriverBindingStart,\r
-  ConSplitterStdErrDriverBindingStop,\r
+//\r
+// Driver binding instance for Absolute Pointer protocol\r
+//\r
+EFI_DRIVER_BINDING_PROTOCOL           gConSplitterAbsolutePointerDriverBinding = {\r
+  ConSplitterAbsolutePointerDriverBindingSupported,\r
+  ConSplitterAbsolutePointerDriverBindingStart,\r
+  ConSplitterAbsolutePointerDriverBindingStop,\r
   0xa,\r
   NULL,\r
   NULL\r
 };\r
 \r
 /**\r
-  The user Entry Point for module ConSplitter. The user code starts with this function.\r
+  The Entry Point for module ConSplitter. The user code starts with this function.\r
+\r
+  Installs driver module protocols and. Creates virtual device handles for ConIn,\r
+  ConOut, and StdErr. Installs Simple Text In protocol, Simple Text In Ex protocol,\r
+  Simple Pointer protocol, Absolute Pointer protocol on those virtual handlers.\r
+  Installs Graphics Output protocol and/or UGA Draw protocol if needed.\r
 \r
   @param[in] ImageHandle    The firmware allocated handle for the EFI image.\r
   @param[in] SystemTable    A pointer to the EFI System Table.\r
@@ -318,7 +349,7 @@ EFI_DRIVER_BINDING_PROTOCOL           gConSplitterStdErrDriverBinding = {
 **/\r
 EFI_STATUS\r
 EFIAPI\r
-InitializeConSplitter(\r
+ConSplitterDriverEntry(\r
   IN EFI_HANDLE           ImageHandle,\r
   IN EFI_SYSTEM_TABLE     *SystemTable\r
   )\r
@@ -378,39 +409,12 @@ InitializeConSplitter(
              );\r
   ASSERT_EFI_ERROR (Status);\r
 \r
-\r
   //\r
-  // Call the original Entry Point\r
+  // Either Graphics Output protocol or UGA Draw protocol must be supported.\r
   //\r
-  Status = ConSplitterDriverEntry (ImageHandle, SystemTable);\r
-\r
-  return Status;\r
-}\r
-\r
-\r
-\r
-/**\r
-  Intialize a virtual console device to act as an agrigator of physical console\r
-  devices.\r
-\r
-  @param  ImageHandle              (Standard EFI Image entry -\r
-                                   EFI_IMAGE_ENTRY_POINT)\r
-  @param  SystemTable              (Standard EFI Image entry -\r
-                                   EFI_IMAGE_ENTRY_POINT)\r
- EFI_SUCCESS\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-ConSplitterDriverEntry (\r
-  IN EFI_HANDLE                       ImageHandle,\r
-  IN EFI_SYSTEM_TABLE                 *SystemTable\r
-  )\r
-{\r
-  EFI_STATUS  Status;\r
-\r
   ASSERT (FeaturePcdGet (PcdConOutGopSupport) ||\r
           FeaturePcdGet (PcdConOutUgaSupport));\r
+\r
   //\r
   // The driver creates virtual handles for ConIn, ConOut, and StdErr.\r
   // The virtual handles will always exist even if no console exist in the\r
@@ -452,6 +456,7 @@ ConSplitterDriverEntry (
     if (!EFI_ERROR (Status)) {\r
       //\r
       // Update the EFI System Table with new virtual console\r
+      // and update the pointer to Simple Text Input protocol.\r
       //\r
       gST->ConsoleInHandle  = mConIn.VirtualHandle;\r
       gST->ConIn            = &mConIn.TextIn;\r
@@ -464,7 +469,8 @@ ConSplitterDriverEntry (
   if (!EFI_ERROR (Status)) {\r
     if (!FeaturePcdGet (PcdConOutGopSupport)) {\r
       //\r
-      // In EFI mode, UGA Draw protocol is installed\r
+      // If Graphics Outpurt protocol not supported, UGA Draw protocol is installed\r
+      // on the virtual handle.\r
       //\r
       Status = gBS->InstallMultipleProtocolInterfaces (\r
                       &mConOut.VirtualHandle,\r
@@ -480,7 +486,8 @@ ConSplitterDriverEntry (
                       );\r
     } else if (!FeaturePcdGet (PcdConOutUgaSupport)) {\r
       //\r
-      // In UEFI mode, Graphics Output Protocol is installed on virtual handle.\r
+      // If UGA Draw protocol not supported, Graphics Output Protocol is installed\r
+      // on virtual handle.\r
       //\r
       Status = gBS->InstallMultipleProtocolInterfaces (\r
                       &mConOut.VirtualHandle,\r
@@ -496,8 +503,8 @@ ConSplitterDriverEntry (
                       );\r
     } else {\r
       //\r
-      // In EFI and UEFI comptible mode, Graphics Output Protocol and UGA are\r
-      // installed on virtual handle.\r
+      // Boot Graphics Output protocol and UGA Draw protocol are supported,\r
+      // both they will be installed on virtual handle.\r
       //\r
       Status = gBS->InstallMultipleProtocolInterfaces (\r
                       &mConOut.VirtualHandle,\r
@@ -518,6 +525,7 @@ ConSplitterDriverEntry (
     if (!EFI_ERROR (Status)) {\r
       //\r
       // Update the EFI System Table with new virtual console\r
+      // and Update the pointer to Text Output protocol.\r
       //\r
       gST->ConsoleOutHandle = mConOut.VirtualHandle;\r
       gST->ConOut           = &mConOut.TextOut;\r
@@ -535,16 +543,18 @@ ConSplitterDriverEntry (
         );\r
 \r
   return EFI_SUCCESS;\r
-}\r
 \r
+}\r
 \r
 /**\r
-  Construct the ConSplitter.\r
+  Construct console input devices' private data.\r
 \r
   @param  ConInPrivate             A pointer to the TEXT_IN_SPLITTER_PRIVATE_DATA\r
                                    structure.\r
 \r
   @retval EFI_OUT_OF_RESOURCES     Out of resources.\r
+  @retval EFI_SUCCESS              Text Input Devcie's private data has been constructed.\r
+  @retval other                    Failed to construct private data.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -555,7 +565,7 @@ ConSplitterTextInConstructor (
   EFI_STATUS  Status;\r
 \r
   //\r
-  // Initilize console input splitter's private data.\r
+  // Allocate buffer for Simple Text Input device\r
   //\r
   Status = ConSplitterGrowBuffer (\r
             sizeof (EFI_SIMPLE_TEXT_INPUT_PROTOCOL *),\r
@@ -576,7 +586,9 @@ ConSplitterTextInConstructor (
                   &ConInPrivate->LockEvent\r
                   );\r
   ASSERT_EFI_ERROR (Status);\r
-\r
+  //\r
+  // Create Event to wait for a key\r
+  //\r
   Status = gBS->CreateEvent (\r
                   EVT_NOTIFY_WAIT,\r
                   TPL_NOTIFY,\r
@@ -587,7 +599,7 @@ ConSplitterTextInConstructor (
   ASSERT_EFI_ERROR (Status);\r
 \r
   //\r
-  // Buffer for Simple Text Input Ex Protocol\r
+  // Allocate buffer for Simple Text Input Ex device\r
   //\r
   Status = ConSplitterGrowBuffer (\r
              sizeof (EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *),\r
@@ -597,7 +609,9 @@ ConSplitterTextInConstructor (
   if (EFI_ERROR (Status)) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
-\r
+  //\r
+  // Create Event to wait for a key Ex\r
+  //\r
   Status = gBS->CreateEvent (\r
                   EVT_NOTIFY_WAIT,\r
                   TPL_NOTIFY,\r
@@ -609,11 +623,10 @@ ConSplitterTextInConstructor (
 \r
   InitializeListHead (&ConInPrivate->NotifyList);\r
 \r
+  ConInPrivate->AbsolutePointer.Mode = &ConInPrivate->AbsolutePointerMode;\r
   //\r
-  // Allocate Buffer and Create Event for Absolute Pointer and Simple Pointer Protocols\r
+  // Allocate buffer for Absolute Pointer device\r
   //\r
-  ConInPrivate->AbsolutePointer.Mode = &ConInPrivate->AbsolutePointerMode;\r
-\r
   Status = ConSplitterGrowBuffer (\r
             sizeof (EFI_ABSOLUTE_POINTER_PROTOCOL *),\r
             &ConInPrivate->AbsolutePointerListCount,\r
@@ -622,7 +635,9 @@ ConSplitterTextInConstructor (
   if (EFI_ERROR (Status)) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
-\r
+  //\r
+  // Create Event to wait for device input for Absolute pointer device\r
+  //\r
   Status = gBS->CreateEvent (\r
             EVT_NOTIFY_WAIT,\r
             TPL_NOTIFY,\r
@@ -633,7 +648,9 @@ ConSplitterTextInConstructor (
   ASSERT_EFI_ERROR (Status);\r
 \r
   ConInPrivate->SimplePointer.Mode = &ConInPrivate->SimplePointerMode;\r
-\r
+  //\r
+  // Allocate buffer for Simple Pointer device\r
+  //\r
   Status = ConSplitterGrowBuffer (\r
             sizeof (EFI_SIMPLE_POINTER_PROTOCOL *),\r
             &ConInPrivate->PointerListCount,\r
@@ -642,7 +659,9 @@ ConSplitterTextInConstructor (
   if (EFI_ERROR (Status)) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
-\r
+  //\r
+  // Create Event to wait for device input for Simple pointer device\r
+  //\r
   Status = gBS->CreateEvent (\r
                   EVT_NOTIFY_WAIT,\r
                   TPL_NOTIFY,\r
@@ -654,6 +673,16 @@ ConSplitterTextInConstructor (
   return Status;\r
 }\r
 \r
+/**\r
+  Construct console output devices' private data.\r
+\r
+  @param  ConOutPrivate            A pointer to the TEXT_OUT_SPLITTER_PRIVATE_DATA\r
+                                   structure.\r
+\r
+  @retval EFI_OUT_OF_RESOURCES     Out of resources.\r
+  @retval EFI_SUCCESS              Text Input Devcie's private data has been constructed.\r
+\r
+**/\r
 EFI_STATUS\r
 ConSplitterTextOutConstructor (\r
   TEXT_OUT_SPLITTER_PRIVATE_DATA      *ConOutPrivate\r
@@ -666,11 +695,10 @@ ConSplitterTextOutConstructor (
   // Copy protocols template\r
   //\r
   if (FeaturePcdGet (PcdConOutUgaSupport)) {\r
-    CopyMem (&ConOutPrivate->UgaDraw, &gUgaDrawProtocolTemplate, sizeof (EFI_UGA_DRAW_PROTOCOL));\r
+    CopyMem (&ConOutPrivate->UgaDraw, &mUgaDrawProtocolTemplate, sizeof (EFI_UGA_DRAW_PROTOCOL));\r
   }\r
-\r
   if (FeaturePcdGet (PcdConOutGopSupport)) {\r
-    CopyMem (&ConOutPrivate->GraphicsOutput, &gGraphicsOutputProtocolTemplate, sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL));\r
+    CopyMem (&ConOutPrivate->GraphicsOutput, &mGraphicsOutputProtocolTemplate, sizeof (EFI_GRAPHICS_OUTPUT_PROTOCOL));\r
   }\r
 \r
   //\r
@@ -683,7 +711,9 @@ ConSplitterTextOutConstructor (
   // so put current mode back to init state.\r
   //\r
   ConOutPrivate->TextOutMode.Mode = 0xFF;\r
-\r
+  //\r
+  // Allocate buffer for Console Out device\r
+  //\r
   Status = ConSplitterGrowBuffer (\r
             sizeof (TEXT_OUT_AND_GOP_DATA),\r
             &ConOutPrivate->TextOutListCount,\r
@@ -692,7 +722,9 @@ ConSplitterTextOutConstructor (
   if (EFI_ERROR (Status)) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
-\r
+  //\r
+  // Allocate buffer for Text Out query data\r
+  //\r
   Status = ConSplitterGrowBuffer (\r
             sizeof (TEXT_OUT_SPLITTER_QUERY_DATA),\r
             &ConOutPrivate->TextOutQueryDataCount,\r
@@ -701,6 +733,7 @@ ConSplitterTextOutConstructor (
   if (EFI_ERROR (Status)) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
+\r
   //\r
   // Setup the DevNullTextOut console to 80 x 25\r
   //\r
@@ -710,7 +743,7 @@ ConSplitterTextOutConstructor (
 \r
   if (FeaturePcdGet (PcdConOutUgaSupport)) {\r
     //\r
-    // Setup the DevNullUgaDraw to 800 x 600 x 32 bits per pixel\r
+    // Setup the DevNullUgaDraw to 800 x 600 x 32 bits per pixel, 60Hz.\r
     //\r
     ConSpliterUgaDrawSetMode (&ConOutPrivate->UgaDraw, 800, 600, 32, 60);\r
   }\r
@@ -749,25 +782,26 @@ ConSplitterTextOutConstructor (
 \r
     ConOutPrivate->GraphicsOutput.Mode->MaxMode = 1;\r
     //\r
-    // Initial current mode to unknow state, and then set to mode 0\r
+    // Initial current mode to unknown state, and then set to mode 0\r
     //\r
     ConOutPrivate->GraphicsOutput.Mode->Mode = 0xffff;\r
     ConOutPrivate->GraphicsOutput.SetMode (&ConOutPrivate->GraphicsOutput, 0);\r
   }\r
 \r
-  return Status;\r
+  return EFI_SUCCESS;\r
 }\r
 \r
 \r
 /**\r
-  Generic Supported Check\r
+  Test to see if the specified protocol could be supported on the specified device.\r
 \r
-  @param  This                     Pointer to protocol.\r
-  @param  ControllerHandle         Controller Handle.\r
-  @param  Guid                     Guid.\r
+  @param  This                Driver Binding protocol pointer.\r
+  @param  ControllerHandle    Handle of device to test.\r
+  @param  Guid                The specified protocol.\r
 \r
-  @retval EFI_UNSUPPORTED          unsupported.\r
-  @retval EFI_SUCCESS              operation is OK.\r
+  @retval EFI_SUCCESS         The specified protocol is supported on this device.\r
+  @retval EFI_UNSUPPORTED     The specified protocol attempts to be installed on virtul handle.\r
+  @retval other               Failed to open specified protocol on this device.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -783,19 +817,15 @@ ConSplitterSupported (
   //\r
   // Make sure the Console Splitter does not attempt to attach to itself\r
   //\r
-  if (ControllerHandle == mConIn.VirtualHandle) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  if (ControllerHandle == mConOut.VirtualHandle) {\r
+  if (ControllerHandle == mConIn.VirtualHandle  ||\r
+      ControllerHandle == mConOut.VirtualHandle ||\r
+      ControllerHandle == mStdErr.VirtualHandle\r
+      ) {\r
     return EFI_UNSUPPORTED;\r
   }\r
 \r
-  if (ControllerHandle == mStdErr.VirtualHandle) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
   //\r
-  // Check to see whether the handle has the ConsoleInDevice GUID on it\r
+  // Check to see whether the specific protocol could be opened BY_DRIVER\r
   //\r
   Status = gBS->OpenProtocol (\r
                   ControllerHandle,\r
@@ -820,15 +850,16 @@ ConSplitterSupported (
   return EFI_SUCCESS;\r
 }\r
 \r
-\r
 /**\r
-  Console In Supported Check\r
+  Test to see if Console In Device could be supported on the Controller.\r
 \r
-  @param  This                     Pointer to protocol.\r
-  @param  ControllerHandle         Controller handle.\r
-  @param  RemainingDevicePath      Remaining device path.\r
+  @param  This                Driver Binding protocol instance pointer.\r
+  @param  ControllerHandle    Handle of device to test.\r
+  @param  RemainingDevicePath Optional parameter use to pick a specific child\r
+                              device to start.\r
 \r
-  @return EFI_STATUS\r
+  @retval EFI_SUCCESS         This driver supports this device.\r
+  @retval other               This driver does not support this device.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -846,15 +877,16 @@ ConSplitterConInDriverBindingSupported (
           );\r
 }\r
 \r
-\r
 /**\r
-  Standard Error Supported Check\r
+  Test to see if Simple Pointer protocol could be supported on the Controller.\r
 \r
-  @param  This                     Pointer to protocol.\r
-  @param  ControllerHandle         Controller handle.\r
-  @param  RemainingDevicePath      Remaining device path.\r
+  @param  This                Driver Binding protocol instance pointer.\r
+  @param  ControllerHandle    Handle of device to test.\r
+  @param  RemainingDevicePath Optional parameter use to pick a specific child\r
+                              device to start.\r
 \r
-  @return EFI_STATUS\r
+  @retval EFI_SUCCESS         This driver supports this device.\r
+  @retval other               This driver does not support this device.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -872,15 +904,16 @@ ConSplitterSimplePointerDriverBindingSupported (
           );\r
 }\r
 \r
-\r
 /**\r
-  Absolute Pointer Supported Check\r
+  Test to see if Absolute Pointer protocol could be supported on the Controller.\r
 \r
-  @param  This                     Pointer to protocol.\r
-  @param  ControllerHandle         Controller handle.\r
-  @param  RemainingDevicePath      Remaining device path.\r
+  @param  This                Driver Binding protocol instance pointer.\r
+  @param  ControllerHandle    Handle of device to test.\r
+  @param  RemainingDevicePath Optional parameter use to pick a specific child\r
+                              device to start.\r
 \r
-  @return EFI_STATUS\r
+  @retval EFI_SUCCESS         This driver supports this device.\r
+  @retval other               This driver does not support this device.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -900,13 +933,15 @@ ConSplitterAbsolutePointerDriverBindingSupported (
 \r
 \r
 /**\r
-  Console Out Supported Check\r
+  Test to see if Console Out Device could be supported on the Controller.\r
 \r
-  @param  This                     Pointer to protocol.\r
-  @param  ControllerHandle         Controller handle.\r
-  @param  RemainingDevicePath      Remaining device path.\r
+  @param  This                Driver Binding protocol instance pointer.\r
+  @param  ControllerHandle    Handle of device to test.\r
+  @param  RemainingDevicePath Optional parameter use to pick a specific child\r
+                              device to start.\r
 \r
-  @return EFI_STATUS\r
+  @retval EFI_SUCCESS         This driver supports this device.\r
+  @retval other               This driver does not support this device.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -924,15 +959,16 @@ ConSplitterConOutDriverBindingSupported (
           );\r
 }\r
 \r
-\r
 /**\r
-  Standard Error Supported Check\r
+  Test to see if Standard Error Device could be supported on the Controller.\r
 \r
-  @param  This                     Pointer to protocol.\r
-  @param  ControllerHandle         Controller handle.\r
-  @param  RemainingDevicePath      Remaining device path.\r
+  @param  This                Driver Binding protocol instance pointer.\r
+  @param  ControllerHandle    Handle of device to test.\r
+  @param  RemainingDevicePath Optional parameter use to pick a specific child\r
+                              device to start.\r
 \r
-  @return EFI_STATUS\r
+  @retval EFI_SUCCESS         This driver supports this device.\r
+  @retval other               This driver does not support this device.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -952,30 +988,37 @@ ConSplitterStdErrDriverBindingSupported (
 \r
 \r
 /**\r
-  Start ConSplitter on ControllerHandle, and create the virtual\r
-  agrogated console device on first call Start for a SimpleTextIn handle.\r
+  Start ConSplitter on devcie handle by opening Console Device Guid on device handle\r
+  and the console virtual handle. And Get the console interface on controller handle.\r
 \r
-  (Standard DriverBinding Protocol Start() function)\r
+  @param  This                      Driver Binding protocol instance pointer.\r
+  @param  ControllerHandle          Handle of device.\r
+  @param  ConSplitterVirtualHandle  Console virtual Handle.\r
+  @param  DeviceGuid                The specified Console Device, such as ConInDev,\r
+                                    ConOutDev.\r
+  @param  InterfaceGuid             The specified protocol to be opened.\r
+  @param  Interface                 Protocol interface returned.\r
 \r
-  @return EFI_ERROR if a SimpleTextIn protocol is not started.\r
+  @retval EFI_SUCCESS               This driver supports this device.\r
+  @retval other                     Failed to open the specified Console Device Guid\r
+                                    or specified protocol.\r
 \r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 ConSplitterStart (\r
   IN  EFI_DRIVER_BINDING_PROTOCOL     *This,\r
   IN  EFI_HANDLE                      ControllerHandle,\r
   IN  EFI_HANDLE                      ConSplitterVirtualHandle,\r
   IN  EFI_GUID                        *DeviceGuid,\r
   IN  EFI_GUID                        *InterfaceGuid,\r
-  IN  VOID                            **Interface\r
+  OUT VOID                            **Interface\r
   )\r
 {\r
   EFI_STATUS  Status;\r
   VOID        *Instance;\r
 \r
   //\r
-  // Check to see whether the handle has the ConsoleInDevice GUID on it\r
+  // Check to see whether the ControllerHandle has the DeviceGuid on it.\r
   //\r
   Status = gBS->OpenProtocol (\r
                   ControllerHandle,\r
@@ -989,6 +1032,9 @@ ConSplitterStart (
     return Status;\r
   }\r
 \r
+  //\r
+  // Create virtual handle and open DeviceGuid on the virtul handle.\r
+  //\r
   Status = gBS->OpenProtocol (\r
                   ControllerHandle,\r
                   DeviceGuid,\r
@@ -998,10 +1044,13 @@ ConSplitterStart (
                   EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
                   );\r
   if (EFI_ERROR (Status)) {\r
-    return Status;\r
+    goto Err;\r
   }\r
 \r
-  return gBS->OpenProtocol (\r
+  //\r
+  // Open InterfaceGuid on the virtul handle.\r
+  //\r
+  Status =  gBS->OpenProtocol (\r
                 ControllerHandle,\r
                 InterfaceGuid,\r
                 Interface,\r
@@ -1009,19 +1058,46 @@ ConSplitterStart (
                 ConSplitterVirtualHandle,\r
                 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
                 );\r
+\r
+  if (!EFI_ERROR (Status)) {\r
+    return EFI_SUCCESS;\r
+  }\r
+\r
+  //\r
+  // close the DeviceGuid on ConSplitter VirtualHandle.\r
+  //\r
+  gBS->CloseProtocol (\r
+        ControllerHandle,\r
+        DeviceGuid,\r
+        This->DriverBindingHandle,\r
+        ConSplitterVirtualHandle\r
+        );\r
+\r
+Err:\r
+  //\r
+  // close the DeviceGuid on ControllerHandle.\r
+  //\r
+  gBS->CloseProtocol (\r
+        ControllerHandle,\r
+        DeviceGuid,\r
+        This->DriverBindingHandle,\r
+        ControllerHandle\r
+        );\r
+\r
+  return Status;\r
 }\r
 \r
 \r
 /**\r
-  Start ConSplitter on ControllerHandle, and create the virtual\r
-  agrogated console device on first call Start for a SimpleTextIn handle.\r
+  Start Console In Consplitter on device handle.\r
 \r
-  @param  This                     Pointer to protocol.\r
-  @param  ControllerHandle         Controller handle.\r
-  @param  RemainingDevicePath      Remaining device path.\r
+  @param  This                 Driver Binding protocol instance pointer.\r
+  @param  ControllerHandle     Handle of device to bind driver to.\r
+  @param  RemainingDevicePath  Optional parameter use to pick a specific child\r
+                               device to start.\r
 \r
-  @return EFI_STATUS\r
-  @return EFI_ERROR if a SimpleTextIn protocol is not started.\r
+  @retval EFI_SUCCESS          Console In Consplitter is added to ControllerHandle.\r
+  @retval other                Console In Consplitter does not support this device.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -1032,9 +1108,9 @@ ConSplitterConInDriverBindingStart (
   IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath\r
   )\r
 {\r
-  EFI_STATUS                     Status;\r
-  EFI_SIMPLE_TEXT_INPUT_PROTOCOL *TextIn;\r
-  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *TextInEx;\r
+  EFI_STATUS                          Status;\r
+  EFI_SIMPLE_TEXT_INPUT_PROTOCOL      *TextIn;\r
+  EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL   *TextInEx;\r
 \r
   //\r
   // Start ConSplitter on ControllerHandle, and create the virtual\r
@@ -1052,6 +1128,9 @@ ConSplitterConInDriverBindingStart (
     return Status;\r
   }\r
 \r
+  //\r
+  // Add this device into Text In devices list.\r
+  //\r
   Status = ConSplitterTextInAddDevice (&mConIn, TextIn);\r
   if (EFI_ERROR (Status)) {\r
     return Status;\r
@@ -1065,25 +1144,28 @@ ConSplitterConInDriverBindingStart (
                   mConIn.VirtualHandle,\r
                   EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
                   );\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
+  if (!EFI_ERROR (Status)) {\r
+    //\r
+    // If Simple Text Input Ex protocol exists,\r
+    // add this device into Text In Ex devices list.\r
+    //\r
+    Status = ConSplitterTextInExAddDevice (&mConIn, TextInEx);\r
   }\r
 \r
-  Status = ConSplitterTextInExAddDevice (&mConIn, TextInEx);\r
-\r
   return Status;\r
 }\r
 \r
 \r
 /**\r
-  Start ConSplitter on ControllerHandle, and create the virtual\r
-  agrogated console device on first call Start for a SimpleTextIn handle.\r
+  Start Simple Pointer Consplitter on device handle.\r
 \r
-  @param  This                     Pointer to protocol.\r
-  @param  ControllerHandle         Controller handle.\r
-  @param  RemainingDevicePath      Remaining device path.\r
+  @param  This                 Driver Binding protocol instance pointer.\r
+  @param  ControllerHandle     Handle of device to bind driver to.\r
+  @param  RemainingDevicePath  Optional parameter use to pick a specific child\r
+                               device to start.\r
 \r
-  @return EFI_ERROR if a SimpleTextIn protocol is not started.\r
+  @retval EFI_SUCCESS          Simple Pointer Consplitter is added to ControllerHandle.\r
+  @retval other                Simple Pointer Consplitter does not support this device.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -1097,6 +1179,10 @@ ConSplitterSimplePointerDriverBindingStart (
   EFI_STATUS                  Status;\r
   EFI_SIMPLE_POINTER_PROTOCOL *SimplePointer;\r
 \r
+  //\r
+  // Start ConSplitter on ControllerHandle, and create the virtual\r
+  // agrogated console device on first call Start for a SimplePointer handle.\r
+  //\r
   Status = ConSplitterStart (\r
             This,\r
             ControllerHandle,\r
@@ -1109,19 +1195,23 @@ ConSplitterSimplePointerDriverBindingStart (
     return Status;\r
   }\r
 \r
+  //\r
+  // Add this devcie into Simple Pointer devices list.\r
+  //\r
   return ConSplitterSimplePointerAddDevice (&mConIn, SimplePointer);\r
 }\r
 \r
 \r
 /**\r
-  Start ConSplitter on ControllerHandle, and create the virtual\r
-  agrogated console device on first call Start for a ConIn handle.\r
+  Start Absolute Pointer Consplitter on device handle.\r
 \r
-  @param  This                     Pointer to protocol.\r
-  @param  ControllerHandle         Controller handle.\r
-  @param  RemainingDevicePath      Remaining device path.\r
+  @param  This                 Driver Binding protocol instance pointer.\r
+  @param  ControllerHandle     Handle of device to bind driver to.\r
+  @param  RemainingDevicePath  Optional parameter use to pick a specific child\r
+                               device to start.\r
 \r
-  @return EFI_ERROR if a AbsolutePointer protocol is not started.\r
+  @retval EFI_SUCCESS          Absolute Pointer Consplitter is added to ControllerHandle.\r
+  @retval other                Absolute Pointer Consplitter does not support this device.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -1135,6 +1225,10 @@ ConSplitterAbsolutePointerDriverBindingStart (
   EFI_STATUS                        Status;\r
   EFI_ABSOLUTE_POINTER_PROTOCOL     *AbsolutePointer;\r
 \r
+  //\r
+  // Start ConSplitter on ControllerHandle, and create the virtual\r
+  // agrogated console device on first call Start for a AbsolutePointer handle.\r
+  //\r
   Status = ConSplitterStart (\r
              This,\r
              ControllerHandle,\r
@@ -1148,19 +1242,23 @@ ConSplitterAbsolutePointerDriverBindingStart (
     return Status;\r
   }\r
 \r
+  //\r
+  // Add this devcie into Absolute Pointer devices list.\r
+  //\r
   return ConSplitterAbsolutePointerAddDevice (&mConIn, AbsolutePointer);\r
 }\r
 \r
 \r
 /**\r
-  Start ConSplitter on ControllerHandle, and create the virtual\r
-  agrogated console device on first call Start for a SimpleTextIn handle.\r
+  Start Console Out Consplitter on device handle.\r
 \r
-  @param  This                     Pointer to protocol.\r
-  @param  ControllerHandle         Controller handle.\r
-  @param  RemainingDevicePath      Remaining device path.\r
+  @param  This                 Driver Binding protocol instance pointer.\r
+  @param  ControllerHandle     Handle of device to bind driver to.\r
+  @param  RemainingDevicePath  Optional parameter use to pick a specific child\r
+                               device to start.\r
 \r
-  @return EFI_ERROR if a SimpleTextIn protocol is not started.\r
+  @retval EFI_SUCCESS          Console Out Consplitter is added to ControllerHandle.\r
+  @retval other                Console Out Consplitter does not support this device.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -1171,11 +1269,17 @@ ConSplitterConOutDriverBindingStart (
   IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath\r
   )\r
 {\r
-  EFI_STATUS                       Status;\r
-  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *TextOut;\r
-  EFI_GRAPHICS_OUTPUT_PROTOCOL     *GraphicsOutput;\r
-  EFI_UGA_DRAW_PROTOCOL            *UgaDraw;\r
+  EFI_STATUS                           Status;\r
+  EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL      *TextOut;\r
+  EFI_GRAPHICS_OUTPUT_PROTOCOL         *GraphicsOutput;\r
+  EFI_UGA_DRAW_PROTOCOL                *UgaDraw;\r
+  UINTN                                SizeOfInfo;\r
+  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
 \r
+  //\r
+  // Start ConSplitter on ControllerHandle, and create the virtual\r
+  // agrogated console device on first call Start for a ConsoleOut handle.\r
+  //\r
   Status = ConSplitterStart (\r
             This,\r
             ControllerHandle,\r
@@ -1204,16 +1308,16 @@ ConSplitterConOutDriverBindingStart (
 \r
   if (EFI_ERROR (Status) && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
     //\r
-    // Open UGA_DRAW protocol\r
+    // Open UGA DRAW protocol\r
     //\r
-    Status = gBS->OpenProtocol (\r
-                    ControllerHandle,\r
-                    &gEfiUgaDrawProtocolGuid,\r
-                    (VOID **) &UgaDraw,\r
-                    This->DriverBindingHandle,\r
-                    mConOut.VirtualHandle,\r
-                    EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
-                    );\r
+    gBS->OpenProtocol (\r
+           ControllerHandle,\r
+           &gEfiUgaDrawProtocolGuid,\r
+           (VOID **) &UgaDraw,\r
+           This->DriverBindingHandle,\r
+           mConOut.VirtualHandle,\r
+           EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+           );\r
   }\r
 \r
   //\r
@@ -1229,12 +1333,26 @@ ConSplitterConOutDriverBindingStart (
   Status = ConSplitterTextOutAddDevice (&mConOut, TextOut, GraphicsOutput, UgaDraw);\r
   ConSplitterTextOutSetAttribute (&mConOut.TextOut, EFI_TEXT_ATTR (EFI_LIGHTGRAY, EFI_BLACK));\r
 \r
-  if (FeaturePcdGet (PcdConOutUgaSupport) && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
+  if (FeaturePcdGet (PcdConOutUgaSupport)) {\r
     //\r
-    // Match the UGA mode data of ConOut with the current mode\r
+    // Get the UGA mode data of ConOut from the current mode\r
     //\r
-    if (UgaDraw != NULL) {\r
-      UgaDraw->GetMode (\r
+    if (GraphicsOutput != NULL) {\r
+      Status = GraphicsOutput->QueryMode (GraphicsOutput, GraphicsOutput->Mode->Mode, &SizeOfInfo, &Info);\r
+      if (EFI_ERROR (Status)) {\r
+        return Status;\r
+      }\r
+      ASSERT ( SizeOfInfo <= sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));\r
+\r
+      mConOut.UgaHorizontalResolution = Info->HorizontalResolution;\r
+      mConOut.UgaVerticalResolution   = Info->VerticalResolution;\r
+      mConOut.UgaColorDepth           = 32;\r
+      mConOut.UgaRefreshRate          = 60;\r
+\r
+      FreePool (Info);\r
+\r
+    } else if (UgaDraw != NULL  && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
+      Status = UgaDraw->GetMode (\r
                  UgaDraw,\r
                  &mConOut.UgaHorizontalResolution,\r
                  &mConOut.UgaVerticalResolution,\r
@@ -1243,19 +1361,21 @@ ConSplitterConOutDriverBindingStart (
                  );\r
     }\r
   }\r
+\r
   return Status;\r
 }\r
 \r
 \r
 /**\r
-  Start ConSplitter on ControllerHandle, and create the virtual\r
-  agrogated console device on first call Start for a SimpleTextIn handle.\r
+  Start Standard Error Consplitter on device handle.\r
 \r
-  @param  This                     Pointer to protocol.\r
-  @param  ControllerHandle         Controller handle.\r
-  @param  RemainingDevicePath      Remaining device path.\r
+  @param  This                 Driver Binding protocol instance pointer.\r
+  @param  ControllerHandle     Handle of device to bind driver to.\r
+  @param  RemainingDevicePath  Optional parameter use to pick a specific child\r
+                               device to start.\r
 \r
-  @return EFI_ERROR if a SimpleTextIn protocol is not started.\r
+  @retval EFI_SUCCESS          Standard Error Consplitter is added to ControllerHandle.\r
+  @retval other                Standard Error Consplitter does not support this device.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -1269,6 +1389,10 @@ ConSplitterStdErrDriverBindingStart (
   EFI_STATUS                       Status;\r
   EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *TextOut;\r
 \r
+  //\r
+  // Start ConSplitter on ControllerHandle, and create the virtual\r
+  // agrogated console device on first call Start for a StandardError handle.\r
+  //\r
   Status = ConSplitterStart (\r
             This,\r
             ControllerHandle,\r
@@ -1316,14 +1440,22 @@ ConSplitterStdErrDriverBindingStart (
 \r
 \r
 /**\r
+  Stop ConSplitter on device handle by closing Console Device Guid on device handle\r
+  and the console virtual handle.\r
 \r
-  (Standard DriverBinding Protocol Stop() function)\r
+  @param  This                      Protocol instance pointer.\r
+  @param  ControllerHandle          Handle of device.\r
+  @param  ConSplitterVirtualHandle  Console virtual Handle.\r
+  @param  DeviceGuid                The specified Console Device, such as ConInDev,\r
+                                    ConOutDev.\r
+  @param  InterfaceGuid             The specified protocol to be opened.\r
+  @param  Interface                 Protocol interface returned.\r
 \r
-  @return None\r
+  @retval EFI_SUCCESS               Stop ConSplitter on ControllerHandle successfully.\r
+  @retval other                     Failed to Stop ConSplitter on ControllerHandle.\r
 \r
 **/\r
 EFI_STATUS\r
-EFIAPI\r
 ConSplitterStop (\r
   IN  EFI_DRIVER_BINDING_PROTOCOL     *This,\r
   IN  EFI_HANDLE                      ControllerHandle,\r
@@ -1355,6 +1487,7 @@ ConSplitterStop (
         This->DriverBindingHandle,\r
         ConSplitterVirtualHandle\r
         );\r
+\r
   gBS->CloseProtocol (\r
         ControllerHandle,\r
         DeviceGuid,\r
@@ -1367,10 +1500,16 @@ ConSplitterStop (
 \r
 \r
 /**\r
+  Stop Console In ConSplitter on ControllerHandle by closing Console In Devcice GUID.\r
 \r
-  (Standard DriverBinding Protocol Stop() function)\r
+  @param  This              Driver Binding protocol instance pointer.\r
+  @param  ControllerHandle  Handle of device to stop driver on\r
+  @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of\r
+                            children is zero stop the entire bus driver.\r
+  @param  ChildHandleBuffer List of Child Handles to Stop.\r
 \r
-  @return None\r
+  @retval EFI_SUCCESS       This driver is removed ControllerHandle\r
+  @retval other             This driver was not removed from this device\r
 \r
 **/\r
 EFI_STATUS\r
@@ -1382,10 +1521,10 @@ ConSplitterConInDriverBindingStop (
   IN  EFI_HANDLE                      *ChildHandleBuffer\r
   )\r
 {\r
-  EFI_STATUS                     Status;\r
-  EFI_SIMPLE_TEXT_INPUT_PROTOCOL *TextIn;\r
-\r
+  EFI_STATUS                        Status;\r
+  EFI_SIMPLE_TEXT_INPUT_PROTOCOL    *TextIn;\r
   EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *TextInEx;\r
+\r
   if (NumberOfChildren == 0) {\r
     return EFI_SUCCESS;\r
   }\r
@@ -1398,16 +1537,20 @@ ConSplitterConInDriverBindingStop (
                   ControllerHandle,\r
                   EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
                   );\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  Status = ConSplitterTextInExDeleteDevice (&mConIn, TextInEx);\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
+  if (!EFI_ERROR (Status)) {\r
+    //\r
+    // If Simple Text Input Ex protocol exists,\r
+    // remove device from Text Input Ex devices list.\r
+    //\r
+    Status = ConSplitterTextInExDeleteDevice (&mConIn, TextInEx);\r
+    if (EFI_ERROR (Status)) {\r
+      return Status;\r
+    }\r
   }\r
 \r
-\r
+  //\r
+  // Close Simple Text In protocol on controller handle and virtual handle.\r
+  //\r
   Status = ConSplitterStop (\r
             This,\r
             ControllerHandle,\r
@@ -1419,18 +1562,26 @@ ConSplitterConInDriverBindingStop (
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
+\r
   //\r
-  // Delete this console input device's data structures.\r
+  // Remove device from Text Input devices list.\r
   //\r
   return ConSplitterTextInDeleteDevice (&mConIn, TextIn);\r
 }\r
 \r
 \r
 /**\r
+  Stop Simple Pointer protocol ConSplitter on ControllerHandle by closing\r
+  Simple Pointer protocol.\r
 \r
-  (Standard DriverBinding Protocol Stop() function)\r
+  @param  This              Driver Binding protocol instance pointer.\r
+  @param  ControllerHandle  Handle of device to stop driver on\r
+  @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of\r
+                            children is zero stop the entire bus driver.\r
+  @param  ChildHandleBuffer List of Child Handles to Stop.\r
 \r
-  @return None\r
+  @retval EFI_SUCCESS       This driver is removed ControllerHandle\r
+  @retval other             This driver was not removed from this device\r
 \r
 **/\r
 EFI_STATUS\r
@@ -1449,6 +1600,9 @@ ConSplitterSimplePointerDriverBindingStop (
     return EFI_SUCCESS;\r
   }\r
 \r
+  //\r
+  // Close Simple Pointer protocol on controller handle and virtual handle.\r
+  //\r
   Status = ConSplitterStop (\r
             This,\r
             ControllerHandle,\r
@@ -1460,18 +1614,26 @@ ConSplitterSimplePointerDriverBindingStop (
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
+\r
   //\r
-  // Delete this console input device's data structures.\r
+  // Remove this device from Simple Pointer device list.\r
   //\r
   return ConSplitterSimplePointerDeleteDevice (&mConIn, SimplePointer);\r
 }\r
 \r
 \r
 /**\r
+  Stop Absolute Pointer protocol ConSplitter on ControllerHandle by closing\r
+  Absolute Pointer protocol.\r
 \r
-  (Standard DriverBinding Protocol Stop() function)\r
+  @param  This              Driver Binding protocol instance pointer.\r
+  @param  ControllerHandle  Handle of device to stop driver on\r
+  @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of\r
+                            children is zero stop the entire bus driver.\r
+  @param  ChildHandleBuffer List of Child Handles to Stop.\r
 \r
-  @return None\r
+  @retval EFI_SUCCESS       This driver is removed ControllerHandle\r
+  @retval other             This driver was not removed from this device\r
 \r
 **/\r
 EFI_STATUS\r
@@ -1490,6 +1652,9 @@ ConSplitterAbsolutePointerDriverBindingStop (
     return EFI_SUCCESS;\r
   }\r
 \r
+  //\r
+  // Close Absolute Pointer protocol on controller handle and virtual handle.\r
+  //\r
   Status = ConSplitterStop (\r
              This,\r
              ControllerHandle,\r
@@ -1501,18 +1666,25 @@ ConSplitterAbsolutePointerDriverBindingStop (
   if (EFI_ERROR (Status)) {\r
     return Status;\r
   }\r
+\r
   //\r
-  // Delete this console input device's data structures.\r
+  // Remove this device from Absolute Pointer device list.\r
   //\r
   return ConSplitterAbsolutePointerDeleteDevice (&mConIn, AbsolutePointer);\r
 }\r
 \r
 \r
 /**\r
+  Stop Console Out ConSplitter on device handle by closing Console Out Devcice GUID.\r
 \r
-  (Standard DriverBinding Protocol Stop() function)\r
+  @param  This              Driver Binding protocol instance pointer.\r
+  @param  ControllerHandle  Handle of device to stop driver on\r
+  @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of\r
+                            children is zero stop the entire bus driver.\r
+  @param  ChildHandleBuffer List of Child Handles to Stop.\r
 \r
-  @return None\r
+  @retval EFI_SUCCESS       This driver is removed ControllerHandle\r
+  @retval other             This driver was not removed from this device\r
 \r
 **/\r
 EFI_STATUS\r
@@ -1531,6 +1703,9 @@ ConSplitterConOutDriverBindingStop (
     return EFI_SUCCESS;\r
   }\r
 \r
+  //\r
+  // Close Absolute Pointer protocol on controller handle and virtual handle.\r
+  //\r
   Status = ConSplitterStop (\r
             This,\r
             ControllerHandle,\r
@@ -1544,17 +1719,23 @@ ConSplitterConOutDriverBindingStop (
   }\r
 \r
   //\r
-  // Delete this console output device's data structures.\r
+  // Remove this device from Text Out device list.\r
   //\r
   return ConSplitterTextOutDeleteDevice (&mConOut, TextOut);\r
 }\r
 \r
 \r
 /**\r
+  Stop Standard Error ConSplitter on ControllerHandle by closing Standard Error GUID.\r
 \r
-  (Standard DriverBinding Protocol Stop() function)\r
+  @param  This              Driver Binding protocol instance pointer.\r
+  @param  ControllerHandle  Handle of device to stop driver on\r
+  @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of\r
+                            children is zero stop the entire bus driver.\r
+  @param  ChildHandleBuffer List of Child Handles to Stop.\r
 \r
-  @retval EFI_SUCCESS              Complete successfully.\r
+  @retval EFI_SUCCESS       This driver is removed ControllerHandle\r
+  @retval other             This driver was not removed from this device\r
 \r
 **/\r
 EFI_STATUS\r
@@ -1573,6 +1754,9 @@ ConSplitterStdErrDriverBindingStop (
     return EFI_SUCCESS;\r
   }\r
 \r
+  //\r
+  // Close Standard Error Device on controller handle and virtual handle.\r
+  //\r
   Status = ConSplitterStop (\r
             This,\r
             ControllerHandle,\r
@@ -1616,14 +1800,13 @@ ConSplitterStdErrDriverBindingStop (
   bytes. Copy the current data in Buffer to the new version of Buffer\r
   and free the old version of buffer.\r
 \r
-  @param  SizeOfCount              Size of element in array\r
-  @param  Count                    Current number of elements in array\r
+  @param  SizeOfCount              Size of element in array.\r
+  @param  Count                    Current number of elements in array.\r
   @param  Buffer                   Bigger version of passed in Buffer with all the\r
-                                   data\r
+                                   data.\r
 \r
-  @retval EFI_SUCCESS              Buffer size has grown\r
-  @retval EFI_OUT_OF_RESOURCES     Could not grow the buffer size\r
-  @return None\r
+  @retval EFI_SUCCESS              Buffer size has grown.\r
+  @retval EFI_OUT_OF_RESOURCES     Could not grow the buffer size.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -1633,8 +1816,6 @@ ConSplitterGrowBuffer (
   IN OUT  VOID                        **Buffer\r
   )\r
 {\r
-  UINTN NewSize;\r
-  UINTN OldSize;\r
   VOID  *Ptr;\r
 \r
   //\r
@@ -1642,32 +1823,28 @@ ConSplitterGrowBuffer (
   // copy the old buffer's content to the new-size buffer,\r
   // then free the old buffer.\r
   //\r
-  OldSize = *Count * SizeOfCount;\r
   *Count += CONSOLE_SPLITTER_CONSOLES_ALLOC_UNIT;\r
-  NewSize = *Count * SizeOfCount;\r
-\r
-  Ptr     = AllocateZeroPool (NewSize);\r
+  Ptr = ReallocatePool (\r
+          SizeOfCount * ((*Count) - CONSOLE_SPLITTER_CONSOLES_ALLOC_UNIT),\r
+          SizeOfCount * (*Count),\r
+          *Buffer\r
+          );\r
   if (Ptr == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
-\r
-  CopyMem (Ptr, *Buffer, OldSize);\r
-\r
-  if (*Buffer != NULL) {\r
-    FreePool (*Buffer);\r
-  }\r
-\r
   *Buffer = Ptr;\r
-\r
   return EFI_SUCCESS;\r
 }\r
 \r
 \r
 /**\r
+  Add Text Input Device in Consplitter Text Input list.\r
 \r
+  @param  Private                  Text In Splitter pointer.\r
+  @param  TextIn                   Simple Text Input protocol pointer.\r
 \r
-  @return EFI_SUCCESS\r
-  @return EFI_OUT_OF_RESOURCES\r
+  @retval EFI_SUCCESS              Text Input Device added successfully.\r
+  @retval EFI_OUT_OF_RESOURCES     Could not grow the buffer size.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -1679,7 +1856,7 @@ ConSplitterTextInAddDevice (
   EFI_STATUS  Status;\r
 \r
   //\r
-  // If the Text In List is full, enlarge it by calling growbuffer().\r
+  // If the Text In List is full, enlarge it by calling ConSplitterGrowBuffer().\r
   //\r
   if (Private->CurrentNumberOfConsoles >= Private->TextInListCount) {\r
     Status = ConSplitterGrowBuffer (\r
@@ -1698,7 +1875,7 @@ ConSplitterTextInAddDevice (
   Private->CurrentNumberOfConsoles++;\r
 \r
   //\r
-  // Extra CheckEvent added to reduce the double CheckEvent() in UI.c\r
+  // Extra CheckEvent added to reduce the double CheckEvent().\r
   //\r
   gBS->CheckEvent (TextIn->WaitForKey);\r
 \r
@@ -1707,10 +1884,13 @@ ConSplitterTextInAddDevice (
 \r
 \r
 /**\r
+  Remove Text Input Device from Consplitter Text Input list.\r
 \r
+  @param  Private                  Text In Splitter pointer.\r
+  @param  TextIn                   Simple Text protocol pointer.\r
 \r
-  @return EFI_SUCCESS\r
-  @return EFI_NOT_FOUND\r
+  @retval EFI_SUCCESS              Simple Text Device removed successfully.\r
+  @retval EFI_NOT_FOUND            No Simple Text Device found.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -1738,6 +1918,16 @@ ConSplitterTextInDeleteDevice (
   return EFI_NOT_FOUND;\r
 }\r
 \r
+/**\r
+  Add Text Input Ex Device in Consplitter Text Input Ex list.\r
+\r
+  @param  Private                  Text In Splitter pointer.\r
+  @param  TextInEx                 Simple Text Input Ex Input protocol pointer.\r
+\r
+  @retval EFI_SUCCESS              Text Input Ex Device added successfully.\r
+  @retval EFI_OUT_OF_RESOURCES     Could not grow the buffer size.\r
+\r
+**/\r
 EFI_STATUS\r
 ConSplitterTextInExAddDevice (\r
   IN  TEXT_IN_SPLITTER_PRIVATE_DATA         *Private,\r
@@ -1747,7 +1937,7 @@ ConSplitterTextInExAddDevice (
   EFI_STATUS  Status;\r
 \r
   //\r
-  // If the TextInEx List is full, enlarge it by calling growbuffer().\r
+  // If the Text Input Ex List is full, enlarge it by calling ConSplitterGrowBuffer().\r
   //\r
   if (Private->CurrentNumberOfExConsoles >= Private->TextInExListCount) {\r
     Status = ConSplitterGrowBuffer (\r
@@ -1760,19 +1950,29 @@ ConSplitterTextInExAddDevice (
     }\r
   }\r
   //\r
-  // Add the new text-in device data structure into the Text In List.\r
+  // Add the new text-in device data structure into the Text Input Ex List.\r
   //\r
   Private->TextInExList[Private->CurrentNumberOfExConsoles] = TextInEx;\r
   Private->CurrentNumberOfExConsoles++;\r
 \r
   //\r
-  // Extra CheckEvent added to reduce the double CheckEvent() in UI.c\r
+  // Extra CheckEvent added to reduce the double CheckEvent().\r
   //\r
   gBS->CheckEvent (TextInEx->WaitForKeyEx);\r
 \r
   return EFI_SUCCESS;\r
 }\r
 \r
+/**\r
+  Remove Text Ex Device from Consplitter Text Input Ex list.\r
+\r
+  @param  Private                  Text In Splitter pointer.\r
+  @param  TextInEx                 Simple Text Ex protocol pointer.\r
+\r
+  @retval EFI_SUCCESS              Simple Text Input Ex Device removed successfully.\r
+  @retval EFI_NOT_FOUND            No Simple Text Input Ex Device found.\r
+\r
+**/\r
 EFI_STATUS\r
 ConSplitterTextInExDeleteDevice (\r
   IN  TEXT_IN_SPLITTER_PRIVATE_DATA         *Private,\r
@@ -1781,7 +1981,7 @@ ConSplitterTextInExDeleteDevice (
 {\r
   UINTN Index;\r
   //\r
-  // Remove the specified text-in device data structure from the Text In List,\r
+  // Remove the specified text-in device data structure from the Text Input Ex List,\r
   // and rearrange the remaining data structures in the Text In List.\r
   //\r
   for (Index = 0; Index < Private->CurrentNumberOfExConsoles; Index++) {\r
@@ -1800,10 +2000,13 @@ ConSplitterTextInExDeleteDevice (
 \r
 \r
 /**\r
+  Add Simple Pointer Device in Consplitter Simple Pointer list.\r
 \r
+  @param  Private                  Text In Splitter pointer.\r
+  @param  SimplePointer            Simple Pointer protocol pointer.\r
 \r
-  @return EFI_OUT_OF_RESOURCES\r
-  @return EFI_SUCCESS\r
+  @retval EFI_SUCCESS              Simple Pointer Device added successfully.\r
+  @retval EFI_OUT_OF_RESOURCES     Could not grow the buffer size.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -1815,7 +2018,7 @@ ConSplitterSimplePointerAddDevice (
   EFI_STATUS  Status;\r
 \r
   //\r
-  // If the Text In List is full, enlarge it by calling growbuffer().\r
+  // If the Simple Pointer List is full, enlarge it by calling ConSplitterGrowBuffer().\r
   //\r
   if (Private->CurrentNumberOfPointers >= Private->PointerListCount) {\r
     Status = ConSplitterGrowBuffer (\r
@@ -1828,18 +2031,23 @@ ConSplitterSimplePointerAddDevice (
     }\r
   }\r
   //\r
-  // Add the new text-in device data structure into the Text In List.\r
+  // Add the new text-in device data structure into the Simple Pointer List.\r
   //\r
   Private->PointerList[Private->CurrentNumberOfPointers] = SimplePointer;\r
   Private->CurrentNumberOfPointers++;\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
 \r
 /**\r
+  Remove Simple Pointer Device from Consplitter Simple Pointer list.\r
 \r
+  @param  Private                  Text In Splitter pointer.\r
+  @param  SimplePointer            Simple Pointer protocol pointer.\r
 \r
-  @return None\r
+  @retval EFI_SUCCESS              Simple Pointer Device removed successfully.\r
+  @retval EFI_NOT_FOUND            No Simple Pointer Device found.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -1850,7 +2058,7 @@ ConSplitterSimplePointerDeleteDevice (
 {\r
   UINTN Index;\r
   //\r
-  // Remove the specified text-in device data structure from the Text In List,\r
+  // Remove the specified text-in device data structure from the Simple Pointer List,\r
   // and rearrange the remaining data structures in the Text In List.\r
   //\r
   for (Index = 0; Index < Private->CurrentNumberOfPointers; Index++) {\r
@@ -1869,10 +2077,13 @@ ConSplitterSimplePointerDeleteDevice (
 \r
 \r
 /**\r
+  Add Absolute Pointer Device in Consplitter Absolute Pointer list.\r
 \r
+  @param  Private                  Text In Splitter pointer.\r
+  @param  AbsolutePointer          Absolute Pointer protocol pointer.\r
 \r
-  @return EFI_OUT_OF_RESOURCES\r
-  @return EFI_SUCCESS\r
+  @retval EFI_SUCCESS              Absolute Pointer Device added successfully.\r
+  @retval EFI_OUT_OF_RESOURCES     Could not grow the buffer size.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -1884,7 +2095,7 @@ ConSplitterAbsolutePointerAddDevice (
   EFI_STATUS  Status;\r
 \r
   //\r
-  // If the Absolute Pointer List is full, enlarge it by calling growbuffer().\r
+  // If the Absolute Pointer List is full, enlarge it by calling ConSplitterGrowBuffer().\r
   //\r
   if (Private->CurrentNumberOfAbsolutePointers >= Private->AbsolutePointerListCount) {\r
     Status = ConSplitterGrowBuffer (\r
@@ -1897,18 +2108,23 @@ ConSplitterAbsolutePointerAddDevice (
     }\r
   }\r
   //\r
-  // Add the new text-in device data structure into the Text In List.\r
+  // Add the new text-in device data structure into the Absolute Pointer List.\r
   //\r
   Private->AbsolutePointerList[Private->CurrentNumberOfAbsolutePointers] = AbsolutePointer;\r
   Private->CurrentNumberOfAbsolutePointers++;\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
 \r
 /**\r
+  Remove Absolute Pointer Device from Consplitter Absolute Pointer list.\r
 \r
+  @param  Private                  Text In Splitter pointer.\r
+  @param  AbsolutePointer          Absolute Pointer protocol pointer.\r
 \r
-  @return None\r
+  @retval EFI_SUCCESS              Absolute Pointer Device removed successfully.\r
+  @retval EFI_NOT_FOUND            No Absolute Pointer Device found.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -1919,8 +2135,8 @@ ConSplitterAbsolutePointerDeleteDevice (
 {\r
   UINTN Index;\r
   //\r
-  // Remove the specified text-in device data structure from the Text In List,\r
-  // and rearrange the remaining data structures in the Text In List.\r
+  // Remove the specified text-in device data structure from the Absolute Pointer List,\r
+  // and rearrange the remaining data structures from the Absolute Pointer List.\r
   //\r
   for (Index = 0; Index < Private->CurrentNumberOfAbsolutePointers; Index++) {\r
     if (Private->AbsolutePointerList[Index] == AbsolutePointer) {\r
@@ -1936,11 +2152,15 @@ ConSplitterAbsolutePointerDeleteDevice (
   return EFI_NOT_FOUND;\r
 }\r
 \r
-\r
 /**\r
+  Reallocate Text Out mode map.\r
 \r
+  Allocate new buffer and copy original buffer into the new buffer.\r
 \r
-  @return None\r
+  @param  Private                  Consplitter Text Out pointer.\r
+\r
+  @retval EFI_SUCCESS              Buffer size has grown\r
+  @retval EFI_OUT_OF_RESOURCES     Could not grow the buffer size.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -1958,9 +2178,12 @@ ConSplitterGrowMapTable (
 \r
   NewSize           = Private->TextOutListCount * sizeof (INT32);\r
   OldTextOutModeMap = Private->TextOutModeMap;\r
-  TotalSize         = NewSize * Private->TextOutQueryDataCount;\r
+  TotalSize         = NewSize * (Private->TextOutQueryDataCount);\r
 \r
-  TextOutModeMap    = AllocateZeroPool (TotalSize);\r
+  //\r
+  // Allocate new buffer for Text Out List.\r
+  //\r
+  TextOutModeMap    = AllocatePool (TotalSize);\r
   if (TextOutModeMap == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
   }\r
@@ -2010,9 +2233,13 @@ ConSplitterGrowMapTable (
 \r
 \r
 /**\r
+  Add new device's output mode to console splitter's mode list.\r
 \r
+  @param  Private               Text Out Splitter pointer\r
+  @param  TextOut               Simple Text Output protocol pointer.\r
 \r
-  @return None\r
+  @retval EFI_SUCCESS           Device added successfully.\r
+  @retval EFI_OUT_OF_RESOURCES  Could not grow the buffer size.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -2080,7 +2307,7 @@ ConSplitterAddOutputMode (
 }\r
 \r
 /**\r
-  Reconstruct TextOutModeMap to get intersection of modes\r
+  Reconstruct TextOutModeMap to get intersection of modes.\r
 \r
   This routine reconstruct TextOutModeMap to get the intersection\r
   of modes for all console out devices. Because EFI/UEFI spec require\r
@@ -2090,26 +2317,25 @@ ConSplitterAddOutputMode (
   @param TextOutModeMap  Current text out mode map, begin with the mode 80x25\r
   @param NewlyAddedMap   New text out mode map, begin with the mode 80x25\r
   @param MapStepSize     Mode step size for one console device\r
-  @param NewMapStepSize  Mode step size for one console device\r
-  @param MaxMode         Current max text mode\r
-  @param CurrentMode     Current text mode\r
-\r
-  @retval None\r
+  @param NewMapStepSize  New Mode step size for one console device\r
+  @param MaxMode         IN: Current max text mode, OUT: Updated max text mode.\r
+  @param CurrentMode     IN: Current text mode,     OUT: Updated current text mode.\r
 \r
 **/\r
 VOID\r
 ConSplitterGetIntersection (\r
-  IN  INT32                           *TextOutModeMap,\r
-  IN  INT32                           *NewlyAddedMap,\r
-  IN  UINTN                           MapStepSize,\r
-  IN  UINTN                           NewMapStepSize,\r
-  OUT INT32                           *MaxMode,\r
-  OUT INT32                           *CurrentMode\r
+  IN     INT32                        *TextOutModeMap,\r
+  IN     INT32                        *NewlyAddedMap,\r
+  IN     UINTN                        MapStepSize,\r
+  IN     UINTN                        NewMapStepSize,\r
+  IN OUT INT32                        *MaxMode,\r
+  IN OUT INT32                        *CurrentMode\r
   )\r
 {\r
   INT32 Index;\r
   INT32 *CurrentMapEntry;\r
   INT32 *NextMapEntry;\r
+  INT32 *NewMapEntry;\r
   INT32 CurrentMaxMode;\r
   INT32 Mode;\r
 \r
@@ -2120,14 +2346,14 @@ ConSplitterGetIntersection (
   //\r
   Index           = 2;\r
   CurrentMapEntry = &TextOutModeMap[MapStepSize * 2];\r
-  NextMapEntry    = &TextOutModeMap[MapStepSize * 2];\r
-  NewlyAddedMap   = &NewlyAddedMap[NewMapStepSize * 2];\r
+  NextMapEntry    = CurrentMapEntry;\r
+  NewMapEntry     = &NewlyAddedMap[NewMapStepSize * 2];\r
 \r
   CurrentMaxMode  = *MaxMode;\r
   Mode            = *CurrentMode;\r
 \r
   while (Index < CurrentMaxMode) {\r
-    if (*NewlyAddedMap == -1) {\r
+    if (*NewMapEntry == -1) {\r
       //\r
       // This mode is not supported any more. Remove it. Special care\r
       // must be taken as this remove will also affect current mode;\r
@@ -2147,7 +2373,7 @@ ConSplitterGetIntersection (
     }\r
 \r
     CurrentMapEntry += MapStepSize;\r
-    NewlyAddedMap += NewMapStepSize;\r
+    NewMapEntry     += NewMapStepSize;\r
     Index++;\r
   }\r
 \r
@@ -2156,13 +2382,11 @@ ConSplitterGetIntersection (
   return ;\r
 }\r
 \r
-\r
 /**\r
+  Sync the device's output mode to console splitter's mode list.\r
 \r
-  @param  Private                  Private data structure.\r
-  @param  TextOut                  Text Out Protocol.\r
-\r
-  @return None\r
+  @param  Private               Text Out Splitter pointer.\r
+  @param  TextOut               Simple Text Output protocol pointer.\r
 \r
 **/\r
 VOID\r
@@ -2198,8 +2422,13 @@ ConSplitterSyncOutputMode (
   MapTable  = TextOutModeMap + Private->CurrentNumberOfConsoles;\r
   while (Mode < TextOut->Mode->MaxMode) {\r
     Status = TextOut->QueryMode (TextOut, Mode, &Columns, &Rows);\r
+\r
     if (EFI_ERROR(Status)) {\r
       if (Mode == 1) {\r
+        //\r
+        // If mode 1 (80x50) is not supported, make sure mode 1 in TextOutQueryData\r
+        // is clear to 0x0.\r
+        //\r
         MapTable[StepSize] = Mode;\r
         TextOutQueryData[Mode].Columns = 0;\r
         TextOutQueryData[Mode].Rows = 0;\r
@@ -2217,10 +2446,8 @@ ConSplitterSyncOutputMode (
         MapTable[Index * StepSize] = Mode;\r
         break;\r
       }\r
-\r
       Index++;\r
     }\r
-\r
     Mode++;\r
   }\r
   //\r
@@ -2241,10 +2468,10 @@ ConSplitterSyncOutputMode (
 \r
 \r
 /**\r
+  Sync output device between ConOut and StdErr output.\r
 \r
-\r
-  @return EFI_SUCCESS\r
-  @return EFI_OUT_OF_RESOURCES\r
+  @retval EFI_SUCCESS              Sync implemented successfully.\r
+  @retval EFI_OUT_OF_RESOURCES     Could not grow the buffer size.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -2378,6 +2605,7 @@ ConSplitterGetIntersectionBetweenConOutAndStrErr (
     &(mConOut.TextOutMode.MaxMode),\r
     &(mConOut.TextOutMode.Mode)\r
     );\r
+\r
   if (mConOut.TextOutMode.Mode < 0) {\r
     mConOut.TextOut.SetMode (&(mConOut.TextOut), 0);\r
   }\r
@@ -2390,6 +2618,7 @@ ConSplitterGetIntersectionBetweenConOutAndStrErr (
     &(mStdErr.TextOutMode.MaxMode),\r
     &(mStdErr.TextOutMode.Mode)\r
     );\r
+\r
   if (mStdErr.TextOutMode.Mode < 0) {\r
     mStdErr.TextOut.SetMode (&(mStdErr.TextOut), 0);\r
   }\r
@@ -2402,9 +2631,14 @@ ConSplitterGetIntersectionBetweenConOutAndStrErr (
 \r
 \r
 /**\r
+  Add Grahpics Output modes into Consplitter Text Out list.\r
 \r
+  @param  Private               Text Out Splitter pointer.\r
+  @param  GraphicsOutput        Graphics Output protocol pointer.\r
+  @param  UgaDraw               UGA Draw protocol pointer.\r
 \r
-  @return None\r
+  @retval EFI_SUCCESS           Output mode added successfully.\r
+  @retval other                 Failed to add output mode.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -2431,9 +2665,7 @@ ConSplitterAddGraphicsOutputMode (
   UINT32                               UgaColorDepth;\r
   UINT32                               UgaRefreshRate;\r
 \r
-  if ((GraphicsOutput == NULL) && (UgaDraw == NULL)) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
+  ASSERT (GraphicsOutput != NULL || UgaDraw != NULL);\r
 \r
   CurrentGraphicsOutputMode = Private->GraphicsOutput.Mode;\r
 \r
@@ -2460,11 +2692,11 @@ ConSplitterAddGraphicsOutputMode (
         CurrentGraphicsOutputMode->SizeOfInfo = GraphicsOutput->Mode->SizeOfInfo;\r
         CurrentGraphicsOutputMode->FrameBufferBase = GraphicsOutput->Mode->FrameBufferBase;\r
         CurrentGraphicsOutputMode->FrameBufferSize = GraphicsOutput->Mode->FrameBufferSize;\r
-\r
+  \r
         //\r
         // Allocate resource for the private mode buffer\r
         //\r
-        ModeBuffer = AllocatePool (GraphicsOutput->Mode->SizeOfInfo * GraphicsOutput->Mode->MaxMode);\r
+        ModeBuffer = AllocatePool (sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION) * GraphicsOutput->Mode->MaxMode);\r
         if (ModeBuffer == NULL) {\r
           return EFI_OUT_OF_RESOURCES;\r
         }\r
@@ -2476,10 +2708,14 @@ ConSplitterAddGraphicsOutputMode (
         //\r
         Mode = ModeBuffer;\r
         for (Index = 0; Index < GraphicsOutput->Mode->MaxMode; Index++) {\r
+          //\r
+          // The Info buffer would be allocated by callee\r
+          //\r
           Status = GraphicsOutput->QueryMode (GraphicsOutput, (UINT32) Index, &SizeOfInfo, &Info);\r
           if (EFI_ERROR (Status)) {\r
             return Status;\r
           }\r
+          ASSERT ( SizeOfInfo <= sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));\r
           CopyMem (Mode, Info, SizeOfInfo);\r
           Mode++;\r
           FreePool (Info);\r
@@ -2499,12 +2735,19 @@ ConSplitterAddGraphicsOutputMode (
         Match = FALSE;\r
 \r
         for (NumberIndex = 0; NumberIndex < GraphicsOutput->Mode->MaxMode; NumberIndex++) {\r
+          //\r
+          // The Info buffer would be allocated by callee\r
+          //\r
           Status = GraphicsOutput->QueryMode (GraphicsOutput, (UINT32) NumberIndex, &SizeOfInfo, &Info);\r
           if (EFI_ERROR (Status)) {\r
             return Status;\r
           }\r
           if ((Info->HorizontalResolution == Mode->HorizontalResolution) &&\r
               (Info->VerticalResolution == Mode->VerticalResolution)) {\r
+            //\r
+            // If GOP device supports one mode in current mode buffer,\r
+            // it will be added into matched mode buffer\r
+            //\r
             Match = TRUE;\r
             FreePool (Info);\r
             break;\r
@@ -2515,6 +2758,9 @@ ConSplitterAddGraphicsOutputMode (
         if (Match) {\r
           AlreadyExist = FALSE;\r
 \r
+          //\r
+          // Check if GOP mode has been in the mode buffer, ModeBuffer = MatchedMode at begin.\r
+          //\r
           for (Info = ModeBuffer; Info < MatchedMode; Info++) {\r
             if ((Info->HorizontalResolution == Mode->HorizontalResolution) &&\r
                 (Info->VerticalResolution == Mode->VerticalResolution)) {\r
@@ -2580,8 +2826,7 @@ ConSplitterAddGraphicsOutputMode (
         }\r
       }\r
     }\r
-  }\r
-  if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
+  } else if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
     //\r
     // Graphics console driver can ensure the same mode for all GOP devices\r
     // so we can get the current mode from this video device\r
@@ -2597,11 +2842,11 @@ ConSplitterAddGraphicsOutputMode (
     CurrentGraphicsOutputMode->MaxMode = 1;\r
     Info = CurrentGraphicsOutputMode->Info;\r
     Info->Version = 0;\r
-    Info->HorizontalResolution = UgaHorizontalResolution;\r
-    Info->VerticalResolution = UgaVerticalResolution;\r
-    Info->PixelFormat = PixelBltOnly;\r
-    Info->PixelsPerScanLine = UgaHorizontalResolution;\r
-    CurrentGraphicsOutputMode->SizeOfInfo = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
+    Info->HorizontalResolution                 = UgaHorizontalResolution;\r
+    Info->VerticalResolution                   = UgaVerticalResolution;\r
+    Info->PixelFormat                          = PixelBltOnly;\r
+    Info->PixelsPerScanLine                    = UgaHorizontalResolution;\r
+    CurrentGraphicsOutputMode->SizeOfInfo      = sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION);\r
     CurrentGraphicsOutputMode->FrameBufferBase = (EFI_PHYSICAL_ADDRESS) (UINTN) NULL;\r
     CurrentGraphicsOutputMode->FrameBufferSize = 0;\r
 \r
@@ -2638,11 +2883,10 @@ Done:
   // Graphics console can ensure all GOP devices have the same mode which can be taken as current mode.\r
   //\r
   Status = Private->GraphicsOutput.SetMode (&Private->GraphicsOutput, (UINT32) CurrentIndex);\r
-\r
-  //\r
-  // If user defined mode is not valid for UGA, set to the default mode 800x600.\r
-  //\r
   if (EFI_ERROR(Status)) {\r
+    //\r
+    // If user defined mode is not valid for display device, set to the default mode 800x600.\r
+    //\r
     (Private->GraphicsOutputModeBuffer[0]).HorizontalResolution = 800;\r
     (Private->GraphicsOutputModeBuffer[0]).VerticalResolution   = 600;\r
     Status = Private->GraphicsOutput.SetMode (&Private->GraphicsOutput, 0);\r
@@ -2651,15 +2895,14 @@ Done:
   return Status;\r
 }\r
 \r
-\r
 /**\r
+  Set the current console out mode.\r
+\r
   This routine will get the current console mode information (column, row)\r
   from ConsoleOutMode variable and set it; if the variable does not exist,\r
   set to user defined console mode.\r
 \r
-  None\r
-\r
-  @return None\r
+  @param  Private            Consplitter Text Out pointer.\r
 \r
 **/\r
 VOID\r
@@ -2667,54 +2910,31 @@ ConsplitterSetConsoleOutMode (
   IN  TEXT_OUT_SPLITTER_PRIVATE_DATA  *Private\r
   )\r
 {\r
-  UINTN                         Col;\r
-  UINTN                         Row;\r
-  UINTN                         Mode;\r
-  UINTN                         PreferMode;\r
-  UINTN                         BaseMode;\r
-  UINTN                         ModeInfoSize;\r
-  UINTN                         MaxMode;\r
-  EFI_STATUS                    Status;\r
-  CONSOLE_OUT_MODE              *ModeInfo;\r
+  UINTN                            Col;\r
+  UINTN                            Row;\r
+  UINTN                            Mode;\r
+  UINTN                            PreferMode;\r
+  UINTN                            BaseMode;\r
+  UINTN                            MaxMode;\r
+  EFI_STATUS                       Status;\r
+  CONSOLE_OUT_MODE                 ModeInfo;\r
   EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL  *TextOut;\r
 \r
   PreferMode   = 0xFF;\r
   BaseMode     = 0xFF;\r
   TextOut      = &Private->TextOut;\r
   MaxMode      = (UINTN) (TextOut->Mode->MaxMode);\r
-  ModeInfoSize = sizeof (CONSOLE_OUT_MODE);\r
-\r
-  ModeInfo = AllocateZeroPool (sizeof(CONSOLE_OUT_MODE));\r
-  ASSERT(ModeInfo != NULL);\r
 \r
-  Status = gRT->GetVariable (\r
-                   VARCONOUTMODE,\r
-                   &gEfiGenericPlatformVariableGuid,\r
-                   NULL,\r
-                   &ModeInfoSize,\r
-                   ModeInfo\r
-                   );\r
+  ModeInfo.Column = PcdGet32 (PcdConOutColumn);\r
+  ModeInfo.Row    = PcdGet32 (PcdConOutRow);\r
 \r
   //\r
-  // Set to the default mode 80 x 25 required by EFI/UEFI spec;\r
-  // user can also define other valid default console mode here.\r
+  // To find the prefer mode and basic mode from Text Out mode list\r
   //\r
-  if (EFI_ERROR(Status)) {\r
-    ModeInfo->Column = 80;\r
-    ModeInfo->Row    = 25;\r
-    Status = gRT->SetVariable (\r
-                    VARCONOUTMODE,\r
-                    &gEfiGenericPlatformVariableGuid,\r
-                    EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
-                    sizeof (CONSOLE_OUT_MODE),\r
-                    ModeInfo\r
-                    );\r
-  }\r
-\r
   for (Mode = 0; Mode < MaxMode; Mode++) {\r
     Status = TextOut->QueryMode (TextOut, Mode, &Col, &Row);\r
     if (!EFI_ERROR(Status)) {\r
-      if (Col == ModeInfo->Column && Row == ModeInfo->Row) {\r
+      if (Col == ModeInfo.Column && Row == ModeInfo.Row) {\r
         PreferMode = Mode;\r
       }\r
       if (Col == 80 && Row == 25) {\r
@@ -2723,39 +2943,35 @@ ConsplitterSetConsoleOutMode (
     }\r
   }\r
 \r
-  Status = TextOut->SetMode (TextOut, PreferMode);\r
-\r
   //\r
-  // if current mode setting is failed, default 80x25 mode will be set.\r
+  // Set prefer mode to Text Out devices.\r
   //\r
+  Status = TextOut->SetMode (TextOut, PreferMode);\r
   if (EFI_ERROR(Status)) {\r
-    Status = TextOut->SetMode (TextOut, BaseMode);\r
-    ASSERT(!EFI_ERROR(Status));\r
-\r
-    ModeInfo->Column = 80;\r
-    ModeInfo->Row    = 25;\r
-\r
     //\r
-    // Update ConOutMode variable\r
+    // if current mode setting is failed, default 80x25 mode will be set.\r
     //\r
-    Status = gRT->SetVariable (\r
-                    VARCONOUTMODE,\r
-                    &gEfiGenericPlatformVariableGuid,\r
-                    EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_NON_VOLATILE,\r
-                    sizeof (CONSOLE_OUT_MODE),\r
-                    ModeInfo\r
-                    );\r
+    Status = TextOut->SetMode (TextOut, BaseMode);\r
+    ASSERT(!EFI_ERROR(Status));\r
+    \r
+    PcdSet32 (PcdConOutColumn, 80);\r
+    PcdSet32 (PcdConOutRow, 25);\r
   }\r
 \r
-  gBS->FreePool (ModeInfo);\r
+  return ;\r
 }\r
 \r
 \r
-\r
 /**\r
+  Add Text Output Device in Consplitter Text Output list.\r
 \r
+  @param  Private                  Text Out Splitter pointer.\r
+  @param  TextOut                  Simple Text Output protocol pointer.\r
+  @param  GraphicsOutput           Graphics Output protocol pointer.\r
+  @param  UgaDraw                  UGA Draw protocol pointer.\r
 \r
-  @return None\r
+  @retval EFI_SUCCESS              Text Output Device added successfully.\r
+  @retval EFI_OUT_OF_RESOURCES     Could not grow the buffer size.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -2766,21 +2982,23 @@ ConSplitterTextOutAddDevice (
   IN  EFI_UGA_DRAW_PROTOCOL              *UgaDraw\r
   )\r
 {\r
-  EFI_STATUS            Status;\r
-  UINTN                 CurrentNumOfConsoles;\r
-  INT32                 CurrentMode;\r
-  INT32                 MaxMode;\r
-  UINT32                UgaHorizontalResolution;\r
-  UINT32                UgaVerticalResolution;\r
-  UINT32                UgaColorDepth;\r
-  UINT32                UgaRefreshRate;\r
-  TEXT_OUT_AND_GOP_DATA *TextAndGop;\r
+  EFI_STATUS                           Status;\r
+  UINTN                                CurrentNumOfConsoles;\r
+  INT32                                CurrentMode;\r
+  INT32                                MaxMode;\r
+  UINT32                               UgaHorizontalResolution;\r
+  UINT32                               UgaVerticalResolution;\r
+  UINT32                               UgaColorDepth;\r
+  UINT32                               UgaRefreshRate;\r
+  TEXT_OUT_AND_GOP_DATA                *TextAndGop;\r
+  UINTN                                SizeOfInfo;\r
+  EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;\r
 \r
   Status                = EFI_SUCCESS;\r
   CurrentNumOfConsoles  = Private->CurrentNumberOfConsoles;\r
 \r
   //\r
-  // If the Text Out List is full, enlarge it by calling growbuffer().\r
+  // If the Text Out List is full, enlarge it by calling ConSplitterGrowBuffer().\r
   //\r
   while (CurrentNumOfConsoles >= Private->TextOutListCount) {\r
     Status = ConSplitterGrowBuffer (\r
@@ -2802,9 +3020,9 @@ ConSplitterTextOutAddDevice (
 \r
   TextAndGop          = &Private->TextOutList[CurrentNumOfConsoles];\r
 \r
-  TextAndGop->TextOut = TextOut;\r
+  TextAndGop->TextOut        = TextOut;\r
   TextAndGop->GraphicsOutput = GraphicsOutput;\r
-  TextAndGop->UgaDraw = UgaDraw;\r
+  TextAndGop->UgaDraw        = UgaDraw;\r
 \r
   if ((GraphicsOutput == NULL) && (UgaDraw == NULL)) {\r
     //\r
@@ -2840,16 +3058,38 @@ ConSplitterTextOutAddDevice (
   MaxMode     = Private->TextOutMode.MaxMode;\r
   ASSERT (MaxMode >= 1);\r
 \r
-  //\r
-  // Update DevNull mode according to current video device\r
-  //\r
   if (FeaturePcdGet (PcdConOutGopSupport)) {\r
-    if ((GraphicsOutput != NULL) || (UgaDraw != NULL)) {\r
+    //\r
+    // If GOP is produced by Consplitter, this device display mode will be added into Graphics Ouput modes.\r
+    //\r
+    if ((GraphicsOutput != NULL) || (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport))) {\r
       ConSplitterAddGraphicsOutputMode (Private, GraphicsOutput, UgaDraw);\r
     }\r
   }\r
+\r
   if (FeaturePcdGet (PcdConOutUgaSupport)) {\r
-    if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
+    UgaHorizontalResolution = 800;\r
+    UgaVerticalResolution   = 600;\r
+    UgaColorDepth           = 32;\r
+    UgaRefreshRate          = 60;\r
+\r
+    Status = EFI_DEVICE_ERROR;\r
+    //\r
+    // If UGA is produced by Consplitter\r
+    //\r
+    if (GraphicsOutput != NULL) {\r
+      Status = GraphicsOutput->QueryMode (GraphicsOutput, GraphicsOutput->Mode->Mode, &SizeOfInfo, &Info);\r
+      if (EFI_ERROR (Status)) {\r
+        return Status;\r
+      }\r
+      ASSERT ( SizeOfInfo <= sizeof (EFI_GRAPHICS_OUTPUT_MODE_INFORMATION));\r
+\r
+      UgaHorizontalResolution = Info->HorizontalResolution;\r
+      UgaVerticalResolution   = Info->VerticalResolution;\r
+\r
+      FreePool (Info);\r
+\r
+    } else if (UgaDraw != NULL && FeaturePcdGet (PcdUgaConsumeSupport)) {\r
       Status = UgaDraw->GetMode (\r
                     UgaDraw,\r
                     &UgaHorizontalResolution,\r
@@ -2857,28 +3097,19 @@ ConSplitterTextOutAddDevice (
                     &UgaColorDepth,\r
                     &UgaRefreshRate\r
                     );\r
-      if (!EFI_ERROR (Status)) {\r
-        Status = ConSpliterUgaDrawSetMode (\r
-                    &Private->UgaDraw,\r
-                    UgaHorizontalResolution,\r
-                    UgaVerticalResolution,\r
-                    UgaColorDepth,\r
-                    UgaRefreshRate\r
-                    );\r
-      }\r
-      //\r
-      // If GetMode/SetMode is failed, set to 800x600 mode\r
-      //\r
-      if(EFI_ERROR (Status)) {\r
-        Status = ConSpliterUgaDrawSetMode (\r
-                    &Private->UgaDraw,\r
-                    800,\r
-                    600,\r
-                    32,\r
-                    60\r
-                    );\r
-      }\r
     }\r
+\r
+    //\r
+    //  Set UGA Draw mode,\r
+    //  if GetMode is failed, set to 800x600 mode\r
+    //\r
+    Status = ConSpliterUgaDrawSetMode (\r
+                &Private->UgaDraw,\r
+                UgaHorizontalResolution,\r
+                UgaVerticalResolution,\r
+                UgaColorDepth,\r
+                UgaRefreshRate\r
+                );\r
   }\r
 \r
   if (Private->ConsoleOutputMode == EfiConsoleControlScreenGraphics && GraphicsOutput != NULL) {\r
@@ -2886,8 +3117,14 @@ ConSplitterTextOutAddDevice (
     // We just added a new GOP or UGA device in graphics mode\r
     //\r
     if (FeaturePcdGet (PcdConOutGopSupport)) {\r
+      //\r
+      // Sync display output on new device based on GOP settings.\r
+      //\r
       DevNullGopSync (Private, TextAndGop->GraphicsOutput, TextAndGop->UgaDraw);\r
     } else if (FeaturePcdGet (PcdConOutUgaSupport)) {\r
+      //\r
+      // Sync display output on new device based on UGA settings.\r
+      //\r
       DevNullUgaSync (Private, TextAndGop->GraphicsOutput, TextAndGop->UgaDraw);\r
     }\r
   } else if ((CurrentMode >= 0) && ((GraphicsOutput != NULL) || (UgaDraw != NULL)) && (CurrentMode < Private->TextOutMode.MaxMode)) {\r
@@ -2913,9 +3150,13 @@ ConSplitterTextOutAddDevice (
 \r
 \r
 /**\r
+  Remove Text Out Device in Consplitter Text Out list.\r
 \r
+  @param  Private                  Text Out Splitter pointer.\r
+  @param  TextOut                  Simple Text Output Pointer protocol pointer.\r
 \r
-  @return None\r
+  @retval EFI_SUCCESS              Text Out Device removed successfully.\r
+  @retval EFI_NOT_FOUND            No Text Out Device found.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -3007,9 +3248,7 @@ ConSplitterTextOutDeleteDevice (
 \r
   return Status;\r
 }\r
-//\r
-// ConSplitter TextIn member functions\r
-//\r
+\r
 \r
 /**\r
   Reset the input device and optionaly run diagnostics\r
@@ -3059,7 +3298,7 @@ ConSplitterTextInReset (
   Reads the next keystroke from the input device. The WaitForKey Event can\r
   be used to test for existance of a keystroke via WaitForEvent () call.\r
 \r
-  @param  This                     Protocol instance pointer.\r
+  @param  Private                  Protocol instance pointer.\r
   @param  Key                      Driver may perform diagnostics on reset.\r
 \r
   @retval EFI_SUCCESS              The keystroke information was returned.\r
@@ -3101,13 +3340,10 @@ ConSplitterTextInPrivateReadKeyStroke (
   return EFI_NOT_READY;\r
 }\r
 \r
-\r
 /**\r
   Return TRUE if StdIn is locked. The ConIn device on the virtual handle is\r
   the only device locked.\r
 \r
-  NONE\r
-\r
   @retval TRUE                     StdIn locked\r
   @retval FALSE                    StdIn working normally\r
 \r
@@ -3122,15 +3358,16 @@ ConSpliterConssoleControlStdInLocked (
 \r
 \r
 /**\r
-  This timer event will fire when StdIn is locked. It will check the key\r
-  sequence on StdIn to see if it matches the password. Any error in the\r
-  password will cause the check to reset. As long a mConIn.PasswordEnabled is\r
-  TRUE the StdIn splitter will not report any input.\r
+  Record and check key sequence on StdIn.\r
 \r
-  (Standard EFI_EVENT_NOTIFY)\r
-\r
-  @return None\r
+  This timer event will fire when StdIn is locked. It will record the key sequence\r
+  on StdIn and also check to see if it matches the password. Any error in the\r
+  password will cause the check to reset. As long as a mConIn.PasswordEnabled is\r
+  TRUE, the StdIn splitter will not report any input.\r
 \r
+  @param  Event                  The Event this notify function registered to.\r
+  @param  Context                Pointer to the context data registerd to the\r
+                                 Event.\r
 **/\r
 VOID\r
 EFIAPI\r
@@ -3148,11 +3385,14 @@ ConSpliterConsoleControlLockStdInEvent (
     Status = ConSplitterTextInPrivateReadKeyStroke (&mConIn, &Key);\r
     if (!EFI_ERROR (Status)) {\r
       //\r
-      // if it's an ENTER, match password\r
+      // If key read successfully\r
       //\r
       if ((Key.UnicodeChar == CHAR_CARRIAGE_RETURN) && (Key.ScanCode == SCAN_NULL)) {\r
+        //\r
+        // If it's an ENTER, match password\r
+        //\r
         mConIn.PwdAttempt[mConIn.PwdIndex] = CHAR_NULL;\r
-        if (StrCmp (mConIn.Password, mConIn.PwdAttempt)) {\r
+        if (StrCmp (mConIn.Password, mConIn.PwdAttempt) != 0) {\r
           //\r
           // Password not match\r
           //\r
@@ -3174,7 +3414,7 @@ ConSpliterConsoleControlLockStdInEvent (
           BackSpaceString[0]  = CHAR_BACKSPACE;\r
           BackSpaceString[1]  = 0;\r
 \r
-          SpaceString[0]      = ' ';\r
+          SpaceString[0]      = L' ';\r
           SpaceString[1]      = 0;\r
 \r
           ConSplitterTextOutOutputString (&mConOut.TextOut, BackSpaceString);\r
@@ -3185,7 +3425,8 @@ ConSpliterConsoleControlLockStdInEvent (
         }\r
       } else if ((Key.ScanCode == SCAN_NULL) && (Key.UnicodeChar >= 32)) {\r
         //\r
-        // If it's not an ENTER, neigher a function key, nor a CTRL-X or ALT-X, record the input\r
+        // If it's not an ENTER, neigher a function key, nor a CTRL-X or ALT-X, record the input,\r
+        // value 32 stands for a Blank Space key.\r
         //\r
         if (mConIn.PwdIndex < (MAX_STD_IN_PASSWORD - 1)) {\r
           if (mConIn.PwdIndex == 0) {\r
@@ -3203,14 +3444,15 @@ ConSpliterConsoleControlLockStdInEvent (
 \r
 \r
 /**\r
-  If Password is NULL unlock the password state variable and set the event\r
-  timer. If the Password is too big return an error. If the Password is valid\r
-  Copy the Password and enable state variable and then arm the periodic timer\r
+  If Password is NULL or the Password is too big, then return an error. If the\r
+  Password is valid, then store the password, lock StdIn and arm the periodic timer.\r
 \r
+  @param  This                     Console Control protocol pointer.\r
+  @param  Password                 The password input.\r
 \r
-  @retval EFI_SUCCESS              Lock the StdIn device\r
-  @retval EFI_INVALID_PARAMETER    Password is NULL\r
-  @retval EFI_OUT_OF_RESOURCES     Buffer allocation to store the password fails\r
+  @retval EFI_SUCCESS              Lock the StdIn device.\r
+  @retval EFI_INVALID_PARAMETER    Password is NULL.\r
+  @retval EFI_OUT_OF_RESOURCES     Buffer allocation to store the password fails.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -3236,7 +3478,10 @@ ConSpliterConsoleControlLockStdIn (
   StrCpy (mConIn.Password, Password);\r
   mConIn.PasswordEnabled  = TRUE;\r
   mConIn.PwdIndex         = 0;\r
-  gBS->SetTimer (mConIn.LockEvent, TimerPeriodic, (10000 * 25));\r
+  //\r
+  // Lock Timer Periodic is 25ms.\r
+  //\r
+  gBS->SetTimer (mConIn.LockEvent, TimerPeriodic, 10000 * 25);\r
 \r
   return EFI_SUCCESS;\r
 }\r
@@ -3280,7 +3525,8 @@ ConSplitterTextInReadKeyStroke (
 \r
 \r
 /**\r
-  This event agregates all the events of the ConIn devices in the spliter.\r
+  This event aggregates all the events of the ConIn devices in the spliter.\r
+\r
   If the ConIn is password locked then return.\r
   If any events of physical ConIn devices are signaled, signal the ConIn\r
   spliter event. This will cause the calling code to call\r
@@ -3289,8 +3535,6 @@ ConSplitterTextInReadKeyStroke (
   @param  Event                    The Event assoicated with callback.\r
   @param  Context                  Context registered when Event was created.\r
 \r
-  @return None\r
-\r
 **/\r
 VOID\r
 EFIAPI\r
@@ -3304,6 +3548,7 @@ ConSplitterTextInWaitForKey (
   UINTN                         Index;\r
 \r
   Private = (TEXT_IN_SPLITTER_PRIVATE_DATA *) Context;\r
+\r
   if (Private->PasswordEnabled) {\r
     //\r
     // If StdIn Locked return not ready\r
@@ -3311,15 +3556,16 @@ ConSplitterTextInWaitForKey (
     return ;\r
   }\r
 \r
-  //\r
-  // if KeyEventSignalState is flagged before, and not cleared by Reset() or ReadKeyStroke()\r
-  //\r
   if (Private->KeyEventSignalState) {\r
+    //\r
+    // If KeyEventSignalState is flagged before, and not cleared by Reset() or ReadKeyStroke()\r
+    //\r
     gBS->SignalEvent (Event);\r
     return ;\r
   }\r
+\r
   //\r
-  // if any physical console input device has key input, signal the event.\r
+  // If any physical console input device has key input, signal the event.\r
   //\r
   for (Index = 0; Index < Private->CurrentNumberOfConsoles; Index++) {\r
     Status = gBS->CheckEvent (Private->TextInList[Index]->WaitForKey);\r
@@ -3333,6 +3579,7 @@ ConSplitterTextInWaitForKey (
 \r
 \r
 /**\r
+  Test if the key has been registered on input device.\r
 \r
   @param  RegsiteredData           A pointer to a buffer that is filled in with the\r
                                    keystroke state data for the key that was\r
@@ -3374,10 +3621,6 @@ IsKeyRegistered (
 \r
 }\r
 \r
-//\r
-// Simple Text Input Ex protocol functions\r
-//\r
-\r
 \r
 /**\r
   Reset the input device and optionaly run diagnostics\r
@@ -3557,7 +3800,7 @@ ConSplitterTextInSetState (
                                    successfully.\r
   @retval EFI_OUT_OF_RESOURCES     Unable to allocate resources for necesssary data\r
                                    structures.\r
-  @retval EFI_INVALID_PARAMETER    KeyData or NotifyHandle is NULL.\r
+  @retval EFI_INVALID_PARAMETER    KeyData or KeyNotificationFunction or NotifyHandle is NULL.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -3584,7 +3827,7 @@ ConSplitterTextInRegisterKeyNotify (
   Private = TEXT_IN_EX_SPLITTER_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   //\r
-  // if no physical console input device exists,\r
+  // If no physical console input device exists,\r
   // return EFI_SUCCESS directly.\r
   //\r
   if (Private->CurrentNumberOfExConsoles <= 0) {\r
@@ -3595,12 +3838,7 @@ ConSplitterTextInRegisterKeyNotify (
   // Return EFI_SUCCESS if the (KeyData, NotificationFunction) is already registered.\r
   //\r
   for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {\r
-    CurrentNotify = CR (\r
-                      Link,\r
-                      TEXT_IN_EX_SPLITTER_NOTIFY,\r
-                      NotifyEntry,\r
-                      TEXT_IN_EX_SPLITTER_NOTIFY_SIGNATURE\r
-                      );\r
+    CurrentNotify = TEXT_IN_EX_SPLITTER_NOTIFY_FROM_THIS (Link);\r
     if (IsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {\r
       if (CurrentNotify->KeyNotificationFn == KeyNotificationFunction) {\r
         *NotifyHandle = CurrentNotify->NotifyHandle;\r
@@ -3623,6 +3861,7 @@ ConSplitterTextInRegisterKeyNotify (
   }\r
   NewNotify->Signature         = TEXT_IN_EX_SPLITTER_NOTIFY_SIGNATURE;\r
   NewNotify->KeyNotificationFn = KeyNotificationFunction;\r
+  NewNotify->NotifyHandle      = (EFI_HANDLE) NewNotify;\r
   CopyMem (&NewNotify->KeyData, KeyData, sizeof (KeyData));\r
 \r
   //\r
@@ -3643,17 +3882,6 @@ ConSplitterTextInRegisterKeyNotify (
     }\r
   }\r
 \r
-  //\r
-  // Use gSimpleTextInExNotifyGuid to get a valid EFI_HANDLE\r
-  //\r
-  Status = gBS->InstallMultipleProtocolInterfaces (\r
-                  &NewNotify->NotifyHandle,\r
-                  &gSimpleTextInExNotifyGuid,\r
-                  NULL,\r
-                  NULL\r
-                  );\r
-  ASSERT_EFI_ERROR (Status);\r
-\r
   InsertTailList (&mConIn.NotifyList, &NewNotify->NotifyEntry);\r
 \r
   *NotifyHandle                = NewNotify->NotifyHandle;\r
@@ -3693,18 +3921,6 @@ ConSplitterTextInUnregisterKeyNotify (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  Status = gBS->OpenProtocol (\r
-                  NotificationHandle,\r
-                  &gSimpleTextInExNotifyGuid,\r
-                  NULL,\r
-                  NULL,\r
-                  NULL,\r
-                  EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
   Private = TEXT_IN_EX_SPLITTER_PRIVATE_DATA_FROM_THIS (This);\r
 \r
   //\r
@@ -3716,7 +3932,7 @@ ConSplitterTextInUnregisterKeyNotify (
   }\r
 \r
   for (Link = Private->NotifyList.ForwardLink; Link != &Private->NotifyList; Link = Link->ForwardLink) {\r
-    CurrentNotify = CR (Link, TEXT_IN_EX_SPLITTER_NOTIFY, NotifyEntry, TEXT_IN_EX_SPLITTER_NOTIFY_SIGNATURE);\r
+    CurrentNotify = TEXT_IN_EX_SPLITTER_NOTIFY_FROM_THIS (Link);\r
     if (CurrentNotify->NotifyHandle == NotificationHandle) {\r
       for (Index = 0; Index < Private->CurrentNumberOfExConsoles; Index++) {\r
         Status = Private->TextInExList[Index]->UnregisterKeyNotify (\r
@@ -3728,13 +3944,7 @@ ConSplitterTextInUnregisterKeyNotify (
         }\r
       }\r
       RemoveEntryList (&CurrentNotify->NotifyEntry);\r
-      Status = gBS->UninstallMultipleProtocolInterfaces (\r
-                      CurrentNotify->NotifyHandle,\r
-                      &gSimpleTextInExNotifyGuid,\r
-                      NULL,\r
-                      NULL\r
-                      );\r
-      ASSERT_EFI_ERROR (Status);\r
+\r
       gBS->FreePool (CurrentNotify->NotifyHandleList);\r
       gBS->FreePool (CurrentNotify);\r
       return EFI_SUCCESS;\r
@@ -3797,7 +4007,8 @@ ConSplitterSimplePointerReset (
   Reads the next keystroke from the input device. The WaitForKey Event can\r
   be used to test for existance of a keystroke via WaitForEvent () call.\r
 \r
-  @param  This                     Protocol instance pointer. State  -\r
+  @param  Private                  Protocol instance pointer.\r
+  @param  State                    The state information of simple pointer device.\r
 \r
   @retval EFI_SUCCESS              The keystroke information was returned.\r
   @retval EFI_NOT_READY            There was no keystroke data availiable.\r
@@ -3873,9 +4084,10 @@ ConSplitterSimplePointerPrivateGetState (
   be used to test for existance of a keystroke via WaitForEvent () call.\r
   If the ConIn is password locked make it look like no keystroke is availible\r
 \r
-  @param  This                     Protocol instance pointer. State  -\r
+  @param  This                     A pointer to protocol instance.\r
+  @param  State                    A pointer to state information on the pointer device\r
 \r
-  @retval EFI_SUCCESS              The keystroke information was returned.\r
+  @retval EFI_SUCCESS              The keystroke information was returned in State.\r
   @retval EFI_NOT_READY            There was no keystroke data availiable.\r
   @retval EFI_DEVICE_ERROR         The keydtroke information was not returned due\r
                                    to hardware errors.\r
@@ -3914,8 +4126,6 @@ ConSplitterSimplePointerGetState (
   @param  Event                    The Event assoicated with callback.\r
   @param  Context                  Context registered when Event was created.\r
 \r
-  @return None\r
-\r
 **/\r
 VOID\r
 EFIAPI\r
@@ -3955,11 +4165,6 @@ ConSplitterSimplePointerWaitForInput (
   }\r
 }\r
 \r
-//\r
-// Absolute Pointer Protocol functions\r
-//\r
-\r
-\r
 /**\r
   Resets the pointer device hardware.\r
 \r
@@ -4099,8 +4304,6 @@ ConSplitterAbsolutePointerGetState (
   @param  Event                    The Event assoicated with callback.\r
   @param  Context                  Context registered when Event was created.\r
 \r
-  @return None\r
-\r
 **/\r
 VOID\r
 EFIAPI\r
@@ -4200,7 +4403,7 @@ ConSplitterTextOutReset (
   Write a Unicode string to the output device.\r
 \r
   @param  This                     Protocol instance pointer.\r
-  @param  String                   The NULL-terminated Unicode string to be\r
+  @param  WString                  The NULL-terminated Unicode string to be\r
                                    displayed on the output device(s). All output\r
                                    devices must also support the Unicode drawing\r
                                    defined in this file.\r
@@ -4245,6 +4448,8 @@ ConSplitterTextOutOutputString (
     TargetString = WString;\r
   } else {\r
     TargetString = AllocatePool (sizeof (CHAR16) * (StrLen (WString) + BackSpaceCount + 1));\r
+    ASSERT (TargetString != NULL);\r
+\r
     StrCpy (TargetString, WString);\r
   }\r
   //\r
@@ -4281,7 +4486,7 @@ ConSplitterTextOutOutputString (
   target device.\r
 \r
   @param  This                     Protocol instance pointer.\r
-  @param  String                   The NULL-terminated Unicode string to be\r
+  @param  WString                  The NULL-terminated Unicode string to be\r
                                    examined for the output device(s).\r
 \r
   @retval EFI_SUCCESS              The device(s) are capable of rendering the\r
@@ -4334,7 +4539,9 @@ ConSplitterTextOutTestString (
 \r
   @param  This                     Protocol instance pointer.\r
   @param  ModeNumber               The mode number to return information on.\r
-  @param  Rows                     Returns the geometry of the text output device\r
+  @param  Columns                  Returns the columns of the text output device\r
+                                   for the requested ModeNumber.\r
+  @param  Rows                     Returns the rows of the text output device\r
                                    for the requested ModeNumber.\r
 \r
   @retval EFI_SUCCESS              The requested mode information was returned.\r
@@ -4583,9 +4790,12 @@ ConSplitterTextOutClearScreen (
   Sets the current coordinates of the cursor position\r
 \r
   @param  This                     Protocol instance pointer.\r
-  @param  Row                      the position to set the cursor to. Must be\r
+  @param  Column                   The column position to set the cursor to. Must be\r
+                                   greater than or equal to zero and less than the\r
+                                   number of columns by QueryMode ().\r
+  @param  Row                      The row position to set the cursor to. Must be\r
                                    greater than or equal to zero and less than the\r
-                                   number of columns and rows by QueryMode ().\r
+                                   number of rows by QueryMode ().\r
 \r
   @retval EFI_SUCCESS              The operation completed successfully.\r
   @retval EFI_DEVICE_ERROR         The device had an error and could not complete\r