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