2016-08-05 8 views
0

하지만로드 이미지가 성공하고, startimage가 반환 값 -1/0xffffffff와 함께 실패합니다. 어떤 사람이 몇 가지 아이디어를 제안한다면 그것이 도움이 될 것입니다. 왜 실패하고있는 것입니까? 코드에 실수가 있으면 수정하십시오. 64 비트 시스템에있는 경우loadimage 및 startimage 프로토콜을 사용하여 다른 efi 응용 프로그램에서 efi 응용 프로그램을로드하려고 할 때 startimage()가 UEFI에서 loadimage()를 실행 한 후 -1로 실패했습니다. 다른 응용 프로그램에서 efi 응용 프로그램을로드하는 중

EFI_STATUS LoadPythonBinary() 
{ 
    EFI_STATUS Status; 
    UINTN NumberOfFSHandles; 
    EFI_HANDLE *FSHandles; 
    EFI_GUID SimpleFileSystemGuid = EFI_SIMPLE_FILE_SYSTEM_PROTOCOL_GUID; 
    UINTN Index = 0; 
    EFI_BLOCK_IO *BlkIo; 
    EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FileSysProtocol = NULL; 
    EFI_DEVICE_PATH_PROTOCOL  *FilePath; 
    EFI_HANDLE      ImageHandle2 = NULL; 
// EFI_DEVICE_PATH_PROTOCOL  *DevicePath; 
// EFI_HANDLE      DeviceHandle; 
    EFI_HANDLE   Controller=NULL; 
    EFI_LOADED_IMAGE_PROTOCOL *ImageInfo; 
    EFI_GUID EfiDevicePathProtocolGuid = EFI_DEVICE_PATH_PROTOCOL_GUID; 
    EFI_GUID EfiBlockIoProtocolGuid = EFI_BLOCK_IO_PROTOCOL_GUID; 
    const CHAR16 *FileName = L"Python.efi"; 
    EFI_GUID EfiLoadedImageProtocol = EFI_LOADED_IMAGE_PROTOCOL_GUID; 
// EFI_LOADED_IMAGE_PROTOCOL *LoadedImage; 
    char temp[MAX_PATH]; 
    CHAR16 CmdLineParams[MAX_PATH] = L"fs0:\\GK\\Temp\\UnzipBuildTools.py fs0:\\GK\\Temp\\EFI.zip fs0:\\Test"; 
    strcpy(temp,(const char *)StrDup16to8(CmdLineParams)); 

    Status = gBS->LocateHandleBuffer(ByProtocol, &SimpleFileSystemGuid,NULL, &NumberOfFSHandles, &FSHandles); 
    if(!EFI_ERROR(Status)) 
    { 
     for(Index = 0; Index < NumberOfFSHandles; Index++) 
     { 
      Status = gBS->HandleProtocol(FSHandles[Index], &SimpleFileSystemGuid, &BlkIo); 
      if(!EFI_ERROR(Status)) 
      { 
        FilePath = FileDevicePath(FSHandles[Index],FileName); 
        Status = gBS->LoadImage(TRUE, gImageHandle, FilePath, NULL, 0, &ImageHandle2); 
        printf("Load Image Status = %x", Status); 
        if(!EFI_ERROR(Status)) 
        { 
         printf("Image Loaded Successfully\n"); 
         Status = gBS->HandleProtocol(ImageHandle2, &EfiLoadedImageProtocol,(VOID**)&ImageInfo); 
         if(!EFI_ERROR(Status)) 
         { 
          if(ImageInfo->ImageCodeType == EfiLoaderCode) 
          { 
           gBS->FreePool(FilePath); 
          } 
          printf("Options :%s\n",temp); 
          printf("LoadedImage->ImageSize = %x", ImageInfo->ImageSize); 
          ImageInfo->LoadOptions = CmdLineParams; 
          ImageInfo->LoadOptionsSize = (UINT32)(wcslen(CmdLineParams)); 
          ImageInfo->DeviceHandle = gImageHandle; 
         } 
        } 

        printf("About to start image\n"); 
        Status = gBS->StartImage(ImageHandle2, NULL, NULL); 
        printf("StartImage Status = %x", Status); 
        if(!EFI_ERROR(Status)) 
        { 
         printf("StartImage success\n"); 
         break; 
        } 
      } 
     } 
    } 

return Status; 
} 

답변

0

-1 EFI_STATUS 64 비트입니다 유효한 EFI_STATUS하지 않습니다. 또한 Print()를 사용하면 % r은 EFI_STATUS에 대한 문자열을 출력합니다. ImageHandle 중 하나 잘못된 이미지 핸들 또는 이미지가 이미 StartImage와

EFI_SECURITY_VIOLATION를 초기화되었습니다 - - 현재의 플랫폼 정책은 그 이미지가해야 지정 EFI 서비스에서 반환

EFI_STATUS 값은 EFI Spec: EFI_INVALID_PARAMETER에서 정의 할 수 있습니다 시작하지 마라.

이미지의 종료 코드 - 이미지의 종료 코드

로드 한 코드가 오류를 반환 했습니까?

+0

이 질문에 대한 답변보다 의견이 더 많이 느껴집니다. – jdv

+0

유효한 EFI_STATUS가 문제를 디버그하는 데 도움이되는 방법을 지적했습니다. –

1

가능한 문제 : 아마 당신의 목표 이미지 (Python.efi는) 유효한 UEFI 응용 프로그램이 아닙니다 및 EFI_BOOT_SERVICES.StartImage() 인터페이스에 의해로드 할 수 없습니다. 자세한 내용은 UEFI 부팅 서비스로로드 할 수있는 유효한 유형의 UEFI 이미지를 참조하십시오. 세션 7.4는 UEFI Spec 2.7입니다.

솔루션 :

: .inf 파일 대상 응용 프로그램, MODULE_TYPEUEFI_APPLICATION하고 .c 파일로 구성되어 현장에서 유사한 UEFI 응용 프로그램에 대한 진입 점 서명이 있는지 확인
EFI_STATUS 
EFIAPI 
MyEntryPointName (
    IN EFI_HANDLE  ImageHandle, 
    IN EFI_SYSTEM_TABLE *SystemTable 
    ) 
{ 
... 
} 

기능 코드 예제는 LoadImageApp에서 참조 할 수 있습니다. 이 응용 프로그램은 HelloImageEntryPoint.efi이라는 대상 응용 프로그램을로드하고 시작합니다.