1 /** @file
2 
3 Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
4 This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution.  The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
8 
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
11 
12 Module Name:
13 
14   WinNtGop.h
15 
16 Abstract:
17 
18   Private data for the Gop driver that is bound to the WinNt Thunk protocol
19 
20 
21 **/
22 
23 #ifndef _WIN_NT_GOP_H_
24 #define _WIN_NT_GOP_H_
25 
26 
27 #include <Uefi.h>
28 #include <WinNtDxe.h>
29 
30 #include <Guid/EventGroup.h>
31 #include <Protocol/WinNtIo.h>
32 #include <Protocol/ComponentName.h>
33 #include <Protocol/SimpleTextIn.h>
34 #include <Protocol/SimpleTextInEx.h>
35 #include <Protocol/DriverBinding.h>
36 #include <Protocol/GraphicsOutput.h>
37 
38 #include <Library/DebugLib.h>
39 #include <Library/BaseLib.h>
40 #include <Library/UefiDriverEntryPoint.h>
41 #include <Library/UefiLib.h>
42 #include <Library/BaseMemoryLib.h>
43 #include <Library/UefiBootServicesTableLib.h>
44 #include <Library/MemoryAllocationLib.h>
45 
46 //
47 // WM_SYSKEYDOWN/WM_SYSKEYUP Notification
48 // lParam
49 // bit 24: Specifies whether the key is an extended key,
50 // such as the right-hand ALT and CTRL keys that appear on
51 // an enhanced 101- or 102-key keyboard.
52 // The value is 1 if it is an extended key; otherwise, it is 0.
53 // bit 29:Specifies the context code.
54 // The value is 1 if the ALT key is down while the key is pressed/released;
55 // it is 0 if the WM_SYSKEYDOWN message is posted to the active window
56 // because no window has the keyboard focus.
57 #define GOP_EXTENDED_KEY         (0x1 << 24)
58 #define GOP_ALT_KEY_PRESSED      (0x1 << 29)
59 
60 #define KEYBOARD_TIMER_INTERVAL         200000  // 0.02s
61 
62 #define MAX_Q 256
63 
64 typedef struct {
65   UINTN             Front;
66   UINTN             Rear;
67   EFI_KEY_DATA      Q[MAX_Q];
68   CRITICAL_SECTION  Cs;
69 } GOP_QUEUE_FIXED;
70 
71 #define WIN_NT_GOP_CLASS_NAME       L"WinNtGopWindow"
72 
73 #define GOP_PRIVATE_DATA_SIGNATURE  SIGNATURE_32 ('S', 'g', 'o', 'N')
74 
75 #define WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY_SIGNATURE SIGNATURE_32 ('W', 'g', 'S', 'n')
76 
77 typedef struct _WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY {
78   UINTN                                 Signature;
79   EFI_KEY_DATA                          KeyData;
80   EFI_KEY_NOTIFY_FUNCTION               KeyNotificationFn;
81   LIST_ENTRY                            NotifyEntry;
82 } WIN_NT_GOP_SIMPLE_TEXTIN_EX_NOTIFY;
83 
84 #define GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER 0xffff
85 
86 typedef struct {
87   UINT32                     HorizontalResolution;
88   UINT32                     VerticalResolution;
89   UINT32                     ColorDepth;
90   UINT32                     RefreshRate;
91 } GOP_MODE_DATA;
92 
93 typedef struct {
94   UINT64                        Signature;
95 
96   EFI_HANDLE                    Handle;
97   EFI_GRAPHICS_OUTPUT_PROTOCOL  GraphicsOutput;
98   EFI_SIMPLE_TEXT_INPUT_PROTOCOL   SimpleTextIn;
99 
100   EFI_WIN_NT_THUNK_PROTOCOL     *WinNtThunk;
101 
102   EFI_UNICODE_STRING_TABLE      *ControllerNameTable;
103 
104   //
105   // GOP Private Data for QueryMode ()
106   //
107   GOP_MODE_DATA                 *ModeData;
108 
109   //
110   // GOP Private Data knowing when to start hardware
111   //
112   BOOLEAN                       HardwareNeedsStarting;
113 
114   CHAR16                        *WindowName;
115   CHAR16                        Buffer[160];
116 
117   HANDLE                        ThreadInited; // Semaphore
118   HANDLE                        ThreadHandle; // Thread
119   DWORD                         ThreadId;
120 
121   HWND                          WindowHandle;
122   WNDCLASSEX                    WindowsClass;
123 
124   //
125   // This screen is used to redraw the scree when windows events happen. It's
126   // updated in the main thread and displayed in the windows thread.
127   //
128   BITMAPV4HEADER                *VirtualScreenInfo;
129   RGBQUAD                       *VirtualScreen;
130 
131   EFI_GRAPHICS_OUTPUT_BLT_PIXEL *FillLine;
132 
133   //
134   // Keyboard Queue used by Simple Text In.
135   // QueueForRead:   WinProc thread adds, and main thread removes.
136   // QueueForNotify: WinProc thread adds, and timer thread removes.
137   //
138   GOP_QUEUE_FIXED               QueueForRead;
139   GOP_QUEUE_FIXED               QueueForNotify;
140 
141   EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL SimpleTextInEx;
142   EFI_KEY_STATE                     KeyState;
143   LIST_ENTRY                        NotifyList;
144   BOOLEAN                           LeftShift;
145   BOOLEAN                           RightShift;
146   BOOLEAN                           LeftAlt;
147   BOOLEAN                           RightAlt;
148   BOOLEAN                           LeftCtrl;
149   BOOLEAN                           RightCtrl;
150   BOOLEAN                           LeftLogo;
151   BOOLEAN                           RightLogo;
152   BOOLEAN                           Menu;
153   BOOLEAN                           SysReq;
154   BOOLEAN                           NumLock;
155   BOOLEAN                           ScrollLock;
156   BOOLEAN                           CapsLock;
157   BOOLEAN                           IsPartialKeySupport;
158   EFI_EVENT                         TimerEvent;
159 } GOP_PRIVATE_DATA;
160 
161 #define GOP_PRIVATE_DATA_FROM_THIS(a)  \
162          CR(a, GOP_PRIVATE_DATA, GraphicsOutput, GOP_PRIVATE_DATA_SIGNATURE)
163 
164 #define GOP_PRIVATE_DATA_FROM_TEXT_IN_THIS(a)  \
165          CR(a, GOP_PRIVATE_DATA, SimpleTextIn, GOP_PRIVATE_DATA_SIGNATURE)
166 
167 #define GOP_PRIVATE_DATA_FROM_TEXT_IN_EX_THIS(a)  \
168          CR(a, GOP_PRIVATE_DATA, SimpleTextInEx, GOP_PRIVATE_DATA_SIGNATURE)
169 
170 //
171 // Global Protocol Variables
172 //
173 extern EFI_DRIVER_BINDING_PROTOCOL   gWinNtGopDriverBinding;
174 extern EFI_COMPONENT_NAME_PROTOCOL   gWinNtGopComponentName;
175 extern EFI_COMPONENT_NAME2_PROTOCOL  gWinNtGopComponentName2;
176 
177 
178 //
179 // Gop Hardware abstraction internal worker functions
180 //
181 
182 /**
183   TODO: Add function description
184 
185   @param  WinNtIo              TODO: add argument description
186 
187   @return TODO: add return values
188 
189 **/
190 EFI_STATUS
191 WinNtGopSupported (
192   IN  EFI_WIN_NT_IO_PROTOCOL  *WinNtIo
193   );
194 
195 
196 /**
197   TODO: Add function description
198 
199   @param  Private              TODO: add argument description
200 
201   @return TODO: add return values
202 
203 **/
204 EFI_STATUS
205 WinNtGopConstructor (
206   IN  GOP_PRIVATE_DATA    *Private
207   );
208 
209 
210 /**
211   TODO: Add function description
212 
213   @param  Private              TODO: add argument description
214 
215   @return TODO: add return values
216 
217 **/
218 EFI_STATUS
219 WinNtGopDestructor (
220   IN  GOP_PRIVATE_DATA    *Private
221   );
222 
223 //
224 // UEFI 2.0 driver model prototypes for Win NT GOP
225 //
226 
227 
228 /**
229   TODO: Add function description
230 
231   @param  ImageHandle          TODO: add argument description
232   @param  SystemTable          TODO: add argument description
233 
234   @return TODO: add return values
235 
236 **/
237 EFI_STATUS
238 EFIAPI
239 WinNtGopInitialize (
240   IN EFI_HANDLE            ImageHandle,
241   IN EFI_SYSTEM_TABLE      *SystemTable
242   );
243 
244 
245 /**
246   TODO: Add function description
247 
248   @param  This                 TODO: add argument description
249   @param  Handle               TODO: add argument description
250   @param  RemainingDevicePath  TODO: add argument description
251 
252   @return TODO: add return values
253 
254 **/
255 EFI_STATUS
256 EFIAPI
257 WinNtGopDriverBindingSupported (
258   IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
259   IN  EFI_HANDLE                      Handle,
260   IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
261   );
262 
263 
264 /**
265   TODO: Add function description
266 
267   @param  This                 TODO: add argument description
268   @param  Handle               TODO: add argument description
269   @param  RemainingDevicePath  TODO: add argument description
270 
271   @return TODO: add return values
272 
273 **/
274 EFI_STATUS
275 EFIAPI
276 WinNtGopDriverBindingStart (
277   IN  EFI_DRIVER_BINDING_PROTOCOL     *This,
278   IN  EFI_HANDLE                      Handle,
279   IN  EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath
280   );
281 
282 
283 /**
284   TODO: Add function description
285 
286   @param  This                 TODO: add argument description
287   @param  Handle               TODO: add argument description
288   @param  NumberOfChildren     TODO: add argument description
289   @param  ChildHandleBuffer    TODO: add argument description
290 
291   @return TODO: add return values
292 
293 **/
294 EFI_STATUS
295 EFIAPI
296 WinNtGopDriverBindingStop (
297   IN  EFI_DRIVER_BINDING_PROTOCOL  *This,
298   IN  EFI_HANDLE                   Handle,
299   IN  UINTN                        NumberOfChildren,
300   IN  EFI_HANDLE                   *ChildHandleBuffer
301   );
302 
303 
304 /**
305   TODO: Add function description
306 
307   @param  Private              TODO: add argument description
308   @param  Key                  TODO: add argument description
309 
310   @return TODO: add return values
311 
312 **/
313 EFI_STATUS
314 GopPrivateAddKey (
315   IN  GOP_PRIVATE_DATA    *Private,
316   IN  EFI_INPUT_KEY       Key
317   );
318 
319 
320 /**
321   TODO: Add function description
322 
323   @param  Private              TODO: add argument description
324 
325   @return TODO: add return values
326 
327 **/
328 EFI_STATUS
329 WinNtGopInitializeSimpleTextInForWindow (
330   IN  GOP_PRIVATE_DATA    *Private
331   );
332 
333 
334 /**
335   TODO: Add function description
336 
337   @param  Private              TODO: add argument description
338 
339   @return TODO: add return values
340 
341 **/
342 EFI_STATUS
343 WinNtGopDestroySimpleTextInForWindow (
344   IN  GOP_PRIVATE_DATA    *Private
345   );
346 
347 
348 
349 #endif
350