1c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu/** @file 2c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 38f2a5f8012e3a6de30f5b12ce3a218efae9eaeddhhtianCopyright (c) 2006 - 2007, Intel Corporation. All rights reserved.<BR> 48f2a5f8012e3a6de30f5b12ce3a218efae9eaeddhhtianThis 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**/ 2462cf113f2e3741e498d22df1cf5d347fab654e57qhuang#include "WinNtGop.h" 25c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 2662cf113f2e3741e498d22df1cf5d347fab654e57qhuangEFI_STATUS 2762cf113f2e3741e498d22df1cf5d347fab654e57qhuangFreeNotifyList ( 2862cf113f2e3741e498d22df1cf5d347fab654e57qhuang IN OUT LIST_ENTRY *ListHead 2962cf113f2e3741e498d22df1cf5d347fab654e57qhuang ) 3062cf113f2e3741e498d22df1cf5d347fab654e57qhuang/*++ 31c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 3262cf113f2e3741e498d22df1cf5d347fab654e57qhuangRoutine Description: 3362cf113f2e3741e498d22df1cf5d347fab654e57qhuang 3462cf113f2e3741e498d22df1cf5d347fab654e57qhuangArguments: 3562cf113f2e3741e498d22df1cf5d347fab654e57qhuang 3662cf113f2e3741e498d22df1cf5d347fab654e57qhuang ListHead - The list head 3762cf113f2e3741e498d22df1cf5d347fab654e57qhuang 3862cf113f2e3741e498d22df1cf5d347fab654e57qhuangReturns: 3962cf113f2e3741e498d22df1cf5d347fab654e57qhuang 4062cf113f2e3741e498d22df1cf5d347fab654e57qhuang EFI_SUCCESS - Free the notify list successfully 4162cf113f2e3741e498d22df1cf5d347fab654e57qhuang EFI_INVALID_PARAMETER - ListHead is invalid. 4262cf113f2e3741e498d22df1cf5d347fab654e57qhuang 4362cf113f2e3741e498d22df1cf5d347fab654e57qhuang--*/ 4462cf113f2e3741e498d22df1cf5d347fab654e57qhuang{ 4562cf113f2e3741e498d22df1cf5d347fab654e57qhuang WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY *NotifyNode; 4662cf113f2e3741e498d22df1cf5d347fab654e57qhuang 4762cf113f2e3741e498d22df1cf5d347fab654e57qhuang if (ListHead == NULL) { 4862cf113f2e3741e498d22df1cf5d347fab654e57qhuang return EFI_INVALID_PARAMETER; 4962cf113f2e3741e498d22df1cf5d347fab654e57qhuang } 5062cf113f2e3741e498d22df1cf5d347fab654e57qhuang while (!IsListEmpty (ListHead)) { 5162cf113f2e3741e498d22df1cf5d347fab654e57qhuang NotifyNode = CR ( 5262cf113f2e3741e498d22df1cf5d347fab654e57qhuang ListHead->ForwardLink, 5362cf113f2e3741e498d22df1cf5d347fab654e57qhuang WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY, 5462cf113f2e3741e498d22df1cf5d347fab654e57qhuang NotifyEntry, 5562cf113f2e3741e498d22df1cf5d347fab654e57qhuang WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE 5662cf113f2e3741e498d22df1cf5d347fab654e57qhuang ); 5762cf113f2e3741e498d22df1cf5d347fab654e57qhuang RemoveEntryList (ListHead->ForwardLink); 5862cf113f2e3741e498d22df1cf5d347fab654e57qhuang gBS->FreePool (NotifyNode); 5962cf113f2e3741e498d22df1cf5d347fab654e57qhuang } 6062cf113f2e3741e498d22df1cf5d347fab654e57qhuang 6162cf113f2e3741e498d22df1cf5d347fab654e57qhuang return EFI_SUCCESS; 6262cf113f2e3741e498d22df1cf5d347fab654e57qhuang} 63c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 64c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluEFI_DRIVER_BINDING_PROTOCOL gWinNtGopDriverBinding = { 65c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu WinNtGopDriverBindingSupported, 66c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu WinNtGopDriverBindingStart, 67c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu WinNtGopDriverBindingStop, 68c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 0xa, 69c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu NULL, 70c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu NULL 71c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu}; 72c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 73c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu/** 74c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu The user Entry Point for module WinNtGop. The user code starts with this function. 75c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 76c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu @param[in] ImageHandle The firmware allocated handle for the EFI image. 77c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu @param[in] SystemTable A pointer to the EFI System Table. 78c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 79c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu @retval EFI_SUCCESS The entry point is executed successfully. 80c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu @retval other Some error occurs when executing this entry point. 81c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 82c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu**/ 83c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluEFI_STATUS 84c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluEFIAPI 85c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluInitializeWinNtGop( 86c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN EFI_HANDLE ImageHandle, 87c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN EFI_SYSTEM_TABLE *SystemTable 88c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ) 89c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu{ 90c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu EFI_STATUS Status; 91c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 92c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 93c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // Install driver model protocol(s). 94c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 95e6e53c97c943d7a93c17871668ee18a900e8da05qhuang Status = EfiLibInstallDriverBindingComponentName2 ( 96c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ImageHandle, 97c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu SystemTable, 98c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gWinNtGopDriverBinding, 99c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ImageHandle, 100c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gWinNtGopComponentName, 101e6e53c97c943d7a93c17871668ee18a900e8da05qhuang &gWinNtGopComponentName2 102c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ); 103c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ASSERT_EFI_ERROR (Status); 104c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 105c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 106c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu return Status; 107c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu} 108c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 109c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu/** 110c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 111c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 112c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu @return None 113c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 114c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu**/ 115c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: This - add argument and description to function comment 116c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: Handle - add argument and description to function comment 117c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: RemainingDevicePath - add argument and description to function comment 118c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluEFI_STATUS 119c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluEFIAPI 120c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluWinNtGopDriverBindingSupported ( 121c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN EFI_DRIVER_BINDING_PROTOCOL *This, 122c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN EFI_HANDLE Handle, 123c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath 124c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ) 125c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu{ 126c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu EFI_STATUS Status; 127c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu EFI_WIN_NT_IO_PROTOCOL *WinNtIo; 128c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 129c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 130c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // Open the IO Abstraction(s) needed to perform the supported test 131c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 132c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Status = gBS->OpenProtocol ( 133c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle, 134c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gEfiWinNtIoProtocolGuid, 1356394182967f63d4a97a1c882861d9958657112bbqwang (VOID **) &WinNtIo, 136c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu This->DriverBindingHandle, 137c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle, 138c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu EFI_OPEN_PROTOCOL_BY_DRIVER 139c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ); 140c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu if (EFI_ERROR (Status)) { 141c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu return Status; 142c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu } 143c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 144c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Status = WinNtGopSupported (WinNtIo); 145c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 146c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 147c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // Close the I/O Abstraction(s) used to perform the supported test 148c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 149c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu gBS->CloseProtocol ( 150c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle, 151c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gEfiWinNtIoProtocolGuid, 152c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu This->DriverBindingHandle, 153c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle 154c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ); 155c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 156c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu return Status; 157c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu} 158c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 159c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 160c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu/** 161c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 162c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 163c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu @return None 164c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 165c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu**/ 166c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: This - add argument and description to function comment 167c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: Handle - add argument and description to function comment 168c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: RemainingDevicePath - add argument and description to function comment 169c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: EFI_UNSUPPORTED - add return value to function comment 170c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluEFI_STATUS 171c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluEFIAPI 172c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluWinNtGopDriverBindingStart ( 173c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN EFI_DRIVER_BINDING_PROTOCOL *This, 174c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN EFI_HANDLE Handle, 175c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath 176c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ) 177c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu{ 178c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu EFI_WIN_NT_IO_PROTOCOL *WinNtIo; 179c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu EFI_STATUS Status; 180c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu GOP_PRIVATE_DATA *Private; 181c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 182c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 183c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // Grab the protocols we need 184c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 185c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Status = gBS->OpenProtocol ( 186c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle, 187c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gEfiWinNtIoProtocolGuid, 1886394182967f63d4a97a1c882861d9958657112bbqwang (VOID **) &WinNtIo, 189c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu This->DriverBindingHandle, 190c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle, 191c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu EFI_OPEN_PROTOCOL_BY_DRIVER 192c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ); 193c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu if (EFI_ERROR (Status)) { 194c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu return EFI_UNSUPPORTED; 195c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu } 196c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 197c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 198c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // Allocate Private context data for SGO inteface. 199c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 200c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Private = NULL; 201c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Private = AllocatePool (sizeof (GOP_PRIVATE_DATA)); 202c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu if (Private == NULL) { 20362cf113f2e3741e498d22df1cf5d347fab654e57qhuang Status = EFI_OUT_OF_RESOURCES; 204c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu goto Done; 205c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu } 206c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 207c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // Set up context record 208c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 209c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Private->Signature = GOP_PRIVATE_DATA_SIGNATURE; 210c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Private->Handle = Handle; 211c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Private->WinNtThunk = WinNtIo->WinNtThunk; 212c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 213c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Private->ControllerNameTable = NULL; 214c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 215e6e53c97c943d7a93c17871668ee18a900e8da05qhuang AddUnicodeString2 ( 216c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu "eng", 217c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu gWinNtGopComponentName.SupportedLanguages, 218c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &Private->ControllerNameTable, 219e6e53c97c943d7a93c17871668ee18a900e8da05qhuang WinNtIo->EnvString, 220e6e53c97c943d7a93c17871668ee18a900e8da05qhuang TRUE 221c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ); 222e6e53c97c943d7a93c17871668ee18a900e8da05qhuang AddUnicodeString2 ( 223e6e53c97c943d7a93c17871668ee18a900e8da05qhuang "en", 224e6e53c97c943d7a93c17871668ee18a900e8da05qhuang gWinNtGopComponentName2.SupportedLanguages, 225e6e53c97c943d7a93c17871668ee18a900e8da05qhuang &Private->ControllerNameTable, 226e6e53c97c943d7a93c17871668ee18a900e8da05qhuang WinNtIo->EnvString, 227e6e53c97c943d7a93c17871668ee18a900e8da05qhuang FALSE 228e6e53c97c943d7a93c17871668ee18a900e8da05qhuang ); 229e6e53c97c943d7a93c17871668ee18a900e8da05qhuang 230c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 231c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Private->WindowName = WinNtIo->EnvString; 232c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 233c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Status = WinNtGopConstructor (Private); 234c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu if (EFI_ERROR (Status)) { 235c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu goto Done; 236c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu } 237c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 238c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // Publish the Gop interface to the world 239c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 240c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Status = gBS->InstallMultipleProtocolInterfaces ( 241c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &Private->Handle, 242c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gEfiGraphicsOutputProtocolGuid, 243c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &Private->GraphicsOutput, 244c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gEfiSimpleTextInProtocolGuid, 245c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &Private->SimpleTextIn, 24662cf113f2e3741e498d22df1cf5d347fab654e57qhuang &gEfiSimpleTextInputExProtocolGuid, 24762cf113f2e3741e498d22df1cf5d347fab654e57qhuang &Private->SimpleTextInEx, 248c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu NULL 249c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ); 250c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 251c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluDone: 252c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu if (EFI_ERROR (Status)) { 253c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 254c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu gBS->CloseProtocol ( 255c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle, 256c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gEfiWinNtIoProtocolGuid, 257c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu This->DriverBindingHandle, 258c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle 259c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ); 260c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 261c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu if (Private != NULL) { 262c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 263c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // On Error Free back private data 264c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 265c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu if (Private->ControllerNameTable != NULL) { 266c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu FreeUnicodeStringTable (Private->ControllerNameTable); 267c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu } 268c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 26962cf113f2e3741e498d22df1cf5d347fab654e57qhuang if (Private->SimpleTextIn.WaitForKey != NULL) { 27062cf113f2e3741e498d22df1cf5d347fab654e57qhuang gBS->CloseEvent (Private->SimpleTextIn.WaitForKey); 27162cf113f2e3741e498d22df1cf5d347fab654e57qhuang } 27262cf113f2e3741e498d22df1cf5d347fab654e57qhuang if (Private->SimpleTextInEx.WaitForKeyEx != NULL) { 27362cf113f2e3741e498d22df1cf5d347fab654e57qhuang gBS->CloseEvent (Private->SimpleTextInEx.WaitForKeyEx); 27462cf113f2e3741e498d22df1cf5d347fab654e57qhuang } 27562cf113f2e3741e498d22df1cf5d347fab654e57qhuang FreeNotifyList (&Private->NotifyList); 276c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu FreePool (Private); 277c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu } 278c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu } 279c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 280c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu return Status; 281c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu} 282c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 283c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 284c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu/** 285c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 286c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 287c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu @return None 288c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 289c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu**/ 290c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: This - add argument and description to function comment 291c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: Handle - add argument and description to function comment 292c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: NumberOfChildren - add argument and description to function comment 293c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: ChildHandleBuffer - add argument and description to function comment 294c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: EFI_NOT_STARTED - add return value to function comment 295c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu// TODO: EFI_DEVICE_ERROR - add return value to function comment 296c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluEFI_STATUS 297c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluEFIAPI 298c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7ckluWinNtGopDriverBindingStop ( 299c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN EFI_DRIVER_BINDING_PROTOCOL *This, 300c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN EFI_HANDLE Handle, 301c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN UINTN NumberOfChildren, 302c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu IN EFI_HANDLE *ChildHandleBuffer 303c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ) 304c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu{ 305c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; 306c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu EFI_STATUS Status; 307c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu GOP_PRIVATE_DATA *Private; 308c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 309c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Status = gBS->OpenProtocol ( 310c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle, 311c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gEfiGraphicsOutputProtocolGuid, 3126394182967f63d4a97a1c882861d9958657112bbqwang (VOID **) &GraphicsOutput, 313c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu This->DriverBindingHandle, 314c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle, 315c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu EFI_OPEN_PROTOCOL_GET_PROTOCOL 316c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ); 317c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu if (EFI_ERROR (Status)) { 318c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 319c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // If the GOP interface does not exist the driver is not started 320c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 321c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu return EFI_NOT_STARTED; 322c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu } 323c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 324c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 325c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // Get our private context information 326c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 327c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Private = GOP_PRIVATE_DATA_FROM_THIS (GraphicsOutput); 328c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 329c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 330c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // Remove the SGO interface from the system 331c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 332c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Status = gBS->UninstallMultipleProtocolInterfaces ( 333c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Private->Handle, 334c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gEfiGraphicsOutputProtocolGuid, 335c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &Private->GraphicsOutput, 336c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gEfiSimpleTextInProtocolGuid, 337c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &Private->SimpleTextIn, 33862cf113f2e3741e498d22df1cf5d347fab654e57qhuang &gEfiSimpleTextInputExProtocolGuid, 33962cf113f2e3741e498d22df1cf5d347fab654e57qhuang &Private->SimpleTextInEx, 340c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu NULL 341c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ); 342c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu if (!EFI_ERROR (Status)) { 343c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 344c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // Shutdown the hardware 345c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 346c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Status = WinNtGopDestructor (Private); 347c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu if (EFI_ERROR (Status)) { 348c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu return EFI_DEVICE_ERROR; 349c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu } 350c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 351c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu gBS->CloseProtocol ( 352c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle, 353c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu &gEfiWinNtIoProtocolGuid, 354c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu This->DriverBindingHandle, 355c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu Handle 356c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu ); 357c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 358c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 359c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // Free our instance data 360c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu // 361c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu FreeUnicodeStringTable (Private->ControllerNameTable); 36262cf113f2e3741e498d22df1cf5d347fab654e57qhuang Status = gBS->CloseEvent (Private->SimpleTextIn.WaitForKey); 36362cf113f2e3741e498d22df1cf5d347fab654e57qhuang ASSERT_EFI_ERROR (Status); 36462cf113f2e3741e498d22df1cf5d347fab654e57qhuang Status = gBS->CloseEvent (Private->SimpleTextInEx.WaitForKeyEx); 36562cf113f2e3741e498d22df1cf5d347fab654e57qhuang ASSERT_EFI_ERROR (Status); 36662cf113f2e3741e498d22df1cf5d347fab654e57qhuang FreeNotifyList (&Private->NotifyList); 367c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 36862cf113f2e3741e498d22df1cf5d347fab654e57qhuang gBS->FreePool (Private); 369c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 370c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu } 371c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 372c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu return Status; 373c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu} 374c9fc89a313e0955d3eb8baf3bbfd8bb7d450ad7cklu 375