WinNtGopDriver.c revision e6e53c97c943d7a93c17871668ee18a900e8da05
1c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu/** @file 2c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 3c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluCopyright (c) 2006 - 2007, Intel Corporation 4c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluAll rights reserved. This program and the accompanying materials 5c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluare licensed and made available under the terms and conditions of the BSD License 6c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluwhich accompanies this distribution. The full text of the license may be found at 7c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluhttp://opensource.org/licenses/bsd-license.php 8c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 9c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 10c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 11c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 12c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluModule Name: 13c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 14c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu WinNtGopDriver.c 15c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 16c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluAbstract: 17c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 18c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu This file implements the UEFI Device Driver model requirements for GOP 19c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 20c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu GOP is short hand for Graphics Output Protocol. 21c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 22c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 23c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu**/ 24c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 25c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// 26c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// The package level header files this module uses 27c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// 28c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu#include <Uefi.h> 29c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu#include <WinNtDxe.h> 30c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// 31c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// The protocols, PPI and GUID defintions for this module 32c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// 33c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu#include <Guid/EventGroup.h> 34c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu#include <Protocol/WinNtIo.h> 35c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu#include <Protocol/ComponentName.h> 36c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu#include <Protocol/SimpleTextIn.h> 37c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu#include <Protocol/DriverBinding.h> 38c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu#include <Protocol/GraphicsOutput.h> 39c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// 40c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// The Library classes this module consumes 41c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// 42c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu#include <Library/DebugLib.h> 43c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu#include <Library/BaseLib.h> 44c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu#include <Library/UefiDriverEntryPoint.h> 45c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu#include <Library/UefiLib.h> 46c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu#include <Library/BaseMemoryLib.h> 47c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu#include <Library/UefiBootServicesTableLib.h> 48c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu#include <Library/MemoryAllocationLib.h> 49c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 50c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu#include "WinNtGop.h" 51c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 52c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluEFI_DRIVER_BINDING_PROTOCOL gWinNtGopDriverBinding = { 53c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu WinNtGopDriverBindingSupported, 54c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu WinNtGopDriverBindingStart, 55c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu WinNtGopDriverBindingStop, 56c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 0xa, 57c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu NULL, 58c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu NULL 59c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu}; 60c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 61c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu/** 62c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu The user Entry Point for module WinNtGop. The user code starts with this function. 63c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 64c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu @param[in] ImageHandle The firmware allocated handle for the EFI image. 65c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu @param[in] SystemTable A pointer to the EFI System Table. 66c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 67c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu @retval EFI_SUCCESS The entry point is executed successfully. 68c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu @retval other Some error occurs when executing this entry point. 69c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 70c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu**/ 71c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluEFI_STATUS 72c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluEFIAPI 73c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluInitializeWinNtGop( 74c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN EFI_HANDLE ImageHandle, 75c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN EFI_SYSTEM_TABLE *SystemTable 76c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ) 77c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu{ 78c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu EFI_STATUS Status; 79c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 80c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 81c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // Install driver model protocol(s). 82c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 83e6e53c97c943d7a93c17871668ee18a900e8da05qhuang Status = EfiLibInstallDriverBindingComponentName2 ( 84c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ImageHandle, 85c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu SystemTable, 86c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gWinNtGopDriverBinding, 87c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ImageHandle, 88c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gWinNtGopComponentName, 89e6e53c97c943d7a93c17871668ee18a900e8da05qhuang &gWinNtGopComponentName2 90c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ); 91c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ASSERT_EFI_ERROR (Status); 92c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 93c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 94c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu return Status; 95c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu} 96c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 97c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu/** 98c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 99c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 100c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu @return None 101c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 102c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu**/ 103c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: This - add argument and description to function comment 104c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: Handle - add argument and description to function comment 105c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: RemainingDevicePath - add argument and description to function comment 106c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluEFI_STATUS 107c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluEFIAPI 108c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluWinNtGopDriverBindingSupported ( 109c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN EFI_DRIVER_BINDING_PROTOCOL *This, 110c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN EFI_HANDLE Handle, 111c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath 112c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ) 113c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu{ 114c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu EFI_STATUS Status; 115c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu EFI_WIN_NT_IO_PROTOCOL *WinNtIo; 116c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 117c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 118c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // Open the IO Abstraction(s) needed to perform the supported test 119c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 120c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Status = gBS->OpenProtocol ( 121c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle, 122c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gEfiWinNtIoProtocolGuid, 123c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &WinNtIo, 124c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu This->DriverBindingHandle, 125c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle, 126c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu EFI_OPEN_PROTOCOL_BY_DRIVER 127c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ); 128c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu if (EFI_ERROR (Status)) { 129c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu return Status; 130c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu } 131c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 132c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Status = WinNtGopSupported (WinNtIo); 133c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 134c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 135c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // Close the I/O Abstraction(s) used to perform the supported test 136c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 137c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu gBS->CloseProtocol ( 138c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle, 139c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gEfiWinNtIoProtocolGuid, 140c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu This->DriverBindingHandle, 141c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle 142c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ); 143c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 144c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu return Status; 145c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu} 146c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 147c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 148c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu/** 149c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 150c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 151c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu @return None 152c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 153c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu**/ 154c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: This - add argument and description to function comment 155c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: Handle - add argument and description to function comment 156c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: RemainingDevicePath - add argument and description to function comment 157c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: EFI_UNSUPPORTED - add return value to function comment 158c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluEFI_STATUS 159c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluEFIAPI 160c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluWinNtGopDriverBindingStart ( 161c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN EFI_DRIVER_BINDING_PROTOCOL *This, 162c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN EFI_HANDLE Handle, 163c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath 164c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ) 165c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu{ 166c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu EFI_WIN_NT_IO_PROTOCOL *WinNtIo; 167c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu EFI_STATUS Status; 168c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu GOP_PRIVATE_DATA *Private; 169c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 170c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 171c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // Grab the protocols we need 172c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 173c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Status = gBS->OpenProtocol ( 174c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle, 175c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gEfiWinNtIoProtocolGuid, 176c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &WinNtIo, 177c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu This->DriverBindingHandle, 178c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle, 179c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu EFI_OPEN_PROTOCOL_BY_DRIVER 180c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ); 181c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu if (EFI_ERROR (Status)) { 182c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu return EFI_UNSUPPORTED; 183c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu } 184c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 185c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 186c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // Allocate Private context data for SGO inteface. 187c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 188c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Private = NULL; 189c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Private = AllocatePool (sizeof (GOP_PRIVATE_DATA)); 190c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu if (Private == NULL) { 191c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu goto Done; 192c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu } 193c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 194c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // Set up context record 195c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 196c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Private->Signature = GOP_PRIVATE_DATA_SIGNATURE; 197c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Private->Handle = Handle; 198c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Private->WinNtThunk = WinNtIo->WinNtThunk; 199c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 200c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Private->ControllerNameTable = NULL; 201c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 202e6e53c97c943d7a93c17871668ee18a900e8da05qhuang AddUnicodeString2 ( 203c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu "eng", 204c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu gWinNtGopComponentName.SupportedLanguages, 205c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &Private->ControllerNameTable, 206e6e53c97c943d7a93c17871668ee18a900e8da05qhuang WinNtIo->EnvString, 207e6e53c97c943d7a93c17871668ee18a900e8da05qhuang TRUE 208c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ); 209e6e53c97c943d7a93c17871668ee18a900e8da05qhuang AddUnicodeString2 ( 210e6e53c97c943d7a93c17871668ee18a900e8da05qhuang "en", 211e6e53c97c943d7a93c17871668ee18a900e8da05qhuang gWinNtGopComponentName2.SupportedLanguages, 212e6e53c97c943d7a93c17871668ee18a900e8da05qhuang &Private->ControllerNameTable, 213e6e53c97c943d7a93c17871668ee18a900e8da05qhuang WinNtIo->EnvString, 214e6e53c97c943d7a93c17871668ee18a900e8da05qhuang FALSE 215e6e53c97c943d7a93c17871668ee18a900e8da05qhuang ); 216e6e53c97c943d7a93c17871668ee18a900e8da05qhuang 217c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 218c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Private->WindowName = WinNtIo->EnvString; 219c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 220c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Status = WinNtGopConstructor (Private); 221c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu if (EFI_ERROR (Status)) { 222c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu goto Done; 223c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu } 224c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 225c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // Publish the Gop interface to the world 226c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 227c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Status = gBS->InstallMultipleProtocolInterfaces ( 228c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &Private->Handle, 229c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gEfiGraphicsOutputProtocolGuid, 230c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &Private->GraphicsOutput, 231c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gEfiSimpleTextInProtocolGuid, 232c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &Private->SimpleTextIn, 233c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu NULL 234c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ); 235c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 236c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluDone: 237c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu if (EFI_ERROR (Status)) { 238c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 239c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu gBS->CloseProtocol ( 240c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle, 241c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gEfiWinNtIoProtocolGuid, 242c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu This->DriverBindingHandle, 243c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle 244c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ); 245c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 246c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu if (Private != NULL) { 247c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 248c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // On Error Free back private data 249c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 250c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu if (Private->ControllerNameTable != NULL) { 251c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu FreeUnicodeStringTable (Private->ControllerNameTable); 252c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu } 253c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 254c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu FreePool (Private); 255c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu } 256c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu } 257c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 258c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu return Status; 259c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu} 260c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 261c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 262c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu/** 263c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 264c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 265c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu @return None 266c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 267c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu**/ 268c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: This - add argument and description to function comment 269c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: Handle - add argument and description to function comment 270c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: NumberOfChildren - add argument and description to function comment 271c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: ChildHandleBuffer - add argument and description to function comment 272c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: EFI_NOT_STARTED - add return value to function comment 273c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: EFI_DEVICE_ERROR - add return value to function comment 274c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluEFI_STATUS 275c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluEFIAPI 276c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluWinNtGopDriverBindingStop ( 277c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN EFI_DRIVER_BINDING_PROTOCOL *This, 278c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN EFI_HANDLE Handle, 279c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN UINTN NumberOfChildren, 280c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN EFI_HANDLE *ChildHandleBuffer 281c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ) 282c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu{ 283c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; 284c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu EFI_STATUS Status; 285c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu GOP_PRIVATE_DATA *Private; 286c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 287c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Status = gBS->OpenProtocol ( 288c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle, 289c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gEfiGraphicsOutputProtocolGuid, 290c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &GraphicsOutput, 291c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu This->DriverBindingHandle, 292c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle, 293c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu EFI_OPEN_PROTOCOL_GET_PROTOCOL 294c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ); 295c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu if (EFI_ERROR (Status)) { 296c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 297c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // If the GOP interface does not exist the driver is not started 298c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 299c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu return EFI_NOT_STARTED; 300c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu } 301c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 302c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 303c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // Get our private context information 304c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 305c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Private = GOP_PRIVATE_DATA_FROM_THIS (GraphicsOutput); 306c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 307c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 308c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // Remove the SGO interface from the system 309c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 310c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Status = gBS->UninstallMultipleProtocolInterfaces ( 311c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Private->Handle, 312c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gEfiGraphicsOutputProtocolGuid, 313c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &Private->GraphicsOutput, 314c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gEfiSimpleTextInProtocolGuid, 315c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &Private->SimpleTextIn, 316c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu NULL 317c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ); 318c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu if (!EFI_ERROR (Status)) { 319c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 320c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // Shutdown the hardware 321c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 322c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Status = WinNtGopDestructor (Private); 323c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu if (EFI_ERROR (Status)) { 324c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu return EFI_DEVICE_ERROR; 325c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu } 326c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 327c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu gBS->CloseProtocol ( 328c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle, 329c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gEfiWinNtIoProtocolGuid, 330c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu This->DriverBindingHandle, 331c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle 332c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ); 333c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 334c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 335c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // Free our instance data 336c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 337c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu FreeUnicodeStringTable (Private->ControllerNameTable); 338c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 339c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu FreePool (Private); 340c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 341c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu } 342c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 343c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu return Status; 344c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu} 345c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 346