diff options
Diffstat (limited to 'Lesson_9/UefiLessonsPkg')
| -rw-r--r-- | Lesson_9/UefiLessonsPkg/HelloWorld/HelloWorld.c | 15 | ||||
| -rw-r--r-- | Lesson_9/UefiLessonsPkg/HelloWorld/HelloWorld.inf | 18 | ||||
| -rw-r--r-- | Lesson_9/UefiLessonsPkg/ImageHandle/ImageHandle.c | 102 | ||||
| -rw-r--r-- | Lesson_9/UefiLessonsPkg/ImageHandle/ImageHandle.inf | 18 | ||||
| -rw-r--r-- | Lesson_9/UefiLessonsPkg/ImageInfo/ImageInfo.c | 44 | ||||
| -rw-r--r-- | Lesson_9/UefiLessonsPkg/ImageInfo/ImageInfo.inf | 22 | ||||
| -rw-r--r-- | Lesson_9/UefiLessonsPkg/SimplestApp/SimplestApp.c | 10 | ||||
| -rw-r--r-- | Lesson_9/UefiLessonsPkg/SimplestApp/SimplestApp.inf | 16 | ||||
| -rw-r--r-- | Lesson_9/UefiLessonsPkg/UefiLessonsPkg.dsc | 32 | 
9 files changed, 277 insertions, 0 deletions
diff --git a/Lesson_9/UefiLessonsPkg/HelloWorld/HelloWorld.c b/Lesson_9/UefiLessonsPkg/HelloWorld/HelloWorld.c new file mode 100644 index 0000000..1f05899 --- /dev/null +++ b/Lesson_9/UefiLessonsPkg/HelloWorld/HelloWorld.c @@ -0,0 +1,15 @@ +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiLib.h> + +EFI_STATUS +EFIAPI +UefiMain ( +  IN EFI_HANDLE        ImageHandle, +  IN EFI_SYSTEM_TABLE  *SystemTable +  ) +{ +  SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Hello World!\n"); +  gST->ConOut->OutputString(gST->ConOut, L"Hello again!\n"); +  Print(L"Bye!\n"); +  return EFI_SUCCESS; +} diff --git a/Lesson_9/UefiLessonsPkg/HelloWorld/HelloWorld.inf b/Lesson_9/UefiLessonsPkg/HelloWorld/HelloWorld.inf new file mode 100644 index 0000000..d65ca2e --- /dev/null +++ b/Lesson_9/UefiLessonsPkg/HelloWorld/HelloWorld.inf @@ -0,0 +1,18 @@ +[Defines] +  INF_VERSION                    = 1.25 +  BASE_NAME                      = HelloWorld +  FILE_GUID                      = 2e55fa38-f148-42d3-af90-1be247323e30 +  MODULE_TYPE                    = UEFI_APPLICATION +  VERSION_STRING                 = 1.0 +  ENTRY_POINT                    = UefiMain + +[Sources] +  HelloWorld.c + +[Packages] +  MdePkg/MdePkg.dec + +[LibraryClasses] +  UefiApplicationEntryPoint +  UefiLib + diff --git a/Lesson_9/UefiLessonsPkg/ImageHandle/ImageHandle.c b/Lesson_9/UefiLessonsPkg/ImageHandle/ImageHandle.c new file mode 100644 index 0000000..6117243 --- /dev/null +++ b/Lesson_9/UefiLessonsPkg/ImageHandle/ImageHandle.c @@ -0,0 +1,102 @@ +#include <Library/MemoryAllocationLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiLib.h> + +typedef struct { +  UINTN               Signature; +  /// All handles list of IHANDLE +  LIST_ENTRY          AllHandles; +  /// List of PROTOCOL_INTERFACE's for this handle +  LIST_ENTRY          Protocols; +  UINTN               LocateRequest; +  /// The Handle Database Key value when this handle was last created or modified +  UINT64              Key; +} IHANDLE; + +typedef struct { +  UINTN               Signature; +  /// Link Entry inserted to mProtocolDatabase +  LIST_ENTRY          AllEntries; +  /// ID of the protocol +  EFI_GUID            ProtocolID; +  /// All protocol interfaces +  LIST_ENTRY          Protocols; +  /// Registerd notification handlers +  LIST_ENTRY          Notify; +} PROTOCOL_ENTRY; + +typedef struct { +  UINTN                       Signature; +  /// Link on IHANDLE.Protocols +  LIST_ENTRY                  Link; +  /// Back pointer +  IHANDLE                     *Handle; +  /// Link on PROTOCOL_ENTRY.Protocols +  LIST_ENTRY                  ByProtocol; +  /// The protocol ID +  PROTOCOL_ENTRY              *Protocol; +  /// The interface value +  VOID                        *Interface; +  /// OPEN_PROTOCOL_DATA list +  LIST_ENTRY                  OpenList; +  UINTN                       OpenListCount; + +} PROTOCOL_INTERFACE; + + +#define offsetof(a,b) ((INTN)(&(((a*)(0))->b))) + +#define container_of(ptr, type, member) ({                      \ +        const typeof( ((type *)0)->member ) *__mptr = (ptr);    \ +        (type *)( (char *)__mptr - offsetof(type,member) );}) + +EFI_STATUS +EFIAPI +UefiMain ( +  IN EFI_HANDLE        ImageHandle, +  IN EFI_SYSTEM_TABLE  *SystemTable +  ) +{ +  IHANDLE* MyHandle = ImageHandle; +  Print(L"Signature: %c %c %c %c\n", (MyHandle->Signature >>  0) & 0xff, +                                     (MyHandle->Signature >>  8) & 0xff, +                                     (MyHandle->Signature >> 16) & 0xff, +                                     (MyHandle->Signature >> 24) & 0xff); + +  Print(L"Back Protocol Interface Link: %p\n", MyHandle->Protocols.BackLink); +  Print(L"Forward Protocol Interface Link: %p\n", MyHandle->Protocols.ForwardLink); + +  LIST_ENTRY *FirstLink = MyHandle->Protocols.ForwardLink; +  LIST_ENTRY *CurrentLink = FirstLink; +  do { +  	PROTOCOL_INTERFACE* MyProtocolInterface = container_of(CurrentLink, PROTOCOL_INTERFACE, Link); + +        Print(L"\n"); +        Print(L"Current Link: %p\n", CurrentLink); +  	Print(L"Signature: %x %x %x %x\n", (MyProtocolInterface->Signature >>  0) & 0xff, +        	                           (MyProtocolInterface->Signature >>  8) & 0xff, +                	                   (MyProtocolInterface->Signature >> 16) & 0xff, +                        	           (MyProtocolInterface->Signature >> 24) & 0xff); + +  	Print(L"Back Link: %p\n", MyProtocolInterface->Link.BackLink); +	Print(L"Forward Link: %p\n", MyProtocolInterface->Link.ForwardLink); +	Print(L"GUID=%g\n", MyProtocolInterface->Protocol->ProtocolID); +        CurrentLink = MyProtocolInterface->Link.ForwardLink; +  } while (CurrentLink != FirstLink); + +  Print(L"________\n"); +  EFI_GUID **ProtocolGuidArray; +  UINTN ArrayCount; +  EFI_STATUS Status = gBS->ProtocolsPerHandle(ImageHandle, +					      &ProtocolGuidArray, +					      &ArrayCount); + +  if (Status == EFI_SUCCESS) { +    for (int i=0; i<ArrayCount; i++) { +      Print(L"%g\n", ProtocolGuidArray[i]); +    } +    FreePool(ProtocolGuidArray); +  } + +  return EFI_SUCCESS; +} diff --git a/Lesson_9/UefiLessonsPkg/ImageHandle/ImageHandle.inf b/Lesson_9/UefiLessonsPkg/ImageHandle/ImageHandle.inf new file mode 100644 index 0000000..34256ee --- /dev/null +++ b/Lesson_9/UefiLessonsPkg/ImageHandle/ImageHandle.inf @@ -0,0 +1,18 @@ +[Defines] +  INF_VERSION                    = 1.25 +  BASE_NAME                      = ImageHandle +  FILE_GUID                      = b68d3472-70c7-4928-841b-6566032e0a23 +  MODULE_TYPE                    = UEFI_APPLICATION +  VERSION_STRING                 = 1.0 +  ENTRY_POINT                    = UefiMain + +[Sources] +  ImageHandle.c + +[Packages] +  MdePkg/MdePkg.dec + +[LibraryClasses] +  UefiApplicationEntryPoint +  UefiLib + diff --git a/Lesson_9/UefiLessonsPkg/ImageInfo/ImageInfo.c b/Lesson_9/UefiLessonsPkg/ImageInfo/ImageInfo.c new file mode 100644 index 0000000..c45570e --- /dev/null +++ b/Lesson_9/UefiLessonsPkg/ImageInfo/ImageInfo.c @@ -0,0 +1,44 @@ +#include <Library/UefiBootServicesTableLib.h> +#include <Library/UefiLib.h> + +#include <Protocol/LoadedImage.h> +#include <Library/DevicePathLib.h> + +EFI_STATUS +EFIAPI +UefiMain ( +  IN EFI_HANDLE        ImageHandle, +  IN EFI_SYSTEM_TABLE  *SystemTable +  ) +{ +  EFI_STATUS Status; +  EFI_LOADED_IMAGE_PROTOCOL* LoadedImage; + +  Status = gBS->HandleProtocol( +    ImageHandle, +    &gEfiLoadedImageProtocolGuid, +    (VOID **) &LoadedImage +  ); + +  if (Status == EFI_SUCCESS) { +    EFI_DEVICE_PATH_PROTOCOL* DevicePath; + +    Status = gBS->HandleProtocol( +      ImageHandle, +      &gEfiLoadedImageDevicePathProtocolGuid, +      (VOID**) &DevicePath +    ); + +    if (Status == EFI_SUCCESS) { +      Print(L"Image device: %s\n", ConvertDevicePathToText(DevicePath, FALSE, TRUE)); +      Print(L"Image file: %s\n",  ConvertDevicePathToText(LoadedImage->FilePath, FALSE, TRUE));	// EFI_DEVICE_PATH_PROTOCOL *FilePath +      Print(L"Image Base: %X\n", LoadedImage->ImageBase); +      Print(L"Image Size: %X\n", LoadedImage->ImageSize); +    } else { +      Print(L"Can't get EFI_LOADED_IMAGE_PROTOCOL, Status=%r\n", Status); +    } +  } else { +    Print(L"Can't get EFI_DEVICE_PATH_PROTOCOL, Status=%r\n", Status); +  } +  return EFI_SUCCESS; +} diff --git a/Lesson_9/UefiLessonsPkg/ImageInfo/ImageInfo.inf b/Lesson_9/UefiLessonsPkg/ImageInfo/ImageInfo.inf new file mode 100644 index 0000000..0ce54a6 --- /dev/null +++ b/Lesson_9/UefiLessonsPkg/ImageInfo/ImageInfo.inf @@ -0,0 +1,22 @@ +[Defines] +  INF_VERSION                    = 1.25 +  BASE_NAME                      = ImageInfo +  FILE_GUID                      = b68d3472-70c7-4928-841b-6566032e0a23 +  MODULE_TYPE                    = UEFI_APPLICATION +  VERSION_STRING                 = 1.0 +  ENTRY_POINT                    = UefiMain + +[Sources] +  ImageInfo.c + +[Packages] +  MdePkg/MdePkg.dec + +[LibraryClasses] +  UefiApplicationEntryPoint +  UefiLib + +[Protocols] +  gEfiLoadedImageProtocolGuid +  gEfiLoadedImageDevicePathProtocolGuid + diff --git a/Lesson_9/UefiLessonsPkg/SimplestApp/SimplestApp.c b/Lesson_9/UefiLessonsPkg/SimplestApp/SimplestApp.c new file mode 100644 index 0000000..8bdf500 --- /dev/null +++ b/Lesson_9/UefiLessonsPkg/SimplestApp/SimplestApp.c @@ -0,0 +1,10 @@ +EFI_STATUS +EFIAPI +UefiMain ( +  IN EFI_HANDLE        ImageHandle, +  IN EFI_SYSTEM_TABLE  *SystemTable +  ) +{ +  return EFI_SUCCESS; +} + diff --git a/Lesson_9/UefiLessonsPkg/SimplestApp/SimplestApp.inf b/Lesson_9/UefiLessonsPkg/SimplestApp/SimplestApp.inf new file mode 100644 index 0000000..7d4bae2 --- /dev/null +++ b/Lesson_9/UefiLessonsPkg/SimplestApp/SimplestApp.inf @@ -0,0 +1,16 @@ +[Defines] +  INF_VERSION                    = 1.25 +  BASE_NAME                      = SimplestApp +  FILE_GUID                      = 4a298956-fbe0-47fb-ae3a-2d5a0a959a26 +  MODULE_TYPE                    = UEFI_APPLICATION +  VERSION_STRING                 = 1.0 +  ENTRY_POINT                    = UefiMain + +[Sources] +  SimplestApp.c + +[Packages] +  MdePkg/MdePkg.dec + +[LibraryClasses] +  UefiApplicationEntryPoint diff --git a/Lesson_9/UefiLessonsPkg/UefiLessonsPkg.dsc b/Lesson_9/UefiLessonsPkg/UefiLessonsPkg.dsc new file mode 100644 index 0000000..ff2edf6 --- /dev/null +++ b/Lesson_9/UefiLessonsPkg/UefiLessonsPkg.dsc @@ -0,0 +1,32 @@ +[Defines] +  DSC_SPECIFICATION              = 0x0001001C +  PLATFORM_GUID                  = 3db7270f-ffac-4139-90a4-0ae68f3f8167 +  PLATFORM_VERSION               = 0.01 +  PLATFORM_NAME                  = UefiLessonsPkg +  SKUID_IDENTIFIER               = DEFAULT +  SUPPORTED_ARCHITECTURES        = X64 +  BUILD_TARGETS                  = RELEASE + + +[LibraryClasses] +  UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf +  UefiBootServicesTableLib|MdePkg/Library/UefiBootServicesTableLib/UefiBootServicesTableLib.inf +  DebugLib|MdePkg/Library/UefiDebugLibConOut/UefiDebugLibConOut.inf +  BaseLib|MdePkg/Library/BaseLib/BaseLib.inf +  PcdLib|MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf +  BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf +  RegisterFilterLib|MdePkg/Library/RegisterFilterLibNull/RegisterFilterLibNull.inf +  PrintLib|MdePkg/Library/BasePrintLib/BasePrintLib.inf +  DebugPrintErrorLevelLib|MdePkg/Library/BaseDebugPrintErrorLevelLib/BaseDebugPrintErrorLevelLib.inf +  UefiLib|MdePkg/Library/UefiLib/UefiLib.inf +  MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf +  DevicePathLib|MdePkg/Library/UefiDevicePathLib/UefiDevicePathLib.inf +  UefiRuntimeServicesTableLib|MdePkg/Library/UefiRuntimeServicesTableLib/UefiRuntimeServicesTableLib.inf + +[Components] +  UefiLessonsPkg/SimplestApp/SimplestApp.inf +  UefiLessonsPkg/HelloWorld/HelloWorld.inf +  UefiLessonsPkg/ImageHandle/ImageHandle.inf +  UefiLessonsPkg/ImageInfo/ImageInfo.inf + +  | 
