Your requirement doesn't need any PCD knowledge.
I think all you need to do:
1. Study to know how to embedded a binary to your PE image
    a). Either by converting that binary to a big C array
    b). Or by creating a new resource section, including that binary
2. In your entrypoint of the wrapper PE image,
    a). either decompressing that C array to a bigger buffer containing PE image
    b). or extracting the binary from PE section, decompressing it.

3. In your entrypoint of the wrapper PE image,
    Use BS.LoadImage/StartImage to execute that  PE image.

Thanks/Ray

> -----Original Message-----
> From: edk2-devel [mailto:edk2-devel-boun...@lists.01.org] On Behalf Of
> Rafael Machado
> Sent: Thursday, December 21, 2017 1:32 AM
> To: Ni, Ruiyu <ruiyu...@intel.com>
> Cc: edk2-devel@lists.01.org
> Subject: Re: [edk2] UEFI App embedded on another uefi app
> 
> Hi Ruiyu
> 
> Thanks for the answer.
> The case is similar. The only difference is that we are not allowed to use
> some external code besides the UDK references and modules.
> 
> This is why we're trying to find a way to embed a binary on another one.
> 
> I did some tests here but I have a question.
> 
> Is it possible to create a PCD that points to an embedded binary?
> For example. At the MdeModulePkg/Application/HelloWorld/HelloWorld.c
> we have some example of how to access a string that is declared at the .dec
> and and filled at the .uni:
> 
> Print ((CHAR16*)PcdGetPtr (PcdHelloWorldPrintString));
> 
> I was able to compile this application adding the Logo.bmp to the
> HelloWorld.inf file, just to check how this would work.
> 
> So the question is. How could I create a PCD that points to a binary that is
> added to a .efi?
> 
> Based on the code I believe the only what to do that is creating a .fdf and
> setting the PCD to point to the binary, on the same way it's done with the:
> 
> MdeModulePkg\Logo\Logo.inf
> CorebootPayloadPkg\CorebootPayloadPkg.fdf
> 
> The problem is that at our case, we need to have a single .efi that has an
> embedded binary.
> 
> Any idea on how to do that? (Not sure if this is to intrusive for the PE 
> format.
> Still learning this)
> 
> Thanks and Regards
> Rafael R. Machado
> 
> Em seg, 18 de dez de 2017 às 03:13, Ni, Ruiyu <ruiyu...@intel.com> escreveu:
> 
> > On 12/15/2017 7:45 PM, Rafael Machado wrote:
> > > Hi Everyone.
> > >
> > > I have a limited space problem at a project.
> > > To solve this we had an idea, but would like to ask to you before
> > expending
> > > time on trying to do it, due to some tight schedule. (We know that
> > > the
> > best
> > > is to try before ask, but we do not have time for that now. Sorry
> > > for
> > that.)
> > >
> > > The idea is to create a kind of DecompressorApp.efi, that uses
> > > EFI_DECOMPRESS_PROTOCOL
> > >
> > > During the compilation process of the application the tasks would be:
> > >
> > > - Compile App.efi
> > > - Compress App.efi, generating the App.efi.compressed (using
> > > tianoCompress.exe)
> > > - Compile the Decompressor.efi app (with the App.efi.compressed
> embedded)
> > >         - The idea to do this is to add the compressed app as a
> > > Binary at the DecompressorApp.efi .inf file using the [Binaries] tag
> > >
> > >
> > > So during the entrypoint of the Decompressor.efi app, the
> > > application
> > will
> > > need to copy the compressed part of the app (App.efi.compressed), to
> > > a buffer, and after that this buffer will be decompressed using the
> > > EFI_DECOMPRESS_PROTOCOL. Finally the execution control is passed to
> > > the App.efi decompressed (not sure how to do that yet).
> > >
> > > So the questions we have for know are:
> > >
> > > - How to detect the App.efi.compressed insyde the loaded app, so we
> > > can have an address to decompress
> > Is your usage case similar to the upx?
> >
> > If the App.efi is compressed and embedded as binary in the
> > application, the application itself should know that the binary should
> > be decompressed and executed.
> >
> >
> > > - How to pass the application executions control to another app,
> > > that is
> > in
> > > a buffer (not sure if this can be done with the EFI Boot Service
> > > LoadImage(), since this buffer does not have a valid file device
> > > path)
> > Yes you could use LoadImage(). The API also accepts a PE buffer to load.
> > Then you could use StartImage() to execute the PE buffer.
> > Make sure you use the correct entrypoint prototype for the PE buffer.
> > typedef
> > EFI_STATUS
> > (EFIAPI *EFI_IMAGE_ENTRY_POINT)(
> >    IN  EFI_HANDLE                   ImageHandle,
> >    IN  EFI_SYSTEM_TABLE             *SystemTable
> >    );
> >
> > >
> > > Could you help us on understanding if this is possible?
> > >
> > > Thanks and Regards
> > > Rafael R. Machado
> > > _______________________________________________
> > > edk2-devel mailing list
> > > edk2-devel@lists.01.org
> > > https://lists.01.org/mailman/listinfo/edk2-devel
> > >
> >
> >
> > --
> > Thanks,
> > Ray
> >
> _______________________________________________
> edk2-devel mailing list
> edk2-devel@lists.01.org
> https://lists.01.org/mailman/listinfo/edk2-devel
_______________________________________________
edk2-devel mailing list
edk2-devel@lists.01.org
https://lists.01.org/mailman/listinfo/edk2-devel

Reply via email to