diff options
Diffstat (limited to 'Lesson_19')
25 files changed, 0 insertions, 1035 deletions
diff --git a/Lesson_19/BootManager.png b/Lesson_19/BootManager.png Binary files differdeleted file mode 100644 index 30e4885..0000000 --- a/Lesson_19/BootManager.png +++ /dev/null diff --git a/Lesson_19/Conf/target.txt b/Lesson_19/Conf/target.txt deleted file mode 100644 index c109dcf..0000000 --- a/Lesson_19/Conf/target.txt +++ /dev/null @@ -1,7 +0,0 @@ -ACTIVE_PLATFORM = UefiLessonsPkg/UefiLessonsPkg.dsc
-TARGET = RELEASE
-TARGET_ARCH = X64
-TOOL_CHAIN_CONF = Conf/tools_def.txt
-TOOL_CHAIN_TAG = GCC5
-BUILD_RULE_CONF = Conf/build_rule.txt
-
diff --git a/Lesson_19/README.md b/Lesson_19/README.md deleted file mode 100644 index 65e5cb2..0000000 --- a/Lesson_19/README.md +++ /dev/null @@ -1,186 +0,0 @@ -In this lesson we would be messing with the NVRAM variables (BIOS settings), i.e. variables that are persistent between boots. - -As you remember after OVMF build we have these files: -``` -$ ls -l Build/OvmfX64/RELEASE_GCC5/FV/OVMF* --rw-r--r-- 1 kostr kostr 4194304 Jun 25 14:40 Build/OvmfX64/RELEASE_GCC5/FV/OVMF.fd --rw-r--r-- 1 kostr kostr 3653632 Jun 25 14:40 Build/OvmfX64/RELEASE_GCC5/FV/OVMF_CODE.fd --rw-r--r-- 1 kostr kostr 540672 Jun 25 14:38 Build/OvmfX64/RELEASE_GCC5/FV/OVMF_VARS.fd -``` -- `OVMF_CODE.fd` - code image (read-only) -- `OVMF_VARS.fd` - NVRAM variables image (read-write) -- `OVMF.fd` - combined image (`OVMF_CODE.fd` + `OVMF_VARS.fd`) - -We can boot QEMU either with: -``` -$ qemu-system-x86_64 -drive if=pflash,format=raw,file=Build/OvmfX64/RELEASE_GCC5/FV/OVMF.fd \ - ... -``` -or with -``` -$ qemu-system-x86_64 -drive if=pflash,format=raw,readonly,file=Build/OvmfX64/RELEASE_GCC5/FV/OVMF_CODE.fd \ - -drive if=pflash,format=raw,file=Build/OvmfX64/RELEASE_GCC5/FV/OVMF_VARS.fd \ - ... -``` - -It was fine to use short form earlier, but in this lesson we would modify NVRAM variables, so it is best to use full form with a separate copy of `OVMF_VARS.fd`, so you could always revert things to their initial state. - -Let's undo our modifications to the `OvmfPkg` package and rebuild it: -``` -$ git restore OvmfPkg -$ build --platform=OvmfPkg/OvmfPkgX64.dsc --arch=X64 --buildtarget=RELEASE --tagname=GCC5 -``` - -After that create a backup copy of `OVMF_VARS.fd` and run QEMU with it: -``` -$ cp Build/OvmfX64/RELEASE_GCC5/FV/OVMF_VARS.fd ../ -$ qemu-system-x86_64 -drive if=pflash,format=raw,readonly,file=Build/OvmfX64/RELEASE_GCC5/FV/OVMF_CODE.fd \ - -drive if=pflash,format=raw,file=../OVMF_VARS.fd \ - -drive format=raw,file=fat:rw:~/UEFI_disk \ - -nographic \ - -net none -``` - -Check boot variables with the help of `bcfg boot dump`: -``` -Shell> bcfg boot dump -Option: 00. Variable: Boot0000 - Desc - UiApp - DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(462CAA21-7614-4503-836E-8AB6F4662331) - OVMF_VARS.fdiOptional- N -Option: 01. Variable: Boot0001 - Desc - UEFI QEMU DVD-ROM QM00003 - DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0) - Optional- Y -Option: 02. Variable: Boot0002 - Desc - UEFI QEMU HARDDISK QM00001 - DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0) - Optional- Y -Option: 03. Variable: Boot0003 - Desc - EFI Internal Shell - DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1) - Optional- N -``` - -Besides showing boot options `bcfg` command can add/remove boot options or change their order. -You can check out help for `bcfg` via: -``` -bcfg -? -b -``` - -Now let's try to add our `InteractiveApp.efi` to the boot options. - -``` -Shell> fs0: -FS0:\> bcfg boot add 4 InteractiveApp.efi "Interactive app" -Target = 0004. -bcfg: Add Boot0004 as 4 -FS0:\> bcfg boot dump -Option: 00. Variable: Boot0000 - Desc - UiApp - DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(462CAA21-7614-4503-836E-8AB6F4662331) - Optional- N -Option: 01. Variable: Boot0001 - Desc - UEFI QEMU DVD-ROM QM00003 - DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0) - Optional- Y -Option: 02. Variable: Boot0002 - Desc - UEFI QEMU HARDDISK QM00001 - DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0) - Optional- Y -Option: 03. Variable: Boot0003 - Desc - EFI Internal Shell - DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1) - Optional- N -Option: 04. Variable: Boot0004 - Desc - Interactive app - DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,MBR,0xBE1AFDFA,0x3F,0xFBFC1)/\InteractiveApp.efi - Optional- N -``` - -Now if you navigate to the `Boot Manager` you'll see our app: -![Boot Manager](BootManager.png?raw=true "Boot manager") - -As soon as you don't change `OVMF_VARS.fd` this option would be present even between QEMU restarts. - -We can go further and even place our app as a first boot source: -``` -Shell> bcfg boot mv 4 0 -Shell> bcfg boot dump -Option: 00. Variable: Boot0004 - Desc - Interactive app - DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,MBR,0xBE1AFDFA,0x3F,0xFBFC1)/\InteractiveApp.efi - Optional- N -Option: 01. Variable: Boot0000 - Desc - UiApp - DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(462CAA21-7614-4503-836E-8AB6F4662331) - Optional- N -Option: 02. Variable: Boot0001 - Desc - UEFI QEMU DVD-ROM QM00003 - DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0) - Optional- Y -Option: 03. Variable: Boot0002 - Desc - UEFI QEMU HARDDISK QM00001 - DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0) - Optional- Y -Option: 04. Variable: Boot0003 - Desc - EFI Internal Shell - DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1) - Optional- N -``` - -Now if you reboot UEFI shell with a `reset` command, or rerun QEMU, you will need to pass our app before you can go to the BIOS menu: -``` -BdsDxe: loading Boot0004 "Interactive app" from PciRoot(0x0)/Pci(0x1,0x1)/Ata(Primary,Master,0x0)/HD(1,MBR,0xBE1AFDFA,0x3F,0xFBFC1)/\InteractiveApp.efi -BdsDxe: starting Boot0004 "Interactive app" from PciRoot(0x0)/Pci(0x1,0x1)/Ata(Primary,Master,0x0)/HD(1,MBR,0xBE1AFDFA,0x3F,0xFBFC1)/\InteractiveApp.efi -Try to guess the secret symbol! -``` - -Input correct symbol, go to the `Boot manager` menu and run UEFI shell so we could delete our app from the boot sources: -``` -FS0:\> bcfg boot dump -Option: 00. Variable: Boot0004 - Desc - Interactive app - DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0)/HD(1,MBR,0xBE1AFDFA,0x3F,0xFBFC1)/\InteractiveApp.efi - Optional- N -Option: 01. Variable: Boot0000 - Desc - UiApp - DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(462CAA21-7614-4503-836E-8AB6F4662331) - Optional- N -Option: 02. Variable: Boot0001 - Desc - UEFI QEMU DVD-ROM QM00003 - DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0) - Optional- Y -Option: 03. Variable: Boot0002 - Desc - UEFI QEMU HARDDISK QM00001 - DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0) - Optional- Y -Option: 04. Variable: Boot0003 - Desc - EFI Internal Shell - DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1) - Optional- N - -FS0:\> bcfg boot rm 0 - -FS0:\> bcfg boot dump -Option: 00. Variable: Boot0000 - Desc - UiApp - DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(462CAA21-7614-4503-836E-8AB6F4662331) - Optional- N -Option: 01. Variable: Boot0001 - Desc - UEFI QEMU DVD-ROM QM00003 - DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0) - Optional- Y -Option: 02. Variable: Boot0002 - Desc - UEFI QEMU HARDDISK QM00001 - DevPath - PciRoot(0x0)/Pci(0x1,0x1)/Ata(0x0) - Optional- Y -Option: 03. Variable: Boot0003 - Desc - EFI Internal Shell - DevPath - Fv(7CB8BDC9-F8EB-4F34-AAEA-3EE4AF6516A1)/FvFile(7C04A583-9E3E-4F1C-AD65-E05268D0B4D1) - Optional- N -``` - - - - diff --git a/Lesson_19/UefiLessonsPkg/GOPInfo/GOPInfo.c b/Lesson_19/UefiLessonsPkg/GOPInfo/GOPInfo.c deleted file mode 100644 index b13aa6c..0000000 --- a/Lesson_19/UefiLessonsPkg/GOPInfo/GOPInfo.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <Library/UefiBootServicesTableLib.h> -#include <Library/UefiLib.h> - -INTN EFIAPI ShellAppMain(IN UINTN Argc, IN CHAR16 **Argv) -{ -// SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Hello World!\n"); - gST->ConOut->OutputString(gST->ConOut, L"Hello again!\n"); - Print(L"Bye!\n"); - - for (UINTN i=Argc; i>0; i--) { - Print(L"Arg[%d]=%s\n", Argc-i, Argv[Argc-i]); - } - return 0; -} diff --git a/Lesson_19/UefiLessonsPkg/GOPInfo/GOPInfo.inf b/Lesson_19/UefiLessonsPkg/GOPInfo/GOPInfo.inf deleted file mode 100644 index 9bdd773..0000000 --- a/Lesson_19/UefiLessonsPkg/GOPInfo/GOPInfo.inf +++ /dev/null @@ -1,19 +0,0 @@ -[Defines] - INF_VERSION = 1.25 - BASE_NAME = GOPInfo - FILE_GUID = 30f6fe85-328a-4d05-b154-58b54c335797 - MODULE_TYPE = UEFI_APPLICATION - VERSION_STRING = 1.0 - ENTRY_POINT = ShellCEntryLib - -[Sources] - GOPInfo.c - -[Packages] - MdePkg/MdePkg.dec - -[LibraryClasses] - UefiApplicationEntryPoint - UefiLib - ShellCEntryLib - diff --git a/Lesson_19/UefiLessonsPkg/HelloWorld/HelloWorld.c b/Lesson_19/UefiLessonsPkg/HelloWorld/HelloWorld.c deleted file mode 100644 index 29a4812..0000000 --- a/Lesson_19/UefiLessonsPkg/HelloWorld/HelloWorld.c +++ /dev/null @@ -1,19 +0,0 @@ -#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"); - - UINTN Index; - gBS->WaitForEvent(1, &(gST->ConIn->WaitForKey), &Index); - gST->ConIn->Reset(gST->ConIn, FALSE); - return EFI_SUCCESS; -} diff --git a/Lesson_19/UefiLessonsPkg/HelloWorld/HelloWorld.inf b/Lesson_19/UefiLessonsPkg/HelloWorld/HelloWorld.inf deleted file mode 100644 index d65ca2e..0000000 --- a/Lesson_19/UefiLessonsPkg/HelloWorld/HelloWorld.inf +++ /dev/null @@ -1,18 +0,0 @@ -[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_19/UefiLessonsPkg/ImageHandle/ImageHandle.c b/Lesson_19/UefiLessonsPkg/ImageHandle/ImageHandle.c deleted file mode 100644 index 32e9c43..0000000 --- a/Lesson_19/UefiLessonsPkg/ImageHandle/ImageHandle.c +++ /dev/null @@ -1,105 +0,0 @@ -#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(NULL, // Use this to test %r Print formatting option - EFI_STATUS Status = gBS->ProtocolsPerHandle(ImageHandle, - &ProtocolGuidArray, - &ArrayCount); - - if (!EFI_ERROR(Status)) { - for (int i=0; i<ArrayCount; i++) { - Print(L"%g\n", ProtocolGuidArray[i]); - } - FreePool(ProtocolGuidArray); - } else { - Print(L"ProtocolsPerHandle error: %r\n", Status); - } - - return EFI_SUCCESS; -} diff --git a/Lesson_19/UefiLessonsPkg/ImageHandle/ImageHandle.inf b/Lesson_19/UefiLessonsPkg/ImageHandle/ImageHandle.inf deleted file mode 100644 index 34256ee..0000000 --- a/Lesson_19/UefiLessonsPkg/ImageHandle/ImageHandle.inf +++ /dev/null @@ -1,18 +0,0 @@ -[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_19/UefiLessonsPkg/ImageInfo/ImageInfo.c b/Lesson_19/UefiLessonsPkg/ImageInfo/ImageInfo.c deleted file mode 100644 index c45570e..0000000 --- a/Lesson_19/UefiLessonsPkg/ImageInfo/ImageInfo.c +++ /dev/null @@ -1,44 +0,0 @@ -#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_19/UefiLessonsPkg/ImageInfo/ImageInfo.inf b/Lesson_19/UefiLessonsPkg/ImageInfo/ImageInfo.inf deleted file mode 100644 index 0ce54a6..0000000 --- a/Lesson_19/UefiLessonsPkg/ImageInfo/ImageInfo.inf +++ /dev/null @@ -1,22 +0,0 @@ -[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_19/UefiLessonsPkg/InteractiveApp/InteractiveApp.c b/Lesson_19/UefiLessonsPkg/InteractiveApp/InteractiveApp.c deleted file mode 100644 index 59c89a9..0000000 --- a/Lesson_19/UefiLessonsPkg/InteractiveApp/InteractiveApp.c +++ /dev/null @@ -1,34 +0,0 @@ -#include <Library/UefiBootServicesTableLib.h> -#include <Library/UefiLib.h> - -EFI_STATUS -EFIAPI -UefiMain ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - UINTN Index; - EFI_INPUT_KEY Key; - - Print(L"Try to guess the secret symbol!\n"); - Print(L"To quit press 'q'\n"); - - while(TRUE) { - gBS->WaitForEvent(1, &(gST->ConIn->WaitForKey), &Index); - gST->ConIn->ReadKeyStroke(gST->ConIn, &Key); - Print(L"ScanCode = %04x, UnicodeChar = %04x (%c)\n", Key.ScanCode, Key.UnicodeChar, Key.UnicodeChar); - - if (Key.UnicodeChar == 'k') { - Print(L"Correct!\n"); - break; - } else if (Key.UnicodeChar == 'q') { - Print(L"Bye!\n"); - break; - } else { - Print(L"Wrong!\n"); - } - } - gST->ConIn->Reset(gST->ConIn, FALSE); - return EFI_SUCCESS; -} diff --git a/Lesson_19/UefiLessonsPkg/InteractiveApp/InteractiveApp.inf b/Lesson_19/UefiLessonsPkg/InteractiveApp/InteractiveApp.inf deleted file mode 100644 index 700b779..0000000 --- a/Lesson_19/UefiLessonsPkg/InteractiveApp/InteractiveApp.inf +++ /dev/null @@ -1,18 +0,0 @@ -[Defines] - INF_VERSION = 1.25 - BASE_NAME = InteractiveApp - FILE_GUID = 1539451b-f300-41fa-a565-dde69c1bed66 - MODULE_TYPE = UEFI_APPLICATION - VERSION_STRING = 1.0 - ENTRY_POINT = UefiMain - -[Sources] - InteractiveApp.c - -[Packages] - MdePkg/MdePkg.dec - -[LibraryClasses] - UefiApplicationEntryPoint - UefiLib - diff --git a/Lesson_19/UefiLessonsPkg/ListVariables/ListVariables.c b/Lesson_19/UefiLessonsPkg/ListVariables/ListVariables.c deleted file mode 100644 index 1f3ef4a..0000000 --- a/Lesson_19/UefiLessonsPkg/ListVariables/ListVariables.c +++ /dev/null @@ -1,46 +0,0 @@ -#include <Library/UefiBootServicesTableLib.h> -#include <Library/UefiLib.h> - - -#include <Library/MemoryAllocationLib.h> -#include <Library/UefiRuntimeServicesTableLib.h> - -INTN EFIAPI ShellAppMain(IN UINTN Argc, IN CHAR16 **Argv) -{ - EFI_GUID VendorGuid; - UINTN VariableNameSize = sizeof (CHAR16); - CHAR16* VariableName = AllocateZeroPool(sizeof(CHAR16)); - if (VariableName == NULL) { - Print(L"Error on AllocateZeroPool call\n"); - return EFI_OUT_OF_RESOURCES; - } - - while (TRUE) - { - UINTN VariableNameSizeOld = VariableNameSize; - EFI_STATUS Status = gRT->GetNextVariableName(&VariableNameSize, VariableName, &VendorGuid); - if (Status == EFI_SUCCESS) { - Print(L"%g: %s\n", VendorGuid, VariableName); - } else if (Status == EFI_BUFFER_TOO_SMALL) { - VariableName = ReallocatePool(VariableNameSizeOld, VariableNameSize, VariableName); - if (VariableName == NULL) { - Print(L"Error on ReallocatePool call\n"); - return EFI_OUT_OF_RESOURCES; - } - Status = gRT->GetNextVariableName(&VariableNameSize, VariableName, &VendorGuid); - if (Status == EFI_SUCCESS) { - Print(L"%g: %s\n", VendorGuid, VariableName); - } else { - Print(L"Error on 'gRT->GetNextVariableName' call: %s\n", Status); - return Status; - } - } else if (Status == EFI_NOT_FOUND) { - FreePool(VariableName); - return EFI_SUCCESS; - } else { - Print(L"Error on 'gRT->GetNextVariableName' call: %s\n", Status); - return Status; - } - } - return EFI_SUCCESS; -} diff --git a/Lesson_19/UefiLessonsPkg/ListVariables/ListVariables.inf b/Lesson_19/UefiLessonsPkg/ListVariables/ListVariables.inf deleted file mode 100644 index 14e9fa2..0000000 --- a/Lesson_19/UefiLessonsPkg/ListVariables/ListVariables.inf +++ /dev/null @@ -1,19 +0,0 @@ -[Defines] - INF_VERSION = 1.25 - BASE_NAME = ListVariables - FILE_GUID = d66f68b2-3591-45af-bf5d-519152b9d877 - MODULE_TYPE = UEFI_APPLICATION - VERSION_STRING = 1.0 - ENTRY_POINT = ShellCEntryLib - -[Sources] - ListVariables.c - -[Packages] - MdePkg/MdePkg.dec - -[LibraryClasses] - UefiApplicationEntryPoint - UefiLib - ShellCEntryLib - diff --git a/Lesson_19/UefiLessonsPkg/MemoryInfo/MemoryInfo.c b/Lesson_19/UefiLessonsPkg/MemoryInfo/MemoryInfo.c deleted file mode 100644 index 8c3bcf2..0000000 --- a/Lesson_19/UefiLessonsPkg/MemoryInfo/MemoryInfo.c +++ /dev/null @@ -1,215 +0,0 @@ -#include <Library/UefiBootServicesTableLib.h> -#include <Library/UefiLib.h> - -// for SetMem -#include <Library/BaseMemoryLib.h> - -#include <Protocol/ShellParameters.h> - -const CHAR16 *memory_types[] = { - L"EfiReservedMemoryType", - L"EfiLoaderCode", - L"EfiLoaderData", - L"EfiBootServicesCode", - L"EfiBootServicesData", - L"EfiRuntimeServicesCode", - L"EfiRuntimeServicesData", - L"EfiConventionalMemory", - L"EfiUnusableMemory", - L"EfiACPIReclaimMemory", - L"EfiACPIMemoryNVS", - L"EfiMemoryMappedIO", - L"EfiMemoryMappedIOPortSpace", - L"EfiPalCode", - L"EfiPersistentMemory", - L"EfiMaxMemoryType" -}; - - -const CHAR16 *memory_types_OS_view[] = { - L"reserved", // L"EfiReservedMemoryType", - L"usable", // L"EfiLoaderCode", - L"usable", // L"EfiLoaderData", - L"usable", // L"EfiBootServicesCode", - L"usable", // L"EfiBootServicesData", - L"reserved", // L"EfiRuntimeServicesCode", - L"reserved", // L"EfiRuntimeServicesData", - L"usable", // L"EfiConventionalMemory", - L"reserved", // L"EfiUnusableMemory", - L"ACPI data",// L"EfiACPIReclaimMemory", - L"ACPI NVS", // L"EfiACPIMemoryNVS", - L"reserved", // L"EfiMemoryMappedIO", - L"reserved", // L"EfiMemoryMappedIOPortSpace", - L"reserved", // L"EfiPalCode", - L"usable", // L"EfiPersistentMemory", - L"usable", // L"EfiMaxMemoryType" -}; - - -const CHAR16 * -memory_type_to_str(UINT32 type) -{ - if (type > sizeof(memory_types)/sizeof(CHAR16 *)) - return L"Unknown"; - - return memory_types[type]; -} - -const CHAR16 * -memory_type_to_str_OS_view(UINT32 type) -{ - if (type > sizeof(memory_types_OS_view)/sizeof(CHAR16 *)) - return L"Unknown"; - - return memory_types_OS_view[type]; -} - -#define ATTRIBUTE_STR_SIZE 50 - -#define CHECK_EFI_MEMORY_ATTRIBUTE(attr) if (attrs & EFI_MEMORY_##attr) { \ - StrCpyS(&str[i], ATTRIBUTE_STR_SIZE, L" "#attr); \ - i+=StrLen(L" "#attr); \ - } - -const CHAR16 * -memory_attrs_to_str(CHAR16* str, UINT64 attrs) -{ - int i=0; - SetMem((VOID *)str, sizeof(str), 0); - - CHECK_EFI_MEMORY_ATTRIBUTE(UC) - CHECK_EFI_MEMORY_ATTRIBUTE(WC) - CHECK_EFI_MEMORY_ATTRIBUTE(WT) - CHECK_EFI_MEMORY_ATTRIBUTE(WB) - CHECK_EFI_MEMORY_ATTRIBUTE(UCE) - CHECK_EFI_MEMORY_ATTRIBUTE(WP) - CHECK_EFI_MEMORY_ATTRIBUTE(RP) - CHECK_EFI_MEMORY_ATTRIBUTE(XP) - CHECK_EFI_MEMORY_ATTRIBUTE(NV) - CHECK_EFI_MEMORY_ATTRIBUTE(MORE_RELIABLE) - CHECK_EFI_MEMORY_ATTRIBUTE(RO) - CHECK_EFI_MEMORY_ATTRIBUTE(SP) - CHECK_EFI_MEMORY_ATTRIBUTE(CPU_CRYPTO) - CHECK_EFI_MEMORY_ATTRIBUTE(RUNTIME) - - return str; -} - -EFI_STATUS -EFIAPI -UefiMain ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - UINTN MemoryMapSize = 0; - EFI_MEMORY_DESCRIPTOR* MemoryMap = NULL; - UINTN MapKey; - UINTN DescriptorSize; - UINT32 DescriptorVersion; - - EFI_STATUS Status; - - - EFI_SHELL_PARAMETERS_PROTOCOL* ShellParameters; - - Status = gBS->HandleProtocol( - ImageHandle, - &gEfiShellParametersProtocolGuid, - (VOID **) &ShellParameters - ); - - BOOLEAN full=FALSE; - if (Status == EFI_SUCCESS) { - if (ShellParameters->Argc == 2) { - if (!StrCmp(ShellParameters->Argv[1], L"full")) { - full=TRUE; - } - } - } - - - Status = gBS->GetMemoryMap( - &MemoryMapSize, - MemoryMap, - &MapKey, - &DescriptorSize, - &DescriptorVersion - ); - - if (Status == EFI_BUFFER_TOO_SMALL) { - Status = gBS->AllocatePool( - EfiBootServicesData, - MemoryMapSize, - (void**)&MemoryMap - ); - - if (EFI_ERROR(Status)) { - Print(L"AllocatePool error: %r\n", Status); - return Status; - } - - Status = gBS->GetMemoryMap( - &MemoryMapSize, - MemoryMap, - &MapKey, - &DescriptorSize, - &DescriptorVersion - ); - - if (!EFI_ERROR(Status)) - { - EFI_MEMORY_DESCRIPTOR* desc = MemoryMap; - EFI_MEMORY_DESCRIPTOR* next_desc; - int i = 0; - while ((UINT8 *)desc < (UINT8 *)MemoryMap + MemoryMapSize) { - UINTN PAGE_SIZE = 4096; - UINTN mapping_size =(UINTN) desc->NumberOfPages * PAGE_SIZE; - - UINT64 Start = desc->PhysicalStart; - - next_desc = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)desc + DescriptorSize); - if (!full) { - while ((UINT8 *)next_desc < (UINT8 *)MemoryMap + MemoryMapSize) { - mapping_size =(UINTN) desc->NumberOfPages * PAGE_SIZE; - if ((desc->PhysicalStart + mapping_size) == (next_desc->PhysicalStart)) { - - if (desc->Type != next_desc->Type) { - if (StrCmp(memory_type_to_str_OS_view(desc->Type), - memory_type_to_str_OS_view(next_desc->Type))) - break; - } - - desc=next_desc; - next_desc = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)next_desc + DescriptorSize); - } else { - break; - } - } - } - - if (full) { - CHAR16 str[ATTRIBUTE_STR_SIZE]; - Print(L"[#%02d] Type: %s Attr: %s\n", i++, - memory_type_to_str(desc->Type), memory_attrs_to_str(str, desc->Attribute)); - Print(L" Phys: %016llx-%016llx\n", Start, Start + mapping_size - 1); - } - else { - Print(L" [mem: %016llx-%016llx] %s\n", Start, desc->PhysicalStart + mapping_size - 1, - memory_type_to_str_OS_view(desc->Type) ); - } - - desc = next_desc; - } - - gBS->FreePool(MemoryMap); - } else { - Print(L"GetMemoryMap with buffer error: %r\n", Status); - } - } else { - Print(L"GetMemoryMap without buffer error: %r\n", Status); - } - - return Status; -} - diff --git a/Lesson_19/UefiLessonsPkg/MemoryInfo/MemoryInfo.inf b/Lesson_19/UefiLessonsPkg/MemoryInfo/MemoryInfo.inf deleted file mode 100644 index 777010d..0000000 --- a/Lesson_19/UefiLessonsPkg/MemoryInfo/MemoryInfo.inf +++ /dev/null @@ -1,21 +0,0 @@ -[Defines] - INF_VERSION = 1.25 - BASE_NAME = MemoryInfo - FILE_GUID = d2ce1d65-603e-4b48-b3e1-fe65d5d0bca8 - MODULE_TYPE = UEFI_APPLICATION - VERSION_STRING = 1.0 - ENTRY_POINT = UefiMain - -[Sources] - MemoryInfo.c - -[Packages] - MdePkg/MdePkg.dec - -[LibraryClasses] - UefiApplicationEntryPoint - UefiLib - -[Protocols] - gEfiShellParametersProtocolGuid - diff --git a/Lesson_19/UefiLessonsPkg/ShowBootVariables/ShowBootVariables.c b/Lesson_19/UefiLessonsPkg/ShowBootVariables/ShowBootVariables.c deleted file mode 100644 index 7f6b58c..0000000 --- a/Lesson_19/UefiLessonsPkg/ShowBootVariables/ShowBootVariables.c +++ /dev/null @@ -1,93 +0,0 @@ -#include <Library/UefiBootServicesTableLib.h> -#include <Library/UefiLib.h> - -#include <Library/MemoryAllocationLib.h> -#include <Library/UefiRuntimeServicesTableLib.h> - -#include <Library/DevicePathLib.h> -#include <Library/PrintLib.h> - - -EFI_STATUS -GetNvramVariable( CHAR16 *VariableName, - EFI_GUID *VariableOwnerGuid, - VOID **Buffer, - UINTN *BufferSize) -{ - UINTN Size = 0; - *BufferSize = 0; - - EFI_STATUS Status = gRT->GetVariable(VariableName, VariableOwnerGuid, NULL, &Size, NULL); - if (Status != EFI_BUFFER_TOO_SMALL) { - Print(L"Error! 'gRT->GetVariable' call returned %r\n", Status); - return Status; - } - - *Buffer = AllocateZeroPool(Size); - if (!Buffer) { - Print(L"Error! 'AllocateZeroPool' call returned %r\n", Status); - return EFI_OUT_OF_RESOURCES; - } - - Status = gRT->GetVariable(VariableName, VariableOwnerGuid, NULL, &Size, *Buffer); - if (Status == EFI_SUCCESS) { - *BufferSize = Size; - } else { - FreePool( *Buffer ); - *Buffer = NULL; - } - - return Status; -} - - -VOID PrintBootOption(CHAR16* BootOptionName) -{ - UINTN OptionSize; - UINT8* Buffer; - - EFI_STATUS Status = GetNvramVariable(BootOptionName, &gEfiGlobalVariableGuid, (VOID**)&Buffer, &OptionSize); - if (Status == EFI_SUCCESS) { - EFI_LOAD_OPTION* LoadOption = (EFI_LOAD_OPTION*) Buffer; - CHAR16* Description = (CHAR16*)(Buffer + sizeof (EFI_LOAD_OPTION)); - UINTN DescriptionSize = StrSize(Description); - - Print(L"%s\n", Description); - if (LoadOption->FilePathListLength != 0) { - VOID* FilePathList = (UINT8 *)Description + DescriptionSize; - CHAR16* DevPathString = ConvertDevicePathToText(FilePathList, TRUE, FALSE); - Print(L"%s\n", DevPathString); - } - } else { - Print(L"Can't get %s variable\n", BootOptionName); - } -} - - -INTN EFIAPI ShellAppMain(IN UINTN Argc, IN CHAR16 **Argv) -{ - UINTN OptionSize; - EFI_STATUS Status; - - UINT16* BootCurrent; - Status = GetNvramVariable(L"BootCurrent", &gEfiGlobalVariableGuid, (VOID**)&BootCurrent, &OptionSize); - if (Status != EFI_SUCCESS) { - Print(L"Can't get BootCurrent variable\n"); - } - - UINT16* BootOrderArray; - Status = GetNvramVariable(L"BootOrder", &gEfiGlobalVariableGuid, (VOID**)&BootOrderArray, &OptionSize); - if (Status == EFI_SUCCESS) { - for (UINTN i=0; i<(OptionSize/sizeof(UINT16)); i++) { - CHAR16 BootOptionStr[sizeof("Boot####")+1]; - UnicodeSPrint(BootOptionStr, (sizeof("Boot####")+1)*sizeof(CHAR16), L"Boot%04x", BootOrderArray[i]); - Print(L"%s%s\n", BootOptionStr, (BootOrderArray[i] == *BootCurrent)? L"*" : L"" ); - PrintBootOption(BootOptionStr); - Print(L"\n"); - } - } else { - Print(L"Can't get BootOrder variable\n"); - } - - return EFI_SUCCESS; -} diff --git a/Lesson_19/UefiLessonsPkg/ShowBootVariables/ShowBootVariables.inf b/Lesson_19/UefiLessonsPkg/ShowBootVariables/ShowBootVariables.inf deleted file mode 100644 index d2cfba9..0000000 --- a/Lesson_19/UefiLessonsPkg/ShowBootVariables/ShowBootVariables.inf +++ /dev/null @@ -1,19 +0,0 @@ -[Defines] - INF_VERSION = 1.25 - BASE_NAME = ShowBootVariables - FILE_GUID = 31266d12-9c60-478e-905e-05d117a3a9df - MODULE_TYPE = UEFI_APPLICATION - VERSION_STRING = 1.0 - ENTRY_POINT = ShellCEntryLib - -[Sources] - ShowBootVariables.c - -[Packages] - MdePkg/MdePkg.dec - -[LibraryClasses] - UefiApplicationEntryPoint - UefiLib - ShellCEntryLib - diff --git a/Lesson_19/UefiLessonsPkg/SimpleShellApp/SimpleShellApp.c b/Lesson_19/UefiLessonsPkg/SimpleShellApp/SimpleShellApp.c deleted file mode 100644 index b13aa6c..0000000 --- a/Lesson_19/UefiLessonsPkg/SimpleShellApp/SimpleShellApp.c +++ /dev/null @@ -1,14 +0,0 @@ -#include <Library/UefiBootServicesTableLib.h> -#include <Library/UefiLib.h> - -INTN EFIAPI ShellAppMain(IN UINTN Argc, IN CHAR16 **Argv) -{ -// SystemTable->ConOut->OutputString(SystemTable->ConOut, L"Hello World!\n"); - gST->ConOut->OutputString(gST->ConOut, L"Hello again!\n"); - Print(L"Bye!\n"); - - for (UINTN i=Argc; i>0; i--) { - Print(L"Arg[%d]=%s\n", Argc-i, Argv[Argc-i]); - } - return 0; -} diff --git a/Lesson_19/UefiLessonsPkg/SimpleShellApp/SimpleShellApp.inf b/Lesson_19/UefiLessonsPkg/SimpleShellApp/SimpleShellApp.inf deleted file mode 100644 index 013bf4e..0000000 --- a/Lesson_19/UefiLessonsPkg/SimpleShellApp/SimpleShellApp.inf +++ /dev/null @@ -1,19 +0,0 @@ -[Defines] - INF_VERSION = 1.25 - BASE_NAME = SimpleShellApp - FILE_GUID = 2afd1202-545e-4f8d-b8fb-bc179e84ddc8 - MODULE_TYPE = UEFI_APPLICATION - VERSION_STRING = 1.0 - ENTRY_POINT = ShellCEntryLib - -[Sources] - SimpleShellApp.c - -[Packages] - MdePkg/MdePkg.dec - -[LibraryClasses] - UefiApplicationEntryPoint - UefiLib - ShellCEntryLib - diff --git a/Lesson_19/UefiLessonsPkg/SimplestApp/SimplestApp.c b/Lesson_19/UefiLessonsPkg/SimplestApp/SimplestApp.c deleted file mode 100644 index 8bdf500..0000000 --- a/Lesson_19/UefiLessonsPkg/SimplestApp/SimplestApp.c +++ /dev/null @@ -1,10 +0,0 @@ -EFI_STATUS -EFIAPI -UefiMain ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - return EFI_SUCCESS; -} - diff --git a/Lesson_19/UefiLessonsPkg/SimplestApp/SimplestApp.inf b/Lesson_19/UefiLessonsPkg/SimplestApp/SimplestApp.inf deleted file mode 100644 index 7d4bae2..0000000 --- a/Lesson_19/UefiLessonsPkg/SimplestApp/SimplestApp.inf +++ /dev/null @@ -1,16 +0,0 @@ -[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_19/UefiLessonsPkg/UefiLessonsPkg.dec b/Lesson_19/UefiLessonsPkg/UefiLessonsPkg.dec deleted file mode 100644 index d37e955..0000000 --- a/Lesson_19/UefiLessonsPkg/UefiLessonsPkg.dec +++ /dev/null @@ -1,22 +0,0 @@ -[Defines]
- DEC_SPECIFICATION = 0x00010005
- PACKAGE_NAME = UefiLessonsPkg
- PACKAGE_GUID = 7e7edbba-ca2c-4177-a3f0-d3371358773a
- PACKAGE_VERSION = 1.01
-
-[Includes]
-
-[LibraryClasses]
-
-[Guids]
- # FILE_GUID as defined in UefiLessonsPkg/HelloWorld/HelloWorld.inf
- gHelloWorldFileGuid = {0x2e55fa38, 0xf148, 0x42d3, {0xaf, 0x90, 0x1b, 0xe2, 0x47, 0x32, 0x3e, 0x30}}
-
-[Protocols]
-
-[PcdsFeatureFlag]
-
-[PcdsFixedAtBuild]
-
-[PcdsFixedAtBuild, PcdsPatchableInModule, PcdsDynamic, PcdsDynamicEx]
-
diff --git a/Lesson_19/UefiLessonsPkg/UefiLessonsPkg.dsc b/Lesson_19/UefiLessonsPkg/UefiLessonsPkg.dsc deleted file mode 100644 index 616ccee..0000000 --- a/Lesson_19/UefiLessonsPkg/UefiLessonsPkg.dsc +++ /dev/null @@ -1,37 +0,0 @@ -[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 - ShellCEntryLib|ShellPkg/Library/UefiShellCEntryLib/UefiShellCEntryLib.inf - -[Components] - UefiLessonsPkg/SimplestApp/SimplestApp.inf - UefiLessonsPkg/HelloWorld/HelloWorld.inf - UefiLessonsPkg/ImageHandle/ImageHandle.inf - UefiLessonsPkg/ImageInfo/ImageInfo.inf - UefiLessonsPkg/MemoryInfo/MemoryInfo.inf - UefiLessonsPkg/SimpleShellApp/SimpleShellApp.inf - UefiLessonsPkg/ListVariables/ListVariables.inf - UefiLessonsPkg/ShowBootVariables/ShowBootVariables.inf - UefiLessonsPkg/InteractiveApp/InteractiveApp.inf - |