Remove the prototype of internal functions to avoid the sync efforts.

git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@5861 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
qhuang8 2008-09-09 05:36:40 +00:00
parent 130f16022c
commit c0a23f8c37
3 changed files with 171 additions and 261 deletions

View File

@ -161,90 +161,6 @@ CoreCloseImageFile (
IN IMAGE_FILE_HANDLE *ImageFileHandle
);
//
// Image processing worker functions
//
/**
Search a handle to a device on a specified device path that supports a specified protocol,
interface of that protocol on that handle is another output.
@param Protocol The protocol to search for
@param FilePath The specified device path
@param Interface Interface of the protocol on the handle
@param Handle The handle to the device on the specified device
path that supports the protocol.
@return Status code.
**/
EFI_STATUS
CoreDevicePathToInterface (
IN EFI_GUID *Protocol,
IN EFI_DEVICE_PATH_PROTOCOL **FilePath,
OUT VOID **Interface,
OUT EFI_HANDLE *Handle
);
/**
Loads, relocates, and invokes a PE/COFF image
@param BootPolicy If TRUE, indicates that the request originates
from the boot manager, and that the boot
manager is attempting to load FilePath as a
boot selection.
@param Pe32Handle The handle of PE32 image
@param Image PE image to be loaded
@param DstBuffer The buffer to store the image
@param EntryPoint A pointer to the entry point
@param Attribute The bit mask of attributes to set for the load
PE image
@retval EFI_SUCCESS The file was loaded, relocated, and invoked
@retval EFI_OUT_OF_RESOURCES There was not enough memory to load and
relocate the PE/COFF file
@retval EFI_INVALID_PARAMETER Invalid parameter
@retval EFI_BUFFER_TOO_SMALL Buffer for image is too small
**/
EFI_STATUS
CoreLoadPeImage (
IN BOOLEAN BootPolicy,
IN VOID *Pe32Handle,
IN LOADED_IMAGE_PRIVATE_DATA *Image,
IN EFI_PHYSICAL_ADDRESS DstBuffer OPTIONAL,
OUT EFI_PHYSICAL_ADDRESS *EntryPoint OPTIONAL,
IN UINT32 Attribute
);
/**
Get the image's private data from its handle.
@param ImageHandle The image handle
@return Return the image private data associated with ImageHandle.
**/
LOADED_IMAGE_PRIVATE_DATA *
CoreLoadedImageInfo (
IN EFI_HANDLE ImageHandle
);
/**
Unloads EFI image from memory.
@param Image EFI image
@param FreePage Free allocated pages
**/
VOID
CoreUnloadAndCloseImage (
IN LOADED_IMAGE_PRIVATE_DATA *Image,
IN BOOLEAN FreePage
);
//

View File

@ -566,6 +566,147 @@ CoreLoadedImageInfo (
}
/**
Unloads EFI image from memory.
@param Image EFI image
@param FreePage Free allocated pages
**/
VOID
CoreUnloadAndCloseImage (
IN LOADED_IMAGE_PRIVATE_DATA *Image,
IN BOOLEAN FreePage
)
{
EFI_STATUS Status;
UINTN HandleCount;
EFI_HANDLE *HandleBuffer;
UINTN HandleIndex;
EFI_GUID **ProtocolGuidArray;
UINTN ArrayCount;
UINTN ProtocolIndex;
EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfo;
UINTN OpenInfoCount;
UINTN OpenInfoIndex;
if (Image->Ebc != NULL) {
//
// If EBC protocol exists we must perform cleanups for this image.
//
Image->Ebc->UnloadImage (Image->Ebc, Image->Handle);
}
//
// Unload image, free Image->ImageContext->ModHandle
//
PeCoffLoaderUnloadImage (&Image->ImageContext);
//
// Free our references to the image handle
//
if (Image->Handle != NULL) {
Status = CoreLocateHandleBuffer (
AllHandles,
NULL,
NULL,
&HandleCount,
&HandleBuffer
);
if (!EFI_ERROR (Status)) {
for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {
Status = CoreProtocolsPerHandle (
HandleBuffer[HandleIndex],
&ProtocolGuidArray,
&ArrayCount
);
if (!EFI_ERROR (Status)) {
for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {
Status = CoreOpenProtocolInformation (
HandleBuffer[HandleIndex],
ProtocolGuidArray[ProtocolIndex],
&OpenInfo,
&OpenInfoCount
);
if (!EFI_ERROR (Status)) {
for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {
if (OpenInfo[OpenInfoIndex].AgentHandle == Image->Handle) {
Status = CoreCloseProtocol (
HandleBuffer[HandleIndex],
ProtocolGuidArray[ProtocolIndex],
Image->Handle,
OpenInfo[OpenInfoIndex].ControllerHandle
);
}
}
if (OpenInfo != NULL) {
CoreFreePool(OpenInfo);
}
}
}
if (ProtocolGuidArray != NULL) {
CoreFreePool(ProtocolGuidArray);
}
}
}
if (HandleBuffer != NULL) {
CoreFreePool (HandleBuffer);
}
}
CoreRemoveDebugImageInfoEntry (Image->Handle);
Status = CoreUninstallProtocolInterface (
Image->Handle,
&gEfiLoadedImageDevicePathProtocolGuid,
Image->LoadedImageDevicePath
);
Status = CoreUninstallProtocolInterface (
Image->Handle,
&gEfiLoadedImageProtocolGuid,
&Image->Info
);
}
if (Image->RuntimeData != NULL) {
if (Image->RuntimeData->Link.ForwardLink != NULL) {
//
// Remove the Image from the Runtime Image list as we are about to Free it!
//
RemoveEntryList (&Image->RuntimeData->Link);
}
CoreFreePool (Image->RuntimeData);
}
//
// Free the Image from memory
//
if ((Image->ImageBasePage != 0) && FreePage) {
CoreFreePages (Image->ImageBasePage, Image->NumberOfPages);
}
//
// Done with the Image structure
//
if (Image->Info.FilePath != NULL) {
CoreFreePool (Image->Info.FilePath);
}
if (Image->LoadedImageDevicePath != NULL) {
CoreFreePool (Image->LoadedImageDevicePath);
}
if (Image->FixupData != NULL) {
CoreFreePool (Image->FixupData);
}
CoreFreePool (Image);
}
/**
Loads an EFI image into memory and returns a handle to the image.
@ -1102,151 +1243,6 @@ CoreStartImage (
return Status;
}
/**
Unloads EFI image from memory.
@param Image EFI image
@param FreePage Free allocated pages
**/
VOID
CoreUnloadAndCloseImage (
IN LOADED_IMAGE_PRIVATE_DATA *Image,
IN BOOLEAN FreePage
)
{
EFI_STATUS Status;
UINTN HandleCount;
EFI_HANDLE *HandleBuffer;
UINTN HandleIndex;
EFI_GUID **ProtocolGuidArray;
UINTN ArrayCount;
UINTN ProtocolIndex;
EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfo;
UINTN OpenInfoCount;
UINTN OpenInfoIndex;
if (Image->Ebc != NULL) {
//
// If EBC protocol exists we must perform cleanups for this image.
//
Image->Ebc->UnloadImage (Image->Ebc, Image->Handle);
}
//
// Unload image, free Image->ImageContext->ModHandle
//
PeCoffLoaderUnloadImage (&Image->ImageContext);
//
// Free our references to the image handle
//
if (Image->Handle != NULL) {
Status = CoreLocateHandleBuffer (
AllHandles,
NULL,
NULL,
&HandleCount,
&HandleBuffer
);
if (!EFI_ERROR (Status)) {
for (HandleIndex = 0; HandleIndex < HandleCount; HandleIndex++) {
Status = CoreProtocolsPerHandle (
HandleBuffer[HandleIndex],
&ProtocolGuidArray,
&ArrayCount
);
if (!EFI_ERROR (Status)) {
for (ProtocolIndex = 0; ProtocolIndex < ArrayCount; ProtocolIndex++) {
Status = CoreOpenProtocolInformation (
HandleBuffer[HandleIndex],
ProtocolGuidArray[ProtocolIndex],
&OpenInfo,
&OpenInfoCount
);
if (!EFI_ERROR (Status)) {
for (OpenInfoIndex = 0; OpenInfoIndex < OpenInfoCount; OpenInfoIndex++) {
if (OpenInfo[OpenInfoIndex].AgentHandle == Image->Handle) {
Status = CoreCloseProtocol (
HandleBuffer[HandleIndex],
ProtocolGuidArray[ProtocolIndex],
Image->Handle,
OpenInfo[OpenInfoIndex].ControllerHandle
);
}
}
if (OpenInfo != NULL) {
CoreFreePool(OpenInfo);
}
}
}
if (ProtocolGuidArray != NULL) {
CoreFreePool(ProtocolGuidArray);
}
}
}
if (HandleBuffer != NULL) {
CoreFreePool (HandleBuffer);
}
}
CoreRemoveDebugImageInfoEntry (Image->Handle);
Status = CoreUninstallProtocolInterface (
Image->Handle,
&gEfiLoadedImageDevicePathProtocolGuid,
Image->LoadedImageDevicePath
);
Status = CoreUninstallProtocolInterface (
Image->Handle,
&gEfiLoadedImageProtocolGuid,
&Image->Info
);
}
if (Image->RuntimeData != NULL) {
if (Image->RuntimeData->Link.ForwardLink != NULL) {
//
// Remove the Image from the Runtime Image list as we are about to Free it!
//
RemoveEntryList (&Image->RuntimeData->Link);
}
CoreFreePool (Image->RuntimeData);
}
//
// Free the Image from memory
//
if ((Image->ImageBasePage != 0) && FreePage) {
CoreFreePages (Image->ImageBasePage, Image->NumberOfPages);
}
//
// Done with the Image structure
//
if (Image->Info.FilePath != NULL) {
CoreFreePool (Image->Info.FilePath);
}
if (Image->LoadedImageDevicePath != NULL) {
CoreFreePool (Image->LoadedImageDevicePath);
}
if (Image->FixupData != NULL) {
CoreFreePool (Image->FixupData);
}
CoreFreePool (Image);
}
/**
Terminates the currently loaded EFI image and returns control to boot services.

View File

@ -14,6 +14,36 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#include "DxeMain.h"
/**
Search a handle to a device on a specified device path that supports a specified protocol,
interface of that protocol on that handle is another output.
@param Protocol The protocol to search for
@param FilePath The specified device path
@param Interface Interface of the protocol on the handle
@param Handle The handle to the device on the specified device
path that supports the protocol.
@return Status code.
**/
EFI_STATUS
CoreDevicePathToInterface (
IN EFI_GUID *Protocol,
IN EFI_DEVICE_PATH_PROTOCOL **FilePath,
OUT VOID **Interface,
OUT EFI_HANDLE *Handle
)
{
EFI_STATUS Status;
Status = CoreLocateDevicePath (Protocol, FilePath, Handle);
if (!EFI_ERROR (Status)) {
Status = CoreHandleProtocol (*Handle, Protocol, Interface);
}
return Status;
}
/**
Opens a file for (simple) reading. The simple read abstraction
@ -377,38 +407,6 @@ CoreReadImageFile (
return EFI_SUCCESS;
}
/**
Search a handle to a device on a specified device path that supports a specified protocol,
interface of that protocol on that handle is another output.
@param Protocol The protocol to search for
@param FilePath The specified device path
@param Interface Interface of the protocol on the handle
@param Handle The handle to the device on the specified device
path that supports the protocol.
@return Status code.
**/
EFI_STATUS
CoreDevicePathToInterface (
IN EFI_GUID *Protocol,
IN EFI_DEVICE_PATH_PROTOCOL **FilePath,
OUT VOID **Interface,
OUT EFI_HANDLE *Handle
)
{
EFI_STATUS Status;
Status = CoreLocateDevicePath (Protocol, FilePath, Handle);
if (!EFI_ERROR (Status)) {
Status = CoreHandleProtocol (*Handle, Protocol, Interface);
}
return Status;
}
/**
Helper function called as part of the code needed
to allocate the proper sized buffer for various