#include "SecMain.h"\r
\r
\r
-//\r
-// Globals\r
-//\r
-EFI_PEI_PE_COFF_LOADER_PROTOCOL_INSTANCE mPeiEfiPeiPeCoffLoaderInstance = {\r
- {\r
- SecNt32PeCoffGetImageInfo,\r
- SecNt32PeCoffLoadImage,\r
- SecNt32PeCoffRelocateImage,\r
- SecNt32PeCoffUnloadimage\r
- },\r
- NULL\r
-};\r
-\r
-\r
-\r
-EFI_PEI_PE_COFF_LOADER_PROTOCOL *gPeiEfiPeiPeCoffLoader = &mPeiEfiPeiPeCoffLoaderInstance.PeCoff;\r
\r
NT_PEI_LOAD_FILE_PPI mSecNtLoadFilePpi = { SecWinNtPeiLoadFile };\r
\r
TEMPORARY_RAM_SUPPORT_PPI mSecTemporaryRamSupportPpi = {SecTemporaryRamSupport};\r
\r
EFI_PEI_PPI_DESCRIPTOR gPrivateDispatchTable[] = {\r
- {\r
- EFI_PEI_PPI_DESCRIPTOR_PPI,\r
- &gEfiPeiPeCoffLoaderGuid,\r
- NULL\r
- },\r
{\r
EFI_PEI_PPI_DESCRIPTOR_PPI,\r
&gNtPeiLoadFilePpiGuid,\r
UINTN gSystemMemoryCount = 0;\r
NT_SYSTEM_MEMORY *gSystemMemory;\r
\r
-\r
-UINTN mPdbNameModHandleArraySize = 0;\r
-PDB_NAME_TO_MOD_HANDLE *mPdbNameModHandleArray = NULL;\r
-\r
-\r
VOID\r
EFIAPI\r
SecSwitchStack (\r
UINT32 TemporaryMemoryBase,\r
UINT32 PermenentMemoryBase\r
);\r
-\r
+EFI_STATUS\r
+SecNt32PeCoffRelocateImage (\r
+ IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
+ );\r
INTN\r
EFIAPI\r
main (\r
TopOfStack = (VOID *)((UINTN)TopOfStack - sizeof (EFI_SEC_PEI_HAND_OFF) - CPU_STACK_ALIGNMENT);\r
TopOfStack = ALIGN_POINTER (TopOfStack, CPU_STACK_ALIGNMENT);\r
\r
- //\r
- // Patch value in dispatch table values\r
- //\r
- gPrivateDispatchTable[0].Ppi = gPeiEfiPeiPeCoffLoader;\r
-\r
//\r
// Bind this information into the SEC hand-off state\r
//\r
\r
ImageContext.ImageRead = (PE_COFF_LOADER_READ_FILE) SecImageRead;\r
\r
- Status = gPeiEfiPeiPeCoffLoader->GetImageInfo (gPeiEfiPeiPeCoffLoader, &ImageContext);\r
+ Status = PeCoffLoaderGetImageInfo (&ImageContext);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
ImageContext.ImageAddress += ImageContext.SectionAlignment;\r
ImageContext.ImageAddress &= ~(ImageContext.SectionAlignment - 1);\r
\r
- Status = gPeiEfiPeiPeCoffLoader->LoadImage (gPeiEfiPeiPeCoffLoader, &ImageContext);\r
+ Status = PeCoffLoaderLoadImage (&ImageContext);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
- Status = gPeiEfiPeiPeCoffLoader->RelocateImage (gPeiEfiPeiPeCoffLoader, &ImageContext);\r
+ Status = SecNt32PeCoffRelocateImage (&ImageContext);\r
if (EFI_ERROR (Status)) {\r
return Status;\r
}\r
\r
\r
EFI_STATUS\r
-AddModHandle (\r
- IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext,\r
- IN VOID *ModHandle\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Store the ModHandle in an array indexed by the Pdb File name.\r
- The ModHandle is needed to unload the image. \r
-\r
-Arguments:\r
- ImageContext - Input data returned from PE Laoder Library. Used to find the \r
- .PDB file name of the PE Image.\r
- ModHandle - Returned from LoadLibraryEx() and stored for call to \r
- FreeLibrary().\r
-\r
-Returns:\r
- EFI_SUCCESS - ModHandle was stored. \r
-\r
---*/\r
-{\r
- UINTN Index;\r
- PDB_NAME_TO_MOD_HANDLE *Array;\r
- UINTN PreviousSize;\r
-\r
-\r
- Array = mPdbNameModHandleArray;\r
- for (Index = 0; Index < mPdbNameModHandleArraySize; Index++, Array++) {\r
- if (Array->PdbPointer == NULL) {\r
- //\r
- // Make a copy of the stirng and store the ModHandle\r
- //\r
- Array->PdbPointer = malloc (strlen (ImageContext->PdbPointer) + 1);\r
- ASSERT (Array->PdbPointer != NULL);\r
-\r
- strcpy (Array->PdbPointer, ImageContext->PdbPointer);\r
- Array->ModHandle = ModHandle;\r
- return EFI_SUCCESS;\r
- }\r
- }\r
- \r
- //\r
- // No free space in mPdbNameModHandleArray so grow it by \r
- // MAX_PDB_NAME_TO_MOD_HANDLE_ARRAY_SIZE entires. realloc will\r
- // copy the old values to the new locaiton. But it does\r
- // not zero the new memory area.\r
- //\r
- PreviousSize = mPdbNameModHandleArraySize * sizeof (PDB_NAME_TO_MOD_HANDLE);\r
- mPdbNameModHandleArraySize += MAX_PDB_NAME_TO_MOD_HANDLE_ARRAY_SIZE;\r
-\r
- mPdbNameModHandleArray = realloc (mPdbNameModHandleArray, mPdbNameModHandleArraySize * sizeof (PDB_NAME_TO_MOD_HANDLE));\r
- if (mPdbNameModHandleArray == NULL) {\r
- ASSERT (FALSE);\r
- return EFI_OUT_OF_RESOURCES;\r
- }\r
- \r
- memset (mPdbNameModHandleArray + PreviousSize, 0, MAX_PDB_NAME_TO_MOD_HANDLE_ARRAY_SIZE * sizeof (PDB_NAME_TO_MOD_HANDLE));\r
- \r
- return AddModHandle (ImageContext, ModHandle);\r
-}\r
-\r
-\r
-VOID *\r
-RemoveModeHandle (\r
- IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
- )\r
-/*++\r
-\r
-Routine Description:\r
- Return the ModHandle and delete the entry in the array.\r
-\r
-Arguments:\r
- ImageContext - Input data returned from PE Laoder Library. Used to find the \r
- .PDB file name of the PE Image.\r
-\r
-Returns:\r
- ModHandle - ModHandle assoicated with ImageContext is returned\r
- NULL - No ModHandle associated with ImageContext\r
-\r
---*/\r
-{\r
- UINTN Index;\r
- PDB_NAME_TO_MOD_HANDLE *Array;\r
-\r
- if (ImageContext->PdbPointer == NULL) {\r
- //\r
- // If no PDB pointer there is no ModHandle so return NULL\r
- //\r
- return NULL;\r
- }\r
-\r
- Array = mPdbNameModHandleArray;\r
- for (Index = 0; Index < mPdbNameModHandleArraySize; Index++, Array++) {\r
- if ((Array->PdbPointer != NULL) && (strcmp(Array->PdbPointer, ImageContext->PdbPointer) == 0)) {\r
- //\r
- // If you find a match return it and delete the entry\r
- //\r
- free (Array->PdbPointer);\r
- Array->PdbPointer = NULL;\r
- return Array->ModHandle;\r
- }\r
- }\r
-\r
- return NULL;\r
-}\r
-\r
-\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-SecNt32PeCoffGetImageInfo (\r
- IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This,\r
- IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
- )\r
-{\r
- return PeCoffLoaderGetImageInfo (ImageContext);\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
-SecNt32PeCoffLoadImage (\r
- IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This,\r
- IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
- )\r
-{\r
- return PeCoffLoaderLoadImage (ImageContext);\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r
SecNt32PeCoffRelocateImage (\r
- IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This,\r
IN OUT PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
)\r
{\r
}\r
\r
if ((Library != NULL) && (DllEntryPoint != NULL)) {\r
- AddModHandle (ImageContext, Library);\r
ImageContext->EntryPoint = (EFI_PHYSICAL_ADDRESS) (UINTN) DllEntryPoint;\r
wprintf (L"LoadLibraryEx (%s,\n NULL, DONT_RESOLVE_DLL_REFERENCES)\n", DllFileName);\r
} else {\r
}\r
\r
\r
-EFI_STATUS\r
-EFIAPI\r
-SecNt32PeCoffUnloadimage (\r
- IN EFI_PEI_PE_COFF_LOADER_PROTOCOL *This,\r
- IN PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext\r
- )\r
-{\r
- VOID *ModHandle;\r
\r
- ModHandle = RemoveModeHandle (ImageContext);\r
- if (ModHandle != NULL) {\r
- FreeLibrary (ModHandle);\r
- }\r
- return EFI_SUCCESS;\r
-}\r
\r
VOID\r
_ModuleEntryPoint (\r