2007-07-03 11:18:19 +02:00
|
|
|
/*++
|
|
|
|
|
|
|
|
Copyright (c) 2006, Intel Corporation
|
|
|
|
All rights reserved. This program and the accompanying materials
|
|
|
|
are licensed and made available under the terms and conditions of the BSD License
|
|
|
|
which accompanies this distribution. The full text of the license may be found at
|
|
|
|
http://opensource.org/licenses/bsd-license.php
|
|
|
|
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
|
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
|
|
|
|
|
|
|
|
Module Name:
|
|
|
|
SecMain.h
|
|
|
|
|
|
|
|
Abstract:
|
|
|
|
Include file for Windows API based SEC
|
|
|
|
|
|
|
|
--*/
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <Base.h>
|
|
|
|
#include <PiPei.h>
|
2007-07-27 18:55:19 +02:00
|
|
|
#include <PiDxe.h>
|
2007-07-03 11:18:19 +02:00
|
|
|
#include <WinNtPeim.h>
|
|
|
|
#include <Library/BaseLib.h>
|
|
|
|
#include <Library/PeCoffLib.h>
|
|
|
|
#include <Guid/PeiPeCoffLoader.h>
|
|
|
|
#include <Ppi/NtPeiLoadFile.h>
|
|
|
|
#include <Ppi/NtAutoscan.h>
|
|
|
|
#include <Ppi/NtThunk.h>
|
|
|
|
#include <Ppi/StatusCode.h>
|
|
|
|
#include <Ppi/NtFwh.h>
|
|
|
|
#include <Library/PcdLib.h>
|
|
|
|
#include <Library/DebugLib.h>
|
|
|
|
#include <Library/PrintLib.h>
|
|
|
|
#include <Library/BaseMemoryLib.h>
|
2007-07-27 18:55:19 +02:00
|
|
|
#include <Library/ReportStatusCodeLib.h>
|
|
|
|
|
|
|
|
#include <IndustryStandard/PeImage.h>
|
|
|
|
|
2007-07-03 11:18:19 +02:00
|
|
|
|
|
|
|
#define STACK_SIZE 0x20000
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
EFI_PHYSICAL_ADDRESS Address;
|
|
|
|
UINT64 Size;
|
|
|
|
} NT_FD_INFO;
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
EFI_PHYSICAL_ADDRESS Memory;
|
|
|
|
UINT64 Size;
|
|
|
|
} NT_SYSTEM_MEMORY;
|
|
|
|
|
|
|
|
#define MAX_PDB_NAME_TO_MOD_HANDLE_ARRAY_SIZE 0x100
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
CHAR8 *PdbPointer;
|
|
|
|
VOID *ModHandle;
|
|
|
|
} PDB_NAME_TO_MOD_HANDLE;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
EFIAPI
|
|
|
|
SecWinNtPeiLoadFile (
|
|
|
|
VOID *Pe32Data, // TODO: add IN/OUT modifier to Pe32Data
|
|
|
|
EFI_PHYSICAL_ADDRESS *ImageAddress, // TODO: add IN/OUT modifier to ImageAddress
|
|
|
|
UINT64 *ImageSize, // TODO: add IN/OUT modifier to ImageSize
|
|
|
|
EFI_PHYSICAL_ADDRESS *EntryPoint // TODO: add IN/OUT modifier to EntryPoint
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
TODO: Add function description
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
Pe32Data - TODO: add argument description
|
|
|
|
ImageAddress - TODO: add argument description
|
|
|
|
ImageSize - TODO: add argument description
|
|
|
|
EntryPoint - TODO: add argument description
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
TODO: add return values
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
EFIAPI
|
|
|
|
SecWinNtPeiAutoScan (
|
|
|
|
IN UINTN Index,
|
|
|
|
OUT EFI_PHYSICAL_ADDRESS *MemoryBase,
|
|
|
|
OUT UINT64 *MemorySize
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
TODO: Add function description
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
Index - TODO: add argument description
|
|
|
|
MemoryBase - TODO: add argument description
|
|
|
|
MemorySize - TODO: add argument description
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
TODO: add return values
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
VOID *
|
|
|
|
EFIAPI
|
|
|
|
SecWinNtWinNtThunkAddress (
|
|
|
|
VOID
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
TODO: Add function description
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
InterfaceSize - TODO: add argument description
|
|
|
|
InterfaceBase - TODO: add argument description
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
TODO: add return values
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
EFIAPI
|
|
|
|
SecWinNtWinNtFwhAddress (
|
|
|
|
IN OUT UINT64 *FwhSize,
|
|
|
|
IN OUT EFI_PHYSICAL_ADDRESS *FwhBase
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
TODO: Add function description
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
FwhSize - TODO: add argument description
|
|
|
|
FwhBase - TODO: add argument description
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
TODO: add return values
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
EFIAPI
|
|
|
|
SecPeiReportStatusCode (
|
2007-09-04 08:10:44 +02:00
|
|
|
IN CONST EFI_PEI_SERVICES **PeiServices,
|
2007-07-03 11:18:19 +02:00
|
|
|
IN EFI_STATUS_CODE_TYPE CodeType,
|
|
|
|
IN EFI_STATUS_CODE_VALUE Value,
|
|
|
|
IN UINT32 Instance,
|
2007-09-04 08:10:44 +02:00
|
|
|
IN CONST EFI_GUID * CallerId,
|
|
|
|
IN CONST EFI_STATUS_CODE_DATA * Data OPTIONAL
|
2007-07-03 11:18:19 +02:00
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
TODO: Add function description
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
PeiServices - TODO: add argument description
|
|
|
|
CodeType - TODO: add argument description
|
|
|
|
Value - TODO: add argument description
|
|
|
|
Instance - TODO: add argument description
|
|
|
|
CallerId - TODO: add argument description
|
|
|
|
Data - TODO: add argument description
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
TODO: add return values
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
INTN
|
|
|
|
EFIAPI
|
|
|
|
main (
|
|
|
|
IN INTN Argc,
|
|
|
|
IN CHAR8 **Argv,
|
|
|
|
IN CHAR8 **Envp
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
TODO: Add function description
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
Argc - TODO: add argument description
|
|
|
|
Argv - TODO: add argument description
|
|
|
|
Envp - TODO: add argument description
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
TODO: add return values
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
WinNtOpenFile (
|
|
|
|
CHAR16 *FileName,
|
|
|
|
UINT32 MapSize,
|
|
|
|
DWORD CreationDispostion,
|
|
|
|
EFI_PHYSICAL_ADDRESS *BaseAddress,
|
|
|
|
UINT64 *Length
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
TODO: Add function description
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
FileName - TODO: add argument description
|
|
|
|
MapSize - TODO: add argument description
|
|
|
|
CreationDispostion - TODO: add argument description
|
|
|
|
BaseAddress - TODO: add argument description
|
|
|
|
Length - TODO: add argument description
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
TODO: add return values
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
VOID
|
|
|
|
SecLoadFromCore (
|
|
|
|
IN UINTN LargestRegion,
|
|
|
|
IN UINTN LargestRegionSize,
|
|
|
|
IN UINTN BootFirmwareVolumeBase,
|
|
|
|
IN VOID *PeiCoreFile
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
TODO: Add function description
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
LargestRegion - TODO: add argument description
|
|
|
|
LargestRegionSize - TODO: add argument description
|
|
|
|
BootFirmwareVolumeBase - TODO: add argument description
|
|
|
|
PeiCoreFile - TODO: add argument description
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
TODO: add return values
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
SecLoadFile (
|
|
|
|
IN VOID *Pe32Data,
|
|
|
|
IN EFI_PHYSICAL_ADDRESS *ImageAddress,
|
|
|
|
IN UINT64 *ImageSize,
|
|
|
|
IN EFI_PHYSICAL_ADDRESS *EntryPoint
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
TODO: Add function description
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
Pe32Data - TODO: add argument description
|
|
|
|
ImageAddress - TODO: add argument description
|
|
|
|
ImageSize - TODO: add argument description
|
|
|
|
EntryPoint - TODO: add argument description
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
TODO: add return values
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
SecFfsFindPeiCore (
|
|
|
|
IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader,
|
|
|
|
OUT VOID **Pe32Data
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
TODO: Add function description
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
FwVolHeader - TODO: add argument description
|
|
|
|
Pe32Data - TODO: add argument description
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
TODO: add return values
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
SecFfsFindNextFile (
|
|
|
|
IN EFI_FV_FILETYPE SearchType,
|
|
|
|
IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader,
|
|
|
|
IN OUT EFI_FFS_FILE_HEADER **FileHeader
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
TODO: Add function description
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
SearchType - TODO: add argument description
|
|
|
|
FwVolHeader - TODO: add argument description
|
|
|
|
FileHeader - TODO: add argument description
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
TODO: add return values
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
SecFfsFindSectionData (
|
|
|
|
IN EFI_SECTION_TYPE SectionType,
|
|
|
|
IN EFI_FFS_FILE_HEADER *FfsFileHeader,
|
|
|
|
IN OUT VOID **SectionData
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
TODO: Add function description
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
SectionType - TODO: add argument description
|
|
|
|
FfsFileHeader - TODO: add argument description
|
|
|
|
SectionData - TODO: add argument description
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
TODO: add return values
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
EFIAPI
|
|
|
|
SecWinNtPeCoffLoaderLoadAsDll (
|
|
|
|
IN CHAR8 *PdbFileName,
|
|
|
|
IN VOID **ImageEntryPoint,
|
|
|
|
OUT VOID **ModHandle
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
TODO: Add function description
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
PdbFileName - TODO: add argument description
|
|
|
|
ImageEntryPoint - TODO: add argument description
|
|
|
|
ModHandle - TODO: add argument description
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
TODO: add return values
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
EFIAPI
|
|
|
|
SecWinNtPeCoffLoaderFreeLibrary (
|
|
|
|
OUT VOID *ModHandle
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
TODO: Add function description
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
ModHandle - TODO: add argument description
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
TODO: add return values
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
EFIAPI
|
|
|
|
SecWinNtFdAddress (
|
|
|
|
IN UINTN Index,
|
|
|
|
IN OUT EFI_PHYSICAL_ADDRESS *FdBase,
|
|
|
|
IN OUT UINT64 *FdSize
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
TODO: Add function description
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
Index - TODO: add argument description
|
|
|
|
FdBase - TODO: add argument description
|
|
|
|
FdSize - TODO: add argument description
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
TODO: add return values
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
GetImageReadFunction (
|
|
|
|
IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,
|
|
|
|
IN EFI_PHYSICAL_ADDRESS *TopOfMemory
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
TODO: Add function description
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
ImageContext - TODO: add argument description
|
|
|
|
TopOfMemory - TODO: add argument description
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
TODO: add return values
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
EFIAPI
|
|
|
|
SecImageRead (
|
|
|
|
IN VOID *FileHandle,
|
|
|
|
IN UINTN FileOffset,
|
|
|
|
IN OUT UINTN *ReadSize,
|
|
|
|
OUT VOID *Buffer
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
TODO: Add function description
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
FileHandle - TODO: add argument description
|
|
|
|
FileOffset - TODO: add argument description
|
|
|
|
ReadSize - TODO: add argument description
|
|
|
|
Buffer - TODO: add argument description
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
TODO: add return values
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
CHAR16 *
|
|
|
|
AsciiToUnicode (
|
|
|
|
IN CHAR8 *Ascii,
|
|
|
|
IN UINTN *StrLen OPTIONAL
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
TODO: Add function description
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
Ascii - TODO: add argument description
|
|
|
|
StrLen - TODO: add argument description
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
TODO: add return values
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
UINTN
|
|
|
|
CountSeperatorsInString (
|
|
|
|
IN const CHAR16 *String,
|
|
|
|
IN CHAR16 Seperator
|
|
|
|
)
|
|
|
|
/*++
|
|
|
|
|
|
|
|
Routine Description:
|
|
|
|
|
|
|
|
TODO: Add function description
|
|
|
|
|
|
|
|
Arguments:
|
|
|
|
|
|
|
|
String - TODO: add argument description
|
|
|
|
Seperator - TODO: add argument description
|
|
|
|
|
|
|
|
Returns:
|
|
|
|
|
|
|
|
TODO: add return values
|
|
|
|
|
|
|
|
--*/
|
|
|
|
;
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
EFIAPI
|
|
|
|
SecNt32PeCoffGetImageInfo (
|
|
|
|
IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This,
|
|
|
|
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
|
|
|
);
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
EFIAPI
|
|
|
|
SecNt32PeCoffLoadImage (
|
|
|
|
IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This,
|
|
|
|
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
|
|
|
);
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
EFIAPI
|
|
|
|
SecNt32PeCoffRelocateImage (
|
|
|
|
IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This,
|
|
|
|
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
|
|
|
);
|
|
|
|
|
|
|
|
EFI_STATUS
|
|
|
|
EFIAPI
|
|
|
|
SecNt32PeCoffUnloadimage (
|
|
|
|
IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This,
|
|
|
|
IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
EFI_PEI_PE_COFF_LOADER_PROTOCOL PeCoff;
|
|
|
|
VOID *ModHandle;
|
|
|
|
} EFI_PEI_PE_COFF_LOADER_PROTOCOL_INSTANCE;
|
|
|
|
|
|
|
|
extern EFI_WIN_NT_THUNK_PROTOCOL *gWinNt;
|