1 /**@file
2 
3 Copyright (c) 2006, 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 
13 Module Name:
14   SecMain.h
15 
16 Abstract:
17   Include file for Windows API based SEC
18 
19 **/
20 
21 #include <stdio.h>
22 #include <PiPei.h>
23 #include <WinNtPeim.h>
24 #include <Guid/StatusCodeDataTypeDebug.h>
25 #include <Library/BaseLib.h>
26 #include <Library/PeCoffLib.h>
27 #include <Ppi/NtPeiLoadFile.h>
28 #include <Ppi/NtAutoscan.h>
29 #include <Ppi/NtThunk.h>
30 #include <Ppi/StatusCode.h>
31 #include <Ppi/NtFwh.h>
32 #include <Ppi/TemporaryRamSupport.h>
33 #include <Library/PcdLib.h>
34 #include <Library/DebugLib.h>
35 #include <Library/PrintLib.h>
36 #include <Library/BaseMemoryLib.h>
37 #include <Library/ReportStatusCodeLib.h>
38 
39 #include <IndustryStandard/PeImage.h>
40 
41 #define STACK_SIZE                0x20000
42 
43 typedef struct {
44   EFI_PHYSICAL_ADDRESS  Address;
45   UINT64                Size;
46 } NT_FD_INFO;
47 
48 typedef struct {
49   EFI_PHYSICAL_ADDRESS  Memory;
50   UINT64                Size;
51 } NT_SYSTEM_MEMORY;
52 
53 #define MAX_PDB_NAME_TO_MOD_HANDLE_ARRAY_SIZE 0x100
54 
55 typedef struct {
56   CHAR8   *PdbPointer;
57   VOID    *ModHandle;
58 } PDB_NAME_TO_MOD_HANDLE;
59 
60 
61 
62 
63 EFI_STATUS
64 EFIAPI
65 SecWinNtPeiLoadFile (
66   VOID                  *Pe32Data,  // TODO: add IN/OUT modifier to Pe32Data
67   EFI_PHYSICAL_ADDRESS  *ImageAddress,  // TODO: add IN/OUT modifier to ImageAddress
68   UINT64                *ImageSize,  // TODO: add IN/OUT modifier to ImageSize
69   EFI_PHYSICAL_ADDRESS  *EntryPoint  // TODO: add IN/OUT modifier to EntryPoint
70   )
71 /*++
72 
73 Routine Description:
74 
75   TODO: Add function description
76 
77 Arguments:
78 
79   Pe32Data      - TODO: add argument description
80   ImageAddress  - TODO: add argument description
81   ImageSize     - TODO: add argument description
82   EntryPoint    - TODO: add argument description
83 
84 Returns:
85 
86   TODO: add return values
87 
88 --*/
89 ;
90 
91 EFI_STATUS
92 EFIAPI
93 SecWinNtPeiAutoScan (
94   IN  UINTN                 Index,
95   OUT EFI_PHYSICAL_ADDRESS  *MemoryBase,
96   OUT UINT64                *MemorySize
97   )
98 /*++
99 
100 Routine Description:
101 
102   TODO: Add function description
103 
104 Arguments:
105 
106   Index       - TODO: add argument description
107   MemoryBase  - TODO: add argument description
108   MemorySize  - TODO: add argument description
109 
110 Returns:
111 
112   TODO: add return values
113 
114 --*/
115 ;
116 
117 VOID *
118 EFIAPI
119 SecWinNtWinNtThunkAddress (
120   VOID
121   )
122 /*++
123 
124 Routine Description:
125 
126   TODO: Add function description
127 
128 Arguments:
129 
130   InterfaceSize - TODO: add argument description
131   InterfaceBase - TODO: add argument description
132 
133 Returns:
134 
135   TODO: add return values
136 
137 --*/
138 ;
139 
140 EFI_STATUS
141 EFIAPI
142 SecWinNtWinNtFwhAddress (
143   IN OUT UINT64                *FwhSize,
144   IN OUT EFI_PHYSICAL_ADDRESS  *FwhBase
145   )
146 /*++
147 
148 Routine Description:
149 
150   TODO: Add function description
151 
152 Arguments:
153 
154   FwhSize - TODO: add argument description
155   FwhBase - TODO: add argument description
156 
157 Returns:
158 
159   TODO: add return values
160 
161 --*/
162 ;
163 
164 EFI_STATUS
165 EFIAPI
166 SecPeiReportStatusCode (
167   IN CONST EFI_PEI_SERVICES         **PeiServices,
168   IN EFI_STATUS_CODE_TYPE     CodeType,
169   IN EFI_STATUS_CODE_VALUE    Value,
170   IN UINT32                   Instance,
171   IN CONST EFI_GUID                 * CallerId,
172   IN CONST EFI_STATUS_CODE_DATA     * Data OPTIONAL
173   )
174 /*++
175 
176 Routine Description:
177 
178   TODO: Add function description
179 
180 Arguments:
181 
182   PeiServices - TODO: add argument description
183   CodeType    - TODO: add argument description
184   Value       - TODO: add argument description
185   Instance    - TODO: add argument description
186   CallerId    - TODO: add argument description
187   Data        - TODO: add argument description
188 
189 Returns:
190 
191   TODO: add return values
192 
193 --*/
194 ;
195 
196 INTN
197 EFIAPI
198 main (
199   IN  INTN  Argc,
200   IN  CHAR8 **Argv,
201   IN  CHAR8 **Envp
202   )
203 /*++
204 
205 Routine Description:
206 
207   TODO: Add function description
208 
209 Arguments:
210 
211   Argc  - TODO: add argument description
212   Argv  - TODO: add argument description
213   Envp  - TODO: add argument description
214 
215 Returns:
216 
217   TODO: add return values
218 
219 --*/
220 ;
221 
222 EFI_STATUS
223 WinNtOpenFile (
224   CHAR16                *FileName,
225   UINT32                MapSize,
226   DWORD                 CreationDispostion,
227   EFI_PHYSICAL_ADDRESS  *BaseAddress,
228   UINT64                *Length
229   )
230 /*++
231 
232 Routine Description:
233 
234   TODO: Add function description
235 
236 Arguments:
237 
238   FileName            - TODO: add argument description
239   MapSize             - TODO: add argument description
240   CreationDispostion  - TODO: add argument description
241   BaseAddress         - TODO: add argument description
242   Length              - TODO: add argument description
243 
244 Returns:
245 
246   TODO: add return values
247 
248 --*/
249 ;
250 
251 VOID
252 SecLoadFromCore (
253   IN  UINTN   LargestRegion,
254   IN  UINTN   LargestRegionSize,
255   IN  UINTN   BootFirmwareVolumeBase,
256   IN  VOID    *PeiCoreFile
257   )
258 /*++
259 
260 Routine Description:
261 
262   TODO: Add function description
263 
264 Arguments:
265 
266   LargestRegion           - TODO: add argument description
267   LargestRegionSize       - TODO: add argument description
268   BootFirmwareVolumeBase  - TODO: add argument description
269   PeiCoreFile             - TODO: add argument description
270 
271 Returns:
272 
273   TODO: add return values
274 
275 --*/
276 ;
277 
278 EFI_STATUS
279 SecLoadFile (
280   IN  VOID                    *Pe32Data,
281   IN  EFI_PHYSICAL_ADDRESS    *ImageAddress,
282   IN  UINT64                  *ImageSize,
283   IN  EFI_PHYSICAL_ADDRESS    *EntryPoint
284   )
285 /*++
286 
287 Routine Description:
288 
289   TODO: Add function description
290 
291 Arguments:
292 
293   Pe32Data      - TODO: add argument description
294   ImageAddress  - TODO: add argument description
295   ImageSize     - TODO: add argument description
296   EntryPoint    - TODO: add argument description
297 
298 Returns:
299 
300   TODO: add return values
301 
302 --*/
303 ;
304 
305 EFI_STATUS
306 SecFfsFindPeiCore (
307   IN  EFI_FIRMWARE_VOLUME_HEADER  *FwVolHeader,
308   OUT VOID                        **Pe32Data
309   )
310 /*++
311 
312 Routine Description:
313 
314   TODO: Add function description
315 
316 Arguments:
317 
318   FwVolHeader - TODO: add argument description
319   Pe32Data    - TODO: add argument description
320 
321 Returns:
322 
323   TODO: add return values
324 
325 --*/
326 ;
327 
328 EFI_STATUS
329 SecFfsFindNextFile (
330   IN EFI_FV_FILETYPE             SearchType,
331   IN EFI_FIRMWARE_VOLUME_HEADER  *FwVolHeader,
332   IN OUT EFI_FFS_FILE_HEADER     **FileHeader
333   )
334 /*++
335 
336 Routine Description:
337 
338   TODO: Add function description
339 
340 Arguments:
341 
342   SearchType  - TODO: add argument description
343   FwVolHeader - TODO: add argument description
344   FileHeader  - TODO: add argument description
345 
346 Returns:
347 
348   TODO: add return values
349 
350 --*/
351 ;
352 
353 EFI_STATUS
354 SecFfsFindSectionData (
355   IN EFI_SECTION_TYPE      SectionType,
356   IN EFI_FFS_FILE_HEADER   *FfsFileHeader,
357   IN OUT VOID              **SectionData
358   )
359 /*++
360 
361 Routine Description:
362 
363   TODO: Add function description
364 
365 Arguments:
366 
367   SectionType   - TODO: add argument description
368   FfsFileHeader - TODO: add argument description
369   SectionData   - TODO: add argument description
370 
371 Returns:
372 
373   TODO: add return values
374 
375 --*/
376 ;
377 
378 EFI_STATUS
379 EFIAPI
380 SecWinNtPeCoffLoaderLoadAsDll (
381   IN CHAR8    *PdbFileName,
382   IN VOID     **ImageEntryPoint,
383   OUT VOID    **ModHandle
384   )
385 /*++
386 
387 Routine Description:
388 
389   TODO: Add function description
390 
391 Arguments:
392 
393   PdbFileName     - TODO: add argument description
394   ImageEntryPoint - TODO: add argument description
395   ModHandle       - TODO: add argument description
396 
397 Returns:
398 
399   TODO: add return values
400 
401 --*/
402 ;
403 
404 EFI_STATUS
405 EFIAPI
406 SecWinNtPeCoffLoaderFreeLibrary (
407   OUT VOID    *ModHandle
408   )
409 /*++
410 
411 Routine Description:
412 
413   TODO: Add function description
414 
415 Arguments:
416 
417   ModHandle - TODO: add argument description
418 
419 Returns:
420 
421   TODO: add return values
422 
423 --*/
424 ;
425 
426 EFI_STATUS
427 EFIAPI
428 SecWinNtFdAddress (
429   IN     UINTN                 Index,
430   IN OUT EFI_PHYSICAL_ADDRESS  *FdBase,
431   IN OUT UINT64                *FdSize
432   )
433 /*++
434 
435 Routine Description:
436 
437   TODO: Add function description
438 
439 Arguments:
440 
441   Index   - TODO: add argument description
442   FdBase  - TODO: add argument description
443   FdSize  - TODO: add argument description
444 
445 Returns:
446 
447   TODO: add return values
448 
449 --*/
450 ;
451 
452 EFI_STATUS
453 GetImageReadFunction (
454   IN PE_COFF_LOADER_IMAGE_CONTEXT          *ImageContext,
455   IN EFI_PHYSICAL_ADDRESS                  *TopOfMemory
456   )
457 /*++
458 
459 Routine Description:
460 
461   TODO: Add function description
462 
463 Arguments:
464 
465   ImageContext  - TODO: add argument description
466   TopOfMemory   - TODO: add argument description
467 
468 Returns:
469 
470   TODO: add return values
471 
472 --*/
473 ;
474 
475 EFI_STATUS
476 EFIAPI
477 SecImageRead (
478   IN     VOID    *FileHandle,
479   IN     UINTN   FileOffset,
480   IN OUT UINTN   *ReadSize,
481   OUT    VOID    *Buffer
482   )
483 /*++
484 
485 Routine Description:
486 
487   TODO: Add function description
488 
489 Arguments:
490 
491   FileHandle  - TODO: add argument description
492   FileOffset  - TODO: add argument description
493   ReadSize    - TODO: add argument description
494   Buffer      - TODO: add argument description
495 
496 Returns:
497 
498   TODO: add return values
499 
500 --*/
501 ;
502 
503 CHAR16                            *
504 AsciiToUnicode (
505   IN  CHAR8   *Ascii,
506   IN  UINTN   *StrLen OPTIONAL
507   )
508 /*++
509 
510 Routine Description:
511 
512   TODO: Add function description
513 
514 Arguments:
515 
516   Ascii   - TODO: add argument description
517   StrLen  - TODO: add argument description
518 
519 Returns:
520 
521   TODO: add return values
522 
523 --*/
524 ;
525 
526 UINTN
527 CountSeperatorsInString (
528   IN  CONST CHAR16   *String,
529   IN  CHAR16   Seperator
530   )
531 /*++
532 
533 Routine Description:
534 
535   TODO: Add function description
536 
537 Arguments:
538 
539   String    - TODO: add argument description
540   Seperator - TODO: add argument description
541 
542 Returns:
543 
544   TODO: add return values
545 
546 --*/
547 ;
548 
549 EFI_STATUS
550 EFIAPI
551 SecTemporaryRamSupport (
552   IN CONST EFI_PEI_SERVICES   **PeiServices,
553   IN EFI_PHYSICAL_ADDRESS     TemporaryMemoryBase,
554   IN EFI_PHYSICAL_ADDRESS     PermanentMemoryBase,
555   IN UINTN                    CopySize
556   );
557 
558 
559 extern EFI_WIN_NT_THUNK_PROTOCOL  *gWinNt;
560