--- /dev/null
+/*++\r
+\r
+Copyright (c) 2004 - 2005, Intel Corporation \r
+All rights reserved. This program and the accompanying materials \r
+are licensed and made available under the terms and conditions of the BSD License \r
+which accompanies this distribution. The full text of the license may be found at \r
+http://opensource.org/licenses/bsd-license.php \r
+ \r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
+\r
+Module Name:\r
+\r
+ Console.c\r
+\r
+Abstract:\r
+\r
+ Console based on Win32 APIs. \r
+\r
+--*/\r
+\r
+#include "Console.h"\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixConsoleDriverBindingSupported (\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE Handle,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
+ );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixConsoleDriverBindingStart (\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE Handle,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
+ );\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixConsoleDriverBindingStop (\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE Handle,\r
+ IN UINTN NumberOfChildren,\r
+ IN EFI_HANDLE *ChildHandleBuffer\r
+ );\r
+\r
+EFI_DRIVER_BINDING_PROTOCOL gUnixConsoleDriverBinding = {\r
+ UnixConsoleDriverBindingSupported,\r
+ UnixConsoleDriverBindingStart,\r
+ UnixConsoleDriverBindingStop,\r
+ 0x10,\r
+ NULL,\r
+ NULL\r
+};\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixConsoleDriverBindingSupported (\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE Handle,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+Arguments:\r
+\r
+Returns:\r
+\r
+ None\r
+\r
+--*/\r
+// TODO: This - add argument and description to function comment\r
+// TODO: Handle - add argument and description to function comment\r
+// TODO: RemainingDevicePath - add argument and description to function comment\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_UNIX_IO_PROTOCOL *UnixIo;\r
+\r
+ //\r
+ // Open the IO Abstraction(s) needed to perform the supported test\r
+ //\r
+ Status = gBS->OpenProtocol (\r
+ Handle,\r
+ &gEfiUnixIoProtocolGuid,\r
+ (void *)&UnixIo,\r
+ This->DriverBindingHandle,\r
+ Handle,\r
+ EFI_OPEN_PROTOCOL_BY_DRIVER\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ //\r
+ // Make sure that the Unix Thunk Protocol is valid\r
+ //\r
+ Status = EFI_UNSUPPORTED;\r
+ if (UnixIo->UnixThunk->Signature == EFI_UNIX_THUNK_PROTOCOL_SIGNATURE) {\r
+\r
+ //\r
+ // Check the GUID to see if this is a handle type the driver supports\r
+ //\r
+ if (CompareGuid (UnixIo->TypeGuid, &gEfiUnixConsoleGuid)) {\r
+ Status = EFI_SUCCESS;\r
+ }\r
+ }\r
+\r
+ //\r
+ // Close the I/O Abstraction(s) used to perform the supported test\r
+ //\r
+ gBS->CloseProtocol (\r
+ Handle,\r
+ &gEfiUnixIoProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Handle\r
+ );\r
+\r
+ return Status;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixConsoleDriverBindingStart (\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE Handle,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+Arguments:\r
+\r
+Returns:\r
+\r
+ None\r
+\r
+--*/\r
+// TODO: This - add argument and description to function comment\r
+// TODO: Handle - add argument and description to function comment\r
+// TODO: RemainingDevicePath - add argument and description to function comment\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_UNIX_IO_PROTOCOL *UnixIo;\r
+ UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
+\r
+ //\r
+ // Grab the IO abstraction we need to get any work done\r
+ //\r
+ Status = gBS->OpenProtocol (\r
+ Handle,\r
+ &gEfiUnixIoProtocolGuid,\r
+ (void *)&UnixIo,\r
+ This->DriverBindingHandle,\r
+ Handle,\r
+ EFI_OPEN_PROTOCOL_BY_DRIVER\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ Status = gBS->AllocatePool (\r
+ EfiBootServicesData,\r
+ sizeof (UNIX_SIMPLE_TEXT_PRIVATE_DATA),\r
+ (void *)&Private\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ goto Done;\r
+ }\r
+\r
+ ZeroMem (Private, sizeof (UNIX_SIMPLE_TEXT_PRIVATE_DATA));\r
+\r
+ Private->Signature = UNIX_SIMPLE_TEXT_PRIVATE_DATA_SIGNATURE;\r
+ Private->Handle = Handle;\r
+ Private->UnixIo = UnixIo;\r
+ Private->UnixThunk = UnixIo->UnixThunk;\r
+\r
+ UnixSimpleTextOutOpenWindow (Private);\r
+ UnixSimpleTextInAttachToWindow (Private);\r
+\r
+ Status = gBS->InstallMultipleProtocolInterfaces (\r
+ &Handle,\r
+ &gEfiSimpleTextOutProtocolGuid,\r
+ &Private->SimpleTextOut,\r
+ &gEfiSimpleTextInProtocolGuid,\r
+ &Private->SimpleTextIn,\r
+ NULL\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+Done:\r
+ gBS->CloseProtocol (\r
+ Handle,\r
+ &gEfiUnixIoProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Handle\r
+ );\r
+ if (Private != NULL) {\r
+\r
+ FreeUnicodeStringTable (Private->ControllerNameTable);\r
+\r
+#if 0
+ if (Private->NtOutHandle != NULL) {\r
+ Private->UnixThunk->CloseHandle (Private->NtOutHandle);\r
+ }\r
+#endif
+\r
+ if (Private->SimpleTextIn.WaitForKey != NULL) {\r
+ gBS->CloseEvent (Private->SimpleTextIn.WaitForKey);\r
+ }\r
+\r
+ gBS->FreePool (Private);\r
+ }\r
+\r
+ return Status;\r
+}\r
+\r
+EFI_STATUS\r
+EFIAPI\r
+UnixConsoleDriverBindingStop (\r
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
+ IN EFI_HANDLE Handle,\r
+ IN UINTN NumberOfChildren,\r
+ IN EFI_HANDLE *ChildHandleBuffer\r
+ )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+ TODO: Add function description\r
+\r
+Arguments:\r
+\r
+ This - TODO: add argument description\r
+ Handle - TODO: add argument description\r
+ NumberOfChildren - TODO: add argument description\r
+ ChildHandleBuffer - TODO: add argument description\r
+\r
+Returns:\r
+\r
+ EFI_UNSUPPORTED - TODO: Add description for return value\r
+\r
+--*/\r
+{\r
+ EFI_SIMPLE_TEXT_OUT_PROTOCOL *SimpleTextOut;\r
+ EFI_STATUS Status;\r
+ UNIX_SIMPLE_TEXT_PRIVATE_DATA *Private;\r
+\r
+ //\r
+ // Kick people off our interface???\r
+ //\r
+ Status = gBS->OpenProtocol (\r
+ Handle,\r
+ &gEfiSimpleTextOutProtocolGuid,\r
+ (void *)&SimpleTextOut,\r
+ This->DriverBindingHandle,\r
+ Handle,\r
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
+ );\r
+ if (EFI_ERROR (Status)) {\r
+ return EFI_UNSUPPORTED;\r
+ }\r
+\r
+ Private = UNIX_SIMPLE_TEXT_OUT_PRIVATE_DATA_FROM_THIS (SimpleTextOut);\r
+\r
+ ASSERT (Private->Handle == Handle);\r
+\r
+ Status = gBS->UninstallMultipleProtocolInterfaces (\r
+ Handle,\r
+ &gEfiSimpleTextOutProtocolGuid,\r
+ &Private->SimpleTextOut,\r
+ &gEfiSimpleTextInProtocolGuid,\r
+ &Private->SimpleTextIn,\r
+ NULL\r
+ );\r
+ if (!EFI_ERROR (Status)) {\r
+\r
+ //\r
+ // Shut down our device\r
+ //\r
+ Status = gBS->CloseProtocol (\r
+ Handle,\r
+ &gEfiUnixIoProtocolGuid,\r
+ This->DriverBindingHandle,\r
+ Handle\r
+ );\r
+\r
+ Status = gBS->CloseEvent (Private->SimpleTextIn.WaitForKey);\r
+ ASSERT_EFI_ERROR (Status);\r
+\r
+#if 0
+ Private->UnixThunk->CloseHandle (Private->NtOutHandle);\r
+#endif
+ //\r
+ // DO NOT close Private->NtInHandle. It points to StdIn and not\r
+ // the Private->NtOutHandle is StdIn and should not be closed!\r
+ //\r
+ FreeUnicodeStringTable (Private->ControllerNameTable);\r
+\r
+ gBS->FreePool (Private);\r
+ }\r
+\r
+ return Status;\r
+}\r