X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=MdePkg%2FLibrary%2FBasePeCoffGetEntryPointLib%2FPeCoffGetEntryPoint.c;h=b740bd6e7c4a007448d65ec192e9ac01354953f4;hb=cd14fe3dcf9445a2b3c9e8e3eef78c23c4d2b7cd;hp=d5ff7db009a5e198c1ebec392066c65d723f99dd;hpb=f0147869353782c3413148bbccc1925ed2ade622;p=mirror_edk2.git diff --git a/MdePkg/Library/BasePeCoffGetEntryPointLib/PeCoffGetEntryPoint.c b/MdePkg/Library/BasePeCoffGetEntryPointLib/PeCoffGetEntryPoint.c index d5ff7db009..b740bd6e7c 100644 --- a/MdePkg/Library/BasePeCoffGetEntryPointLib/PeCoffGetEntryPoint.c +++ b/MdePkg/Library/BasePeCoffGetEntryPointLib/PeCoffGetEntryPoint.c @@ -17,38 +17,49 @@ /** - Loads a PE/COFF image into memory. + Retrieves and returns a pointer to the entry point to a PE/COFF image that has been loaded + into system memory with the PE/COFF Loader Library functions. - @param Pe32Data Pointer to a PE/COFF Image - - @param EntryPoint Pointer to the entry point of the PE/COFF image + Retrieves the entry point to the PE/COFF image specified by Pe32Data and returns this entry + point in EntryPoint. If the entry point could not be retrieved from the PE/COFF image, then + return RETURN_INVALID_PARAMETER. Otherwise return RETURN_SUCCESS. + If Pe32Data is NULL, then ASSERT(). + If EntryPoint is NULL, then ASSERT(). - @retval EFI_SUCCESS if the EntryPoint was returned - @retval EFI_INVALID_PARAMETER if the EntryPoint could not be found from Pe32Data + @param Pe32Data Pointer to the PE/COFF image that is loaded in system memory. + @param EntryPoint Pointer to entry point to the PE/COFF image to return. + + @retval RETURN_SUCCESS EntryPoint was returned. + @retval RETURN_INVALID_PARAMETER The entry point could not be found in the PE/COFF image. **/ RETURN_STATUS EFIAPI PeCoffLoaderGetEntryPoint ( - IN VOID *Pe32Data, - IN OUT VOID **EntryPoint + IN VOID *Pe32Data, + OUT VOID **EntryPoint ) { EFI_IMAGE_DOS_HEADER *DosHeader; EFI_IMAGE_NT_HEADERS *PeHeader; + ASSERT (Pe32Data != NULL); + ASSERT (EntryPoint != NULL); + DosHeader = (EFI_IMAGE_DOS_HEADER *)Pe32Data; + if (DosHeader->e_magic == EFI_IMAGE_DOS_SIGNATURE) { // - // DOS image header is present, so read the PE header after the DOS image header + // DOS image header is present, so read the PE header after the DOS image header. // PeHeader = (EFI_IMAGE_NT_HEADERS *) ((UINTN) Pe32Data + (UINTN) ((DosHeader->e_lfanew) & 0x0ffff)); } else { // - // DOS image header is not present, so PE header is at the image base + // DOS image header is not present, so PE header is at the image base. // PeHeader = (EFI_IMAGE_NT_HEADERS *) Pe32Data; } + *EntryPoint = (VOID *) ((UINTN) Pe32Data + (UINTN) (PeHeader->OptionalHeader.AddressOfEntryPoint & 0x0ffffffff)); return RETURN_SUCCESS; }