Porting SecMain module for Nt32Pkg, but not enable PI, so it currently dependent on IntelFrameworkPkg temporary.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2998 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
klu2 2007-07-03 09:18:19 +00:00
parent 53f320dc75
commit 2e19fd0ff6
14 changed files with 2882 additions and 5 deletions

View File

@ -21,6 +21,13 @@
#define _FRAMEWORK_PEI_H_
#include <PiPei.h>
typedef struct {
UINTN BootFirmwareVolume;
UINTN SizeOfCacheAsRam;
EFI_PEI_PPI_DESCRIPTOR *DispatchTable;
} EFI_PEI_STARTUP_DESCRIPTOR;
#include <Common/FrameworkFirmwareFileSystem.h>
#include <Common/FrameworkHob.h>
#include <Common/FrameworkLegacy16.h>

View File

@ -0,0 +1,71 @@
/*++
Copyright (c) 2006 - 2007, 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:
PeiPeCoffLoader.h
Abstract:
GUID for the PE/COFF Loader APIs shared between PEI and DXE
--*/
#ifndef __PEI_PE_COFF_LOADER_H__
#define __PEI_PE_COFF_LOADER_H__
//
// MdePkg/Include/Common/PeCoffLoaderImageContext.h
//
#include <Library/PeCoffLib.h>
#define EFI_PEI_PE_COFF_LOADER_GUID \
{ 0xd8117cff, 0x94a6, 0x11d4, {0x9a, 0x3a, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }
typedef struct _EFI_PEI_PE_COFF_LOADER_PROTOCOL EFI_PEI_PE_COFF_LOADER_PROTOCOL;
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_PE_COFF_LOADER_GET_IMAGE_INFO) (
IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This,
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
);
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_PE_COFF_LOADER_LOAD_IMAGE) (
IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This,
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
);
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_PE_COFF_LOADER_RELOCATE_IMAGE) (
IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This,
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
);
typedef
EFI_STATUS
(EFIAPI *EFI_PEI_PE_COFF_LOADER_UNLOAD_IMAGE) (
IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This,
IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext
);
struct _EFI_PEI_PE_COFF_LOADER_PROTOCOL {
EFI_PEI_PE_COFF_LOADER_GET_IMAGE_INFO GetImageInfo;
EFI_PEI_PE_COFF_LOADER_LOAD_IMAGE LoadImage;
EFI_PEI_PE_COFF_LOADER_RELOCATE_IMAGE RelocateImage;
EFI_PEI_PE_COFF_LOADER_UNLOAD_IMAGE UnloadImage;
};
extern EFI_GUID gEfiPeiPeCoffLoaderGuid;
#endif

View File

@ -64,7 +64,8 @@
gPcdPeiCallbackFnTableHobGuid = { 0xC625F4B2, 0xEA09, 0x4675, { 0x82, 0xD7, 0xBA, 0x36, 0x82, 0x15, 0x7A, 0x14 }}
gPcdDataBaseHobGuid = { 0xEA296D92, 0x0B69, 0x423C, { 0x8C, 0x28, 0x33, 0xB4, 0xE0, 0xA9, 0x12, 0x68 }}
gEfiMdePkgTokenSpaceGuid = { 0xA1AFF049, 0xFDEB, 0x442a, { 0xB3, 0x20, 0x13, 0xAB, 0x4C, 0xB7, 0x2B, 0xBC }}
##gEfiPeiPeCoffLoaderGuid will be removed in future
gEfiPeiPeCoffLoaderGuid = { 0xd8117cff, 0x94a6, 0x11d4, {0x9a, 0x3a, 0x0, 0x90, 0x27, 0x3f, 0xc1, 0x4d } }
################################################################################
#

View File

@ -30,6 +30,22 @@ typedef union {
} EFI_FFS_INTEGRITY_CHECK;
typedef UINT8 EFI_FV_FILETYPE;
#define EFI_FV_FILETYPE_ALL 0x00
#define EFI_FV_FILETYPE_RAW 0x01
#define EFI_FV_FILETYPE_FREEFORM 0x02
#define EFI_FV_FILETYPE_SECURITY_CORE 0x03
#define EFI_FV_FILETYPE_PEI_CORE 0x04
#define EFI_FV_FILETYPE_DXE_CORE 0x05
#define EFI_FV_FILETYPE_PEIM 0x06
#define EFI_FV_FILETYPE_DRIVER 0x07
#define EFI_FV_FILETYPE_COMBINED_PEIM_DRIVER 0x08
#define EFI_FV_FILETYPE_APPLICATION 0x09
//
// File type 0x0A is reserved and should not be used
//
#define EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE 0x0B
typedef UINT8 EFI_FFS_FILE_ATTRIBUTES;
typedef UINT8 EFI_FFS_FILE_STATE;

View File

@ -70,7 +70,7 @@
gEfiWinNtPhysicalDisksGuid = { 0x0C95A92F, 0xA006, 0x11D4, { 0xBC, 0xFA, 0x00, 0x80, 0xC7, 0x3C, 0x88, 0x81 }}
gEfiWinNtVirtualDisksGuid = { 0x0C95A928, 0xA006, 0x11D4, { 0xBC, 0xFA, 0x00, 0x80, 0xC7, 0x3C, 0x88, 0x81 }}
gEfiNt32PkgTokenSpaceGuid = { 0x0D79A645, 0x1D91, 0x40a6, { 0xA8, 0x1F, 0x61, 0xE6, 0x98, 0x2B, 0x32, 0xB4 }}
################################################################################
#
@ -93,7 +93,9 @@
gPeiNtThunkPpiGuid = { 0x98c281e5, 0xf906, 0x43dd, { 0xa9, 0x2b, 0xb0, 0x03, 0xbf, 0x27, 0x65, 0xda }}
gPeiNtAutoScanPpiGuid = { 0x0dce384d, 0x007c, 0x4ba5, { 0x94, 0xbd, 0x0f, 0x6e, 0xb6, 0x4d, 0x2a, 0xa9 }}
gEfiPeiMemoryDiscoveredPpiGuid = { 0xF894643D, 0xC449, 0x42D1, { 0x8E, 0xA8, 0x85, 0xBD, 0xD8, 0xC6, 0x5B, 0xDE }}
gNtPeiLoadFilePpiGuid = { 0xfd0c65eb, 0x0405, 0x4cd2, { 0x8a, 0xee, 0xf4, 0x0, 0xef, 0x13, 0xba, 0xc2 }}
gNtFwhPpiGuid = { 0x4e76928f, 0x50ad, 0x4334, {0xb0, 0x6b, 0xa8, 0x42, 0x13, 0x10, 0x8a, 0x57 }}
################################################################################
#
# PCD Declarations section - list of all PCDs Declared by this Package

View File

@ -212,8 +212,8 @@
PcdStatusCodeRuntimeMemorySize|gEfiIntelFrameworkModulePkgTokenSpaceGuid|128
[PcdsFixedAtBuild.IA32]
PcdWinNtMemorySizeForSecMain|gEfiNt32PkgTokenSpaceGuid|L"64!64"|VOID*|10
PcdWinNtFirmwareVolume|gEfiNt32PkgTokenSpaceGuid|L"..\\Fv\\Fv_Recovery.fd"|VOID*|52
PcdWinNtMemorySizeForSecMain|gEfiNt32PkgTokenSpaceGuid|L"64!64"|10
PcdWinNtFirmwareVolume|gEfiNt32PkgTokenSpaceGuid|L"..\\Fv\\Fv_Recovery.fd"|52
PcdWinNtBootMode|gEfiNt32PkgTokenSpaceGuid|1
PcdMaximumUnicodeStringLength|gEfiMdePkgTokenSpaceGuid|1000000
PcdMaximumAsciiStringLength|gEfiMdePkgTokenSpaceGuid|1000000
@ -351,3 +351,4 @@
$(WORKSPACE)/IntelFrameworkModulePkg/Universal/DriverSampleDxe/DriverSample.inf
$(WORKSPACE)/MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBus.inf ##This driver follows UEFI specification definition
$(WORKSPACE)/MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDisk.inf ##This driver follows UEFI specification definition
$(WORKSPACE)/Nt32Pkg/Sec/SecMain.inf

314
Nt32Pkg/Sec/FwVol.c Normal file
View File

@ -0,0 +1,314 @@
/*++
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:
FwVol.c
Abstract:
A simple FV stack so the SEC can extract the SEC Core from an
FV.
--*/
#include "SecMain.h"
#define GET_OCCUPIED_SIZE(ActualSize, Alignment) \
(ActualSize) + (((Alignment) - ((ActualSize) & ((Alignment) - 1))) & ((Alignment) - 1))
EFI_FFS_FILE_STATE
GetFileState (
IN UINT8 ErasePolarity,
IN EFI_FFS_FILE_HEADER *FfsHeader
)
/*++
Routine Description:
Returns the highest bit set of the State field
Arguments:
ErasePolarity - Erase Polarity as defined by EFI_FVB_ERASE_POLARITY
in the Attributes field.
FfsHeader - Pointer to FFS File Header.
Returns:
Returns the highest bit in the State field
--*/
{
EFI_FFS_FILE_STATE FileState;
EFI_FFS_FILE_STATE HighestBit;
FileState = FfsHeader->State;
if (ErasePolarity != 0) {
FileState = (EFI_FFS_FILE_STATE)~FileState;
}
HighestBit = 0x80;
while (HighestBit != 0 && (HighestBit & FileState) == 0) {
HighestBit >>= 1;
}
return HighestBit;
}
UINT8
CalculateHeaderChecksum (
IN EFI_FFS_FILE_HEADER *FileHeader
)
/*++
Routine Description:
Calculates the checksum of the header of a file.
Arguments:
FileHeader - Pointer to FFS File Header.
Returns:
Checksum of the header.
--*/
{
UINT8 *ptr;
UINTN Index;
UINT8 Sum;
Sum = 0;
ptr = (UINT8 *) FileHeader;
for (Index = 0; Index < sizeof (EFI_FFS_FILE_HEADER) - 3; Index += 4) {
Sum = (UINT8) (Sum + ptr[Index]);
Sum = (UINT8) (Sum + ptr[Index + 1]);
Sum = (UINT8) (Sum + ptr[Index + 2]);
Sum = (UINT8) (Sum + ptr[Index + 3]);
}
for (; Index < sizeof (EFI_FFS_FILE_HEADER); Index++) {
Sum = (UINT8) (Sum + ptr[Index]);
}
//
// State field (since this indicates the different state of file).
//
Sum = (UINT8) (Sum - FileHeader->State);
//
// Checksum field of the file is not part of the header checksum.
//
Sum = (UINT8) (Sum - FileHeader->IntegrityCheck.Checksum.File);
return Sum;
}
EFI_STATUS
SecFfsFindNextFile (
IN EFI_FV_FILETYPE SearchType,
IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader,
IN OUT EFI_FFS_FILE_HEADER **FileHeader
)
/*++
Routine Description:
Given the input file pointer, search for the next matching file in the
FFS volume as defined by SearchType. The search starts from FileHeader inside
the Firmware Volume defined by FwVolHeader.
Arguments:
SearchType - Filter to find only files of this type.
Type EFI_FV_FILETYPE_ALL causes no filtering to be done.
FwVolHeader - Pointer to the FV header of the volume to search.
This parameter must point to a valid FFS volume.
FileHeader - Pointer to the current file from which to begin searching.
This pointer will be updated upon return to reflect the file
found.
Returns:
EFI_NOT_FOUND - No files matching the search criteria were found
EFI_SUCCESS
--*/
{
EFI_FFS_FILE_HEADER *FfsFileHeader;
UINT32 FileLength;
UINT32 FileOccupiedSize;
UINT32 FileOffset;
UINT64 FvLength;
UINT8 ErasePolarity;
UINT8 FileState;
FvLength = FwVolHeader->FvLength;
if (FwVolHeader->Attributes & EFI_FVB2_ERASE_POLARITY) {
ErasePolarity = 1;
} else {
ErasePolarity = 0;
}
//
// If FileHeader is not specified (NULL) start with the first file in the
// firmware volume. Otherwise, start from the FileHeader.
//
if (*FileHeader == NULL) {
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FwVolHeader + FwVolHeader->HeaderLength);
} else {
//
// Length is 24 bits wide so mask upper 8 bits
// FileLength is adjusted to FileOccupiedSize as it is 8 byte aligned.
//
FileLength = *(UINT32 *) (*FileHeader)->Size & 0x00FFFFFF;
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) *FileHeader + FileOccupiedSize);
}
FileOffset = (UINT32) ((UINT8 *) FfsFileHeader - (UINT8 *) FwVolHeader);
while (FileOffset < (FvLength - sizeof (EFI_FFS_FILE_HEADER))) {
//
// Get FileState which is the highest bit of the State
//
FileState = GetFileState (ErasePolarity, FfsFileHeader);
switch (FileState) {
case EFI_FILE_HEADER_INVALID:
FileOffset += sizeof (EFI_FFS_FILE_HEADER);
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + sizeof (EFI_FFS_FILE_HEADER));
break;
case EFI_FILE_DATA_VALID:
case EFI_FILE_MARKED_FOR_UPDATE:
if (CalculateHeaderChecksum (FfsFileHeader) == 0) {
FileLength = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
if ((SearchType == FfsFileHeader->Type) || (SearchType == EFI_FV_FILETYPE_ALL)) {
*FileHeader = FfsFileHeader;
return EFI_SUCCESS;
}
FileOffset += FileOccupiedSize;
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + FileOccupiedSize);
} else {
return EFI_NOT_FOUND;
}
break;
case EFI_FILE_DELETED:
FileLength = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
FileOccupiedSize = GET_OCCUPIED_SIZE (FileLength, 8);
FileOffset += FileOccupiedSize;
FfsFileHeader = (EFI_FFS_FILE_HEADER *) ((UINT8 *) FfsFileHeader + FileOccupiedSize);
break;
default:
return EFI_NOT_FOUND;
}
}
return EFI_NOT_FOUND;
}
EFI_STATUS
SecFfsFindSectionData (
IN EFI_SECTION_TYPE SectionType,
IN EFI_FFS_FILE_HEADER *FfsFileHeader,
IN OUT VOID **SectionData
)
/*++
Routine Description:
Given the input file pointer, search for the next matching section in the
FFS volume.
Arguments:
SearchType - Filter to find only sections of this type.
FfsFileHeader - Pointer to the current file to search.
SectionData - Pointer to the Section matching SectionType in FfsFileHeader.
NULL if section not found
Returns:
EFI_NOT_FOUND - No files matching the search criteria were found
EFI_SUCCESS
--*/
{
UINT32 FileSize;
EFI_COMMON_SECTION_HEADER *Section;
UINT32 SectionLength;
UINT32 ParsedLength;
//
// Size is 24 bits wide so mask upper 8 bits.
// Does not include FfsFileHeader header size
// FileSize is adjusted to FileOccupiedSize as it is 8 byte aligned.
//
Section = (EFI_COMMON_SECTION_HEADER *) (FfsFileHeader + 1);
FileSize = *(UINT32 *) (FfsFileHeader->Size) & 0x00FFFFFF;
FileSize -= sizeof (EFI_FFS_FILE_HEADER);
*SectionData = NULL;
ParsedLength = 0;
while (ParsedLength < FileSize) {
if (Section->Type == SectionType) {
*SectionData = (VOID *) (Section + 1);
return EFI_SUCCESS;
}
//
// Size is 24 bits wide so mask upper 8 bits.
// SectionLength is adjusted it is 4 byte aligned.
// Go to the next section
//
SectionLength = *(UINT32 *) Section->Size & 0x00FFFFFF;
SectionLength = GET_OCCUPIED_SIZE (SectionLength, 4);
ParsedLength += SectionLength;
Section = (EFI_COMMON_SECTION_HEADER *) ((UINT8 *) Section + SectionLength);
}
return EFI_NOT_FOUND;
}
EFI_STATUS
SecFfsFindPeiCore (
IN EFI_FIRMWARE_VOLUME_HEADER *FwVolHeader,
OUT VOID **Pe32Data
)
/*++
Routine Description:
Given the pointer to the Firmware Volume Header find the SEC
core and return it's PE32 image.
Arguments:
FwVolHeader - Pointer to memory mapped FV
Pe32Data - Pointer to SEC PE32 iamge.
Returns:
EFI_SUCCESS - Pe32Data is valid
other - Failure
--*/
{
EFI_STATUS Status;
EFI_FFS_FILE_HEADER *FileHeader;
EFI_FV_FILETYPE SearchType;
SearchType = EFI_FV_FILETYPE_PEI_CORE;
FileHeader = NULL;
do {
Status = SecFfsFindNextFile (SearchType, FwVolHeader, &FileHeader);
if (!EFI_ERROR (Status)) {
Status = SecFfsFindSectionData (EFI_SECTION_PE32, FileHeader, Pe32Data);
return Status;
}
} while (!EFI_ERROR (Status));
return Status;
}

74
Nt32Pkg/Sec/Makefile Normal file
View File

@ -0,0 +1,74 @@
SOURCE_FILES = $(DEBUG_DIR)\AutoGen.c \
$(MODULE_DIR)\Nt32Pkg\Sec\WinNtThunk.c \
$(MODULE_DIR)\Nt32Pkg\Sec\FwVol.c \
$(MODULE_DIR)\Nt32Pkg\Sec\SecMain.c
INC = -I$(WORKSPACE)\Nt32Pkg\Sec \
-I$(DEBUG_DIR) \
-I$(WORKSPACE)\Nt32Pkg \
-I$(WORKSPACE)\Nt32Pkg\Include \
-I$(WORKSPACE)\MdePkg \
-I$(WORKSPACE)\MdePkg\Include\Ia32 \
-I$(WORKSPACE)\MdePkg\Include \
-I$(WORKSPACE)\MdeModulePkg\Include \
-I$(WORKSPACE)\IntelFrameworkPkg\Include
OBJECTS = $(OUTPUT_DIR)\.\AutoGen.obj \
$(OUTPUT_DIR)\.\WinNtThunk.obj \
$(OUTPUT_DIR)\.\FwVol.obj \
$(OUTPUT_DIR)\.\SecMain.obj
LIBS = $(LIB_DIR)\BaseDebugLibNull.lib \
$(LIB_DIR)\BasePrintLib.lib \
$(LIB_DIR)\BaseMemoryLib.lib \
$(LIB_DIR)\BaseLib.lib \
$(LIB_DIR)\BasePeCoffLib.lib
MSVS_LINK_LIBPATHS = /LIBPATH:"$(VCINSTALLDIR)\Lib" /LIBPATH:"$(VCINSTALLDIR)\PlatformSdk\Lib"
LINK_FLAGS_EXE = /NOLOGO /SUBSYSTEM:CONSOLE /NODEFAULTLIB /IGNORE:4086 /MAP /OPT:REF /DEBUG /MACHINE:I386 /LTCG \
Kernel32.lib MSVCRTD.lib Gdi32.lib User32.lib Winmm.lib
COMMON_DEPS = $(DEBUG_DIR)\AutoGen.h
all : $(BIN_DIR)\SecMain.exe
$(BIN_DIR)\SecMain.exe : $(OBJECTS)
"$(DLINK)" \
$(MSVS_LINK_LIBPATHS) \
$(LINK_FLAGS_EXE) \
$(OBJECTS) \
$(LIBS) \
/base:0x10000000 \
/out:"$(BIN_DIR)\SecMain.exe" \
/pdb:"$(BIN_DIR)\SecMain.pdb"
#
# Individual Object Build Targets
#
$(OUTPUT_DIR)\.\AutoGen.obj : $(COMMON_DEPS)
$(OUTPUT_DIR)\.\AutoGen.obj : $(DEBUG_DIR)\AutoGen.c
"$(CC)" $(CC_FLAGS) $(INC) /Fo$@ $(DEBUG_DIR)\AutoGen.c
$(OUTPUT_DIR)\.\WinNtThunk.obj : $(COMMON_DEPS)
$(OUTPUT_DIR)\.\WinNtThunk.obj : $(MODULE_DIR)\WinNtThunk.c
"$(CC)" $(CC_FLAGS) $(INC) /Fo$@ $(MODULE_DIR)\WinNtThunk.c
$(OUTPUT_DIR)\.\FwVol.obj : $(COMMON_DEPS)
$(OUTPUT_DIR)\.\FwVol.obj : $(MODULE_DIR)\FwVol.c
"$(CC)" $(CC_FLAGS) $(INC) /Fo$@ $(MODULE_DIR)\FwVol.c
$(OUTPUT_DIR)\.\SecMain.obj : $(COMMON_DEPS)
$(OUTPUT_DIR)\.\SecMain.obj : $(MODULE_DIR)\SecMain.c
"$(CC)" $(CC_FLAGS) $(INC) /Fo$@ $(MODULE_DIR)\SecMain.c
clean:
- @if exist $(DEBUG_DIR)\AutoGen.c del $(DEBUG_DIR)\AutoGen.c > NUL
del $(DEBUG_DIR)\AutoGen.h > NUL
del $(OUTPUT_DIR)\.\*.obj > NUL
del $(MODULE_BUILD_DIR)\makefile > NUL
del $(MODULE_BUILD_DIR)\*.idb > NUL
del $(MODULE_BUILD_DIR)\*.pdb > NUL
del $(BIN_DIR)\SecMain.exe > NUL
del $(BIN_DIR)\SecMain.pdb > NUL

1236
Nt32Pkg/Sec/SecMain.c Normal file

File diff suppressed because it is too large Load Diff

585
Nt32Pkg/Sec/SecMain.h Normal file
View File

@ -0,0 +1,585 @@
/*++
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>
#include <FrameworkPei.h>
#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>
#define STACK_SIZE 0x20000
typedef struct {
EFI_PHYSICAL_ADDRESS Address;
UINT64 Size;
} NT_FD_INFO;
#define NT_SYSTEM_MEMORY_FILENAME_SIZE 40
typedef struct {
CHAR16 FileName[NT_SYSTEM_MEMORY_FILENAME_SIZE];
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 (
IN EFI_PEI_SERVICES **PeiServices,
IN EFI_STATUS_CODE_TYPE CodeType,
IN EFI_STATUS_CODE_VALUE Value,
IN UINT32 Instance,
IN EFI_GUID * CallerId,
IN EFI_STATUS_CODE_DATA * Data OPTIONAL
)
/*++
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;

137
Nt32Pkg/Sec/SecMain.inf Normal file
View File

@ -0,0 +1,137 @@
#/** @file
# Entry Point of NT32 Emulator
#
# Main executable file of NT32 Emulator that loads PEI core after initialization finished.
# Copyright (c) 2007 - 2007, 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.
#
#
#**/
################################################################################
#
# Defines Section - statements that will be processed to create a Makefile.
#
################################################################################
[Defines]
INF_VERSION = 0x00010005
BASE_NAME = SecMain
FILE_GUID = 4b837b03-6587-4d19-b82b-edfad836c0a0
MODULE_TYPE = SEC
VERSION_STRING = 1.0
EDK_RELEASE_VERSION = 0x00020000
EFI_SPECIFICATION_VERSION = 0x00020000
CUSTOM_MAKEFILE = MSFT|Makefile
#
# The following information is for reference only and not required by the build tools.
#
# VALID_ARCHITECTURES = IA32
#
################################################################################
#
# Sources Section - list of files that are required for the build to succeed.
#
################################################################################
[Sources.common]
OldDefinition.h
SecMain.h
WinNtThunk.c
FwVol.c
SecMain.c
SecMain_build.xml
################################################################################
#
# Includes Section - list of Include locations that are required for
# this module.
#
################################################################################
[Includes]
$(WORKSPACE)/MdePkg/Include/Library
################################################################################
#
# Package Dependency Section - list of Package files that are required for
# this module.
#
################################################################################
[Packages]
Nt32Pkg/Nt32Pkg.dec
MdeModulePkg/MdeModulePkg.dec
MdePkg/MdePkg.dec
IntelFrameworkPkg/IntelFrameworkPkg.dec
################################################################################
#
# Library Class Section - list of Library Classes that are required for
# this module.
#
################################################################################
[LibraryClasses]
DebugLib
PcdLib
PrintLib
BaseMemoryLib
BaseLib
PeCoffLib
################################################################################
#
# Guid C Name Section - list of Guids that this module uses or produces.
#
################################################################################
[Guids]
gEfiPeiPeCoffLoaderGuid # ALWAYS_PRODUCED
################################################################################
#
# PPI C Name Section - list of PPI and PPI Notify C Names that this module
# uses or produces.
#
################################################################################
[Ppis]
gNtPeiLoadFilePpiGuid # PPI ALWAYS_PRODUCED
gEfiPeiStatusCodePpiGuid # PPI ALWAYS_PRODUCED
gNtFwhPpiGuid # PPI ALWAYS_PRODUCED
gPeiNtAutoScanPpiGuid # PPI ALWAYS_PRODUCED
gPeiNtThunkPpiGuid # PPI ALWAYS_PRODUCED
################################################################################
#
# Pcd FIXED_AT_BUILD - list of PCDs that this module is coded for.
#
################################################################################
[PcdsFixedAtBuild.common]
PcdWinNtBootMode|gEfiNt32PkgTokenSpaceGuid
################################################################################
#
# Pcd DYNAMIC - list of PCDs that this module is coded for.
#
################################################################################
[PcdsDynamic.common]
#PcdWinNtMemorySizeForSecMain|gEfiNt32PkgTokenSpaceGuid
#PcdWinNtFirmwareVolume|gEfiNt32PkgTokenSpaceGuid

112
Nt32Pkg/Sec/SecMain.msa Normal file
View File

@ -0,0 +1,112 @@
<?xml version="1.0" encoding="UTF-8"?>
<ModuleSurfaceArea xmlns="http://www.TianoCore.org/2006/Edk2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<MsaHeader>
<ModuleName>SecMain</ModuleName>
<ModuleType>SEC</ModuleType>
<GuidValue>4b837b03-6587-4d19-b82b-edfad836c0a0</GuidValue>
<Version>1.0</Version>
<Abstract>Entry Point of NT32 Emulator</Abstract>
<Description>Main executable file of NT32 Emulator that loads PEI core after initialization finished.</Description>
<Copyright>Copyright (c) 2006 - 2007, Intel Corporation</Copyright>
<License>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.</License>
<Specification>FRAMEWORK_BUILD_PACKAGING_SPECIFICATION 0x00000052</Specification>
</MsaHeader>
<ModuleDefinitions>
<SupportedArchitectures>IA32</SupportedArchitectures>
<BinaryModule>false</BinaryModule>
<OutputFileBasename>SecMain</OutputFileBasename>
</ModuleDefinitions>
<LibraryClassDefinitions>
<LibraryClass Usage="ALWAYS_CONSUMED">
<Keyword>PeCoffLib</Keyword>
</LibraryClass>
<LibraryClass Usage="ALWAYS_CONSUMED">
<Keyword>BaseLib</Keyword>
</LibraryClass>
<LibraryClass Usage="ALWAYS_CONSUMED">
<Keyword>BaseMemoryLib</Keyword>
</LibraryClass>
<LibraryClass Usage="ALWAYS_CONSUMED">
<Keyword>PrintLib</Keyword>
</LibraryClass>
<LibraryClass Usage="ALWAYS_CONSUMED">
<Keyword>PcdLib</Keyword>
</LibraryClass>
<LibraryClass Usage="ALWAYS_CONSUMED">
<Keyword>DebugLib</Keyword>
</LibraryClass>
</LibraryClassDefinitions>
<SourceFiles>
<Filename ToolCode="DUMMY">SecMain_build.xml</Filename>
<Filename>SecMain.c</Filename>
<Filename>FwVol.c</Filename>
<Filename>WinNtThunk.c</Filename>
<Filename>SecMain.h</Filename>
</SourceFiles>
<PackageDependencies>
<Package PackageGuid="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
<Package PackageGuid="68169ab0-d41b-4009-9060-292c253ac43d"/>
<Package PackageGuid="0fb2aa2d-10d5-40a5-a9dc-060c12a4a3f3"/>
</PackageDependencies>
<PPIs>
<Ppi Usage="ALWAYS_PRODUCED">
<PpiCName>gPeiNtThunkPpiGuid</PpiCName>
</Ppi>
<Ppi Usage="ALWAYS_PRODUCED">
<PpiCName>gPeiNtAutoScanPpiGuid</PpiCName>
</Ppi>
<Ppi Usage="ALWAYS_PRODUCED">
<PpiCName>gNtFwhPpiGuid</PpiCName>
</Ppi>
<Ppi Usage="ALWAYS_PRODUCED">
<PpiCName>gEfiPeiStatusCodePpiGuid</PpiCName>
</Ppi>
<Ppi Usage="ALWAYS_PRODUCED">
<PpiCName>gNtPeiLoadFilePpiGuid</PpiCName>
</Ppi>
</PPIs>
<Guids>
<GuidCNames Usage="ALWAYS_PRODUCED">
<GuidCName>gEfiPeiPeCoffLoaderGuid</GuidCName>
</GuidCNames>
</Guids>
<Externs>
<Specification>EFI_SPECIFICATION_VERSION 0x00020000</Specification>
<Specification>EDK_RELEASE_VERSION 0x00020000</Specification>
</Externs>
<PcdCoded>
<PcdEntry PcdItemType="DYNAMIC">
<C_Name>PcdWinNtMemorySizeForSecMain</C_Name>
<TokenSpaceGuidCName>gEfiEdkNt32PkgTokenSpaceGuid</TokenSpaceGuidCName>
<HelpText>This PCD defines the memory size of simulated machine. Simulator will allocate
the size of PcdWinNtMemorySizeForSecMain in windows platform.</HelpText>
</PcdEntry>
<PcdEntry PcdItemType="DYNAMIC">
<C_Name>PcdWinNtFirmwareVolume</C_Name>
<TokenSpaceGuidCName>gEfiEdkNt32PkgTokenSpaceGuid</TokenSpaceGuidCName>
<HelpText>This PCD defines the FD file windows path string. Simulator will load the FD file and execute.</HelpText>
</PcdEntry>
<PcdEntry PcdItemType="FIXED_AT_BUILD">
<C_Name>PcdWinNtBootMode</C_Name>
<TokenSpaceGuidCName>gEfiEdkNt32PkgTokenSpaceGuid</TokenSpaceGuidCName>
<HelpText>This PCD defines the boot mode for simualtor.
The boot mode can be set as following value:
0x0: Boot with full configuration.
0x1: Boot with minimal configuration.
0x2: Boot assume no configuration changes.
0x3: Boot with full configuration plus diagnostics.
0x4: Boot with default settings.
0x5: Boot on S4 resume.
0x6: Boot on S5 resume.
0x10: Boot on S2 resume.
0x11: Boot on S3 resume.
0x12: Boot on flash update.
0x20: Boot in reovery mode.</HelpText>
</PcdEntry>
</PcdCoded>
</ModuleSurfaceArea>

View File

@ -0,0 +1,141 @@
<?xml version="1.0" ?>
<!--
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.
-->
<project name="SecMain" default="main" basedir="." >
<!-- Apply external ANT task -->
<taskdef resource="frameworktasks.tasks" />
<taskdef resource="cpptasks.tasks" />
<typedef resource="cpptasks.types" />
<taskdef resource="net/sf/antcontrib/antlib.xml" />
<property environment="env" />
<!-- All Properties -->
<property name="BASE_NAME" value="SecMain" />
<!-- Default target -->
<target name="main" depends="libraries, sourcefiles, sections, output" />
<!-- Compile all dependency Library instances. -->
<target name="libraries">
<GenBuild type="build">
<property name="ARCH" value="${ARCH}"/>
<property name="MODULE_GUID" value="27d67720-ea68-48ae-93da-a3a074c90e30"/>
<property name="MODULE_VERSION" value=""/>
<property name="PLATFORM" value="${PLATFORM}"/>
<property name="PACKAGE_GUID" value="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
<property name="PACKAGE_VERSION" value=""/>
</GenBuild>
<GenBuild type="build">
<property name="ARCH" value="${ARCH}"/>
<property name="MODULE_GUID" value="fd44e603-002a-4b29-9f5f-529e815b6165"/>
<property name="MODULE_VERSION" value=""/>
<property name="PLATFORM" value="${PLATFORM}"/>
<property name="PACKAGE_GUID" value="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
<property name="PACKAGE_VERSION" value=""/>
</GenBuild>
<GenBuild type="build">
<property name="ARCH" value="${ARCH}"/>
<property name="MODULE_GUID" value="a86fbfca-0183-4eeb-aa8a-762e3b7da1f3"/>
<property name="MODULE_VERSION" value=""/>
<property name="PLATFORM" value="${PLATFORM}"/>
<property name="PACKAGE_GUID" value="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
<property name="PACKAGE_VERSION" value=""/>
</GenBuild>
<GenBuild type="build">
<property name="ARCH" value="${ARCH}"/>
<property name="MODULE_GUID" value="556f5d10-7309-4af4-b80a-8196bd60946f"/>
<property name="MODULE_VERSION" value=""/>
<property name="PLATFORM" value="${PLATFORM}"/>
<property name="PACKAGE_GUID" value="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
<property name="PACKAGE_VERSION" value=""/>
</GenBuild>
<GenBuild type="build">
<property name="ARCH" value="${ARCH}"/>
<property name="MODULE_GUID" value="9ba1d976-0624-41a3-8650-28165e8d9ae8"/>
<property name="MODULE_VERSION" value=""/>
<property name="PLATFORM" value="${PLATFORM}"/>
<property name="PACKAGE_GUID" value="5e0e9358-46b6-4ae2-8218-4ab8b9bbdcec"/>
<property name="PACKAGE_VERSION" value=""/>
</GenBuild>
</target>
<target name="sourcefiles">
<Build_Init>
<EXTRA.INC>
<includepath path="${INCLUDE_PATHS}"/>
</EXTRA.INC>
</Build_Init>
<Build_AUTOGEN FILEEXT="c" FILENAME="AutoGen" FILEPATH=".">
<EXTRA.INC>
<includepath path="${INCLUDE_PATHS}"/>
</EXTRA.INC>
</Build_AUTOGEN>
<Build_CCode FILEEXT="c" FILENAME="FwVol" FILEPATH=".">
<EXTRA.INC>
<includepath path="${INCLUDE_PATHS}"/>
</EXTRA.INC>
</Build_CCode>
<Build_CCode FILEEXT="c" FILENAME="WinNtThunk" FILEPATH=".">
<EXTRA.INC>
<includepath path="${INCLUDE_PATHS}"/>
</EXTRA.INC>
</Build_CCode>
<Build_CCode FILEEXT="c" FILENAME="SecMain" FILEPATH=".">
<EXTRA.INC>
<includepath path="${INCLUDE_PATHS}"/>
</EXTRA.INC>
</Build_CCode>
</target>
<target name="sections" />
<target name="output" >
<if>
<available type="file" file="${DEST_DIR_OUTPUT}/AutoGen.h.obj"/>
<then>
<var name="SLINK_FLAGS" value="${SLINK_FLAGS} ${DEST_DIR_OUTPUT}/AutoGen.h.obj"/>
</then>
</if>
<OnDependency>
<sourcefiles>
<fileset dir="${DEST_DIR_OUTPUT}" includes="${OBJECTS}" />
<file list="${LIBS}"/>
</sourcefiles>
<targetfiles>
<file name="${BIN_DIR}\SecMain.exe"/>
</targetfiles>
<sequential>
<cc userdefine="on">
<command type="SLINK" cmd="${SLINK}" family="${SLINK_FAMILY}"
outputFile="${DEST_DIR_OUTPUT}/SecMainLocal.lib" dpath="${SLINK_DPATH}">
<argument value="${SLINK_FLAGS}"/>
<fileset dir="${DEST_DIR_OUTPUT}" includes="${OBJECTS}"/>
</command>
</cc>
<var name="LIBS" value="${LIBS} ${DEST_DIR_OUTPUT}/SecMainLocal.lib" />
<shellscript shell="cmd.exe" tmpsuffix=".cmd" >
<arg line="/q"/>
<arg line="/c"/>
<arg line="call"/>
PATH ${DLINK_DPATH};%path%
"${DLINK}" /LIBPATH:"${env.MSVCDir}\Lib" /LIBPATH:"${env.MSVCDir}\PlatformSdk\Lib" /NOLOGO /SUBSYSTEM:CONSOLE /NODEFAULTLIB /IGNORE:4086 /MAP /OPT:REF /DEBUG /MACHINE:I386 /LTCG Kernel32.lib MSVCRTD.lib Gdi32.lib User32.lib Winmm.lib ${LIBS} /base:0x10000000 /out:${BIN_DIR}\SecMain.exe /pdb:${DEST_DIR_DEBUG}\SecMain.pdb
</shellscript>
</sequential>
</OnDependency>
</target>
<target name="clean" ></target>
<target name="cleanAll"></target>
</project>

180
Nt32Pkg/Sec/WinNtThunk.c Normal file
View File

@ -0,0 +1,180 @@
/*++
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:
WinNtThunk.c
Abstract:
Since the SEC is the only windows program in our emulation we
must use a Tiano mechanism to export Win32 APIs to other modules.
This is the role of the EFI_WIN_NT_THUNK_PROTOCOL.
The mWinNtThunkTable exists so that a change to EFI_WIN_NT_THUNK_PROTOCOL
will cause an error in initializing the array if all the member functions
are not added. It looks like adding a element to end and not initializing
it may cause the table to be initaliized with the members at the end being
set to zero. This is bad as jumping to zero will case the NT32 to crash.
All the member functions in mWinNtThunkTable are Win32
API calls, so please reference Microsoft documentation.
gWinNt is a a public exported global that contains the initialized
data.
--*/
#include "SecMain.h"
//
// This pragma is needed for all the DLL entry points to be asigned to the array.
// if warning 4232 is not dissabled a warning will be generated as a DLL entry
// point could be modified dynamically. The SEC does not do that, so we must
// disable the warning so we can compile the SEC. The previous method was to
// asign each element in code. The disadvantage to that approach is it's harder
// to tell if all the elements have been initailized properly.
//
#pragma warning(disable : 4232)
#pragma warning(disable : 4996)
EFI_WIN_NT_THUNK_PROTOCOL mWinNtThunkTable = {
EFI_WIN_NT_THUNK_PROTOCOL_SIGNATURE,
GetProcAddress,
GetTickCount,
LoadLibraryEx,
FreeLibrary,
SetPriorityClass,
SetThreadPriority,
Sleep,
SuspendThread,
GetCurrentThread,
GetCurrentThreadId,
GetCurrentProcess,
CreateThread,
TerminateThread,
SendMessage,
ExitThread,
ResumeThread,
DuplicateHandle,
InitializeCriticalSection,
EnterCriticalSection,
LeaveCriticalSection,
DeleteCriticalSection,
TlsAlloc,
TlsFree,
TlsSetValue,
TlsGetValue,
CreateSemaphore,
WaitForSingleObject,
ReleaseSemaphore,
CreateConsoleScreenBuffer,
FillConsoleOutputAttribute,
FillConsoleOutputCharacter,
GetConsoleCursorInfo,
GetNumberOfConsoleInputEvents,
PeekConsoleInput,
ScrollConsoleScreenBuffer,
ReadConsoleInput,
SetConsoleActiveScreenBuffer,
SetConsoleCursorInfo,
SetConsoleCursorPosition,
SetConsoleScreenBufferSize,
SetConsoleTitleW,
WriteConsoleInput,
WriteConsoleOutput,
CreateFile,
DeviceIoControl,
CreateDirectory,
RemoveDirectory,
GetFileAttributes,
SetFileAttributes,
CreateFileMapping,
CloseHandle,
DeleteFile,
FindFirstFile,
FindNextFile,
FindClose,
FlushFileBuffers,
GetEnvironmentVariable,
GetLastError,
SetErrorMode,
GetStdHandle,
MapViewOfFileEx,
ReadFile,
SetEndOfFile,
SetFilePointer,
WriteFile,
GetFileInformationByHandle,
GetDiskFreeSpace,
GetDiskFreeSpaceEx,
MoveFile,
SetFileTime,
SystemTimeToFileTime,
FileTimeToLocalFileTime,
FileTimeToSystemTime,
GetSystemTime,
SetSystemTime,
GetLocalTime,
SetLocalTime,
GetTimeZoneInformation,
SetTimeZoneInformation,
timeSetEvent,
timeKillEvent,
ClearCommError,
EscapeCommFunction,
GetCommModemStatus,
GetCommState,
SetCommState,
PurgeComm,
SetCommTimeouts,
ExitProcess,
_snwprintf,
GetDesktopWindow,
GetForegroundWindow,
CreateWindowEx,
ShowWindow,
UpdateWindow,
DestroyWindow,
InvalidateRect,
GetWindowDC,
GetClientRect,
AdjustWindowRect,
SetDIBitsToDevice,
BitBlt,
GetDC,
ReleaseDC,
RegisterClassEx,
UnregisterClass,
BeginPaint,
EndPaint,
PostQuitMessage,
DefWindowProc,
LoadIcon,
LoadCursor,
GetStockObject,
SetViewportOrgEx,
SetWindowOrgEx,
MoveWindow,
GetWindowRect,
GetMessage,
TranslateMessage,
DispatchMessage,
GetProcessHeap,
HeapAlloc,
HeapFree
};
#pragma warning(default : 4996)
#pragma warning(default : 4232)
EFI_WIN_NT_THUNK_PROTOCOL *gWinNt = &mWinNtThunkTable;