2

Windows EFI ブート ローダーであるファイル「bootmgfw.efi」をダウンロード (TFTP) する必要がある UEFI アプリケーションがあります。Mtftp()、LoadImage()、および StartImage() を正常に呼び出して、イメージをダウンロードして実行できます。ただし、Microsoft ブート ローダーは、ネットワーク経由ではなくローカルで実行されていると判断し、必要なファイルを TFTP 経由でダウンロードするのではなく、ローカルで探します。ネットワークからのものであることを認識するようにアプリケーションを生成するにはどうすればよいですか?

私には 2 つのアイデアがありますが、これまでのところ、どちらも機能させることができませんでした。

  1. LoadImage() を呼び出した後、StartImage() を呼び出す前に、新しいイメージの EFI_LOADED_IMAGE を取得して変更する必要があります。ネットワークにロードされていることを示すために DevicePath を変更する必要があると思いますが、これを行う方法がわかりません。

  2. Mtftp() をスキップし、BootPolicy に TRUE を指定して LoadImage() を呼び出します。これでファイルがダウンロードされて読み込まれると思いますが、読み込むファイルを指定する方法がわかりません。LoadImage() に渡された DevicePath にはこれが含まれていると思いますが、DevicePath を作成する方法がわかりません。

このアプリケーションを作成した UEFI 開発者がいましたが、彼は作業を完了する前に会社を去りました。そのため、このコード ベースを取り上げて UEFI を学習し、これを完成させなければなりません。助けてくれてありがとう!

4

1 に答える 1

0

の動作はbootmgfw.efi、ロードする必要があるファイルを、自身がそこからロードされたのと同じパスで常に検索することです。したがって、TFTP 経由でファイルをダウンロードするには、次のようにする必要があります。

  1. ブート アプリケーションで、舞台裏で TFTP を使用してファイルを取得する新しい LoadFile プロトコルを呼び出します。Mtftp()
  2. 「仮想」デバイス パスを作成し、それをこの LoadFile プロトコルに関連付けます
  3. 直接bootmgfw.efi呼び出すのではなく、仮想パスを使用してロードするMtftp()

これを行うbootmgfw.efiと、独自のファイルをロードしようとすると、仮想デバイス パスを使用してロードされるため、最終的に TFTP 経由でダウンロードされます。

DevicePathUtilitiesProtocol を使用して仮想パスを作成できます。独自のアプリケーションのデバイス パスをベース パスとして使用し、それにサブパスを追加できますdevicePathUtilities::AppendDevicePath()

独自のアプリケーションのデバイス パスを取得するには、LoadedImage プロトコルを開いてから、loadedImage の DeviceHandle で DevicePathProtocol を次のように開きます。

EFI_LOADED_IMAGE_PROTOCOL* loadedImage;
EFI_DEVICE_PATH_PROTOCOL *thisImageFilePath;
EFI_DEVICE_PATH_UTILITIES_PROTOCOL *devPathUtilities;

bootServices->OpenProtocol(imageHandle, &gEfiLoadedImageProtocolGuid, &loadedImage, imageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
bootServices->OpenProtocol(loadedImage->DeviceHandle, &gEfiDevicePathProtocolGuid, &thisImageFilePath, imageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);

この時点thisImageFilePathで、独自のアプリケーションのイメージのパスになります。AppendDevicePath() を呼び出し、選択した別のパスを追加して、仮想デバイス パスを取得する必要があります。

新しい LoadFile プロトコルを作成するには、UEFI 仕様を参照してください。

于 2020-10-08T02:02:50.663 に答える