-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
- EFI_STATUS Status;\r
-\r
- Status = PeCoffLoaderGetImageInfo (ImageContext);\r
- if (EFI_ERROR (Status)) {\r
- return Status;\r
- }\r
-\r
- switch (ImageContext->ImageType) {\r
-\r
- case EFI_IMAGE_SUBSYSTEM_EFI_APPLICATION:\r
- ImageContext->ImageCodeMemoryType = EfiLoaderCode;\r
- ImageContext->ImageDataMemoryType = EfiLoaderData;\r
- break;\r
-\r
- case EFI_IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER:\r
- ImageContext->ImageCodeMemoryType = EfiBootServicesCode;\r
- ImageContext->ImageDataMemoryType = EfiBootServicesData;\r
- break;\r
-\r
- case EFI_IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:\r
- case EFI_IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER:\r
- ImageContext->ImageCodeMemoryType = EfiRuntimeServicesCode;\r
- ImageContext->ImageDataMemoryType = EfiRuntimeServicesData;\r
- break;\r
-\r
- default:\r
- ImageContext->ImageError = IMAGE_ERROR_INVALID_SUBSYSTEM;\r
- return RETURN_UNSUPPORTED;\r
- }\r
-\r
- return Status;\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
- EFI_STATUS Status;\r
-\r
- Status = PeCoffLoaderLoadImage (ImageContext);\r
- return Status;\r
-}\r
-\r
-EFI_STATUS\r
-EFIAPI\r