WinNtGopDriver.c revision 6394182967f63d4a97a1c882861d9958657112bb
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**/
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