💻
UEFI 프로젝트
  • 🧑‍🏫프로젝트 개요
  • 📖UEFI 개념
    • 1. BIOS의 과거
    • 2. UEFI 개념
    • 3. BIOS vs UEFI
    • 4. UEFI 부팅 단계
  • 🖥️UEFI 개발
    • UEFI 개발 시작하기
      • 0. EDK II 빌드 환경 구성
      • 1. 간단한 EFI application 만들기
      • 2. 간단한 Pkg 만들기
      • 3. Hello World 출력하기
      • 4. 라이브러리와 Hello World
      • 5. Conf를 통한 Build 단순화
    • 핸들 및 프로토콜
      • 6. 핸들/프로토콜 데이터 베이스 구조 - Part 1
      • 7. 핸들/프로토콜 데이터 베이스 구조 - Part 2
      • 8. HandleProtocol API 함수 & ImageHandle 프로토콜을 통한 정보
      • 9. ProtocolsPerHandle API를 통한 ImageHandle 프로토콜 가져오기
      • 10. EFI_STATUS 타입 과 EFI_ERROR 매크로
    • 메모리 맵
      • 11. EFI 메모리 맵 정보 얻기
      • 12. EFI 메모리 맵을 리눅스 커널 스타일로 바꾸기
    • 명령줄 인수를 받는 간단한 앱 만들기
      • 13.ShellAppMain Entry point
      • 14.gRT->GetNextVariableName API를 사용하여 모든 변수 이름 및 GUID 가져오기
    • 부팅 옵션
      • 15. gRT->GetVariable API를 사용하여 부팅 변수 가져오기 및 구문 분석
      • 16. OVMF 이미지 내에 부팅 옵션 추가
      • 17. 부팅 옵션에 WaitForEvent 함수 추가
      • 18. ReadKeyStroke 함수로 사용자 입력 처리
      • 19. bcfg 명령어를 사용한 부팅 옵션 수정
    • PCD
      • 20. PCD 소개
      • 21. PCD 변수에 대한 Overriding
      • 22. Feature Flag PCD와 BOOLEAN FixedAtBuild PCD의 비교
      • 23. PatchableInModule PCD 및 GenPatchPcdTable/PatchPcdValue 유틸리티를 통해 PCD를 변경하는 방법
      • 24. Dynamic/DynamiEx PCDs
      • 25. PCD 더 알아보기
    • 테이블
      • 26. EFI_CONFIGURATION_TABLE에서 참조되는 테이블
      • 27. dmem/EFI_SMBIOS_PROTOCOL/smbiosview를 통해서 SMBIOS 정보 가져오기
      • 28. EFI_SHELL_PROTOCOL을 통하여 ACPI 테이블을 파일에 저장하기
      • 29. EFI_ACPI_SDT_PROTOCOL 및 ShellLib를 사용하여 ACPI BGRT 테이블에서 BMP 이미지 저장하기
    • PCI
      • 30. PCI 루트 브리지 찾은 후 시스템의 모든 PCI 기능 가져오기
      • 31. ShellLib/PrintLib 함수를 사용해 PCI Vendor/Device 정보 가져오기
      • 32. EFI_PCI_IO_PROTOCOL을 사용해 PCI Option ROM 이미지 표시
      • 33. EfiRom 유틸리티를 사용한 PCI Option ROM 이미지 파싱 및 생성
    • 드라이버 및 라이브러리
      • 34. 간단한 UEFI 드라이버 생성
      • 35. 애플리케이션에서 사용할 간단한 라이브러리 생성
      • 36. Library의 constructor와 destructor, NULL Library
      • 37. Shell에 acpiview 명령을 추가하는 방법 조사
      • 38. 사용자 지정 프로토콜을 만들고 사용하기
      • 39. RegisterKeyNotify / UnrigisterKeyNotify 함수를 사용해 단축키 기능을 추가하는 드라이버 만들기
      • 40. Key #### NVRAM 변수
    • 디버그
      • 41. DEBUG 출력문 내부 구조와 DEBUG 문 제어를 위한 PCD 분석, 그리고 OVMF 부트 로그 가져오기
      • 42. GDB를 이용한 Driver/Application 및 OVMF Debug
    • HII
      • 43. HII 데이터베이스 개념 및 출력
      • 44. HII 데이터베이스 내부
      • 45. EFI_HII_DATABASE_PROTOCOL의 NewPackageList를 사용하여 문자열 패키지가 포함된 문자열 목록 게시
      • 46. EFI_HII_DATABASE_PROTOCOL의 NewPackageList를 사용하여 문자열 패키지가 포함된 HII 패키지 목록 게시
      • 47. EFI_HII_DATABASE_PROTOCOL의 NewPackageList를 사용하여 문자열 패키지가 포함된 HII 패키지 목록 게시
      • 48. UNI 파일 및 HiiLib를 사용하여 HII String 패키지 게시 및 작업하기
      • 49.MODULE_UNI_FILE/PACKAGE_UNI_FILE/[UserExtensions.TianoCore."ExtraFiles"]의 도움으로 UNI 파일 선언하기
      • 50.UEFI_HII_RESOURCE_SECTION을 사용하여 문자열 패키지와 함께 HII 패키지 목록 게시하기
      • 51. UEFI APP에 메뉴얼 추가하기(shell의 -?와 help 옵션)
      • 52. Russian 글꼴 추가 - Part 1.
      • 53. Russian 글꼴 추가 - Part 2.
      • 54. EFI_HII_STRING_PROTOCOL의 NewString 및 SetString 함수를 사용하여 다른 언어에 대한 문자열 패키지를 동적으로 추가
      • 55. PlatformLangCodes EFI 변수 수정 및 다른 언어를 동적 추가하기
      • 56. 코드에서 FILE_GUID 및 BASE_NAME을 가져오기
    • VFR
      • 57. VFR을 사용해 간단한 폼 생성 및 EFI_FORM_BROWSER2_PROTOCOL.SendForm()를 통해 화면에 폼 표시하기
      • 58. VFR 요소 : subtitle 및 text
      • 59. 간단한 폼 애플리케이션을 UEFI 드라이버 Form으로 변환하기
      • 60. gRT->SetVariable() 함수를 사용한 UEFI 변수 생성, 변경 및 삭제
      • 61.dmpstore 명령을 사용하여 변수를 파일에 저장/로드하기
      • 62. UEFI Device path의 구조
      • 63. checkbox를 가진 HII 폼 만들기
      • 64. checkbox를 가진 HII폼 만들기
      • 65. VFR 추가 입력 요소 Part 1: number
      • 66. VFR 추가 입력 요소 Part 2: string
      • 67. VFR 추가 입력 요소 Part 3: date & time
      • 68. VFR 추가 입력 요소 Part 3: oneof & orderedlist
      • 69. VFR의 조건부 키워드
      • 70. VFR의 상수 및 연산자가 내장된 기본 조건문
      • 71. 기본 VFR 내장 문자열용 함수
      • 72. label 키워드를 이용하여 HII 양식에 동적 요소 추가하기
      • 73. VFR question 기본값 설정
  • 🔐UEFI 보안
    • 1. 개요
    • 2. 공격 벡터
    • 3. mitigation
    • 4. 정적 분석 방법
    • 5. 동적 분석 방법
Powered by GitBook
On this page
  1. UEFI 개발
  2. 명령줄 인수를 받는 간단한 앱 만들기

14.gRT->GetNextVariableName API를 사용하여 모든 변수 이름 및 GUID 가져오기

이번 장에서는 런타임 변수를 모두 출력해보는 실습을 한다.

이를 위해서는 EFI Runtime Services의 GetNextVariableName() API 함수를 사용해야 한다.

GetNextVariableName()

Summary:
Enumerates the current variable names.

Prototype:
typedef
EFI_STATUS
GetNextVariableName (
 IN OUT UINTN *VariableNameSize,
 IN OUT CHAR16 *VariableName,
 IN OUT EFI_GUID *VendorGuid
 );

Parameters:
VariableNameSize 	The size of the VariableName buffer. The size must be large
			enough to fit input string supplied in VariableName buffer.
VariableName 		On input, supplies the last VariableName that was returned by
			GetNextVariableName(). On output, returns the Nullterminated string
			of the current variable.
VendorGuid 		On input, supplies the last VendorGuid that was returned by
			GetNextVariableName(). On output, returns the VendorGuid
			of the current variable.

Description
GetNextVariableName() is called multiple times to retrieve the VariableName and VendorGuid of all
variables currently available in the system. On each call to GetNextVariableName() the previous
results are passed into the interface, and on output the interface returns the next variable name data.
When the entire variable list has been returned, the error EFI_NOT_FOUND is returned.

Note that if EFI_BUFFER_TOO_SMALL is returned, the VariableName buffer was too small for the next
variable. When such an error occurs, the VariableNameSize is updated to reflect the size of buffer
needed. In all cases when calling GetNextVariableName() the VariableNameSize must not exceed the
actual buffer size that was allocated for VariableName. The VariableNameSize must not be smaller the size
of the variable name string passed to GetNextVariableName() on input in the VariableName buffer.

To start the search, a Null-terminated string is passed in VariableName; that is, VariableName is a pointer
to a Null character. This is always done on the initial call to GetNextVariableName(). When
VariableName is a pointer to a Null character, VendorGuid is ignored.


Status Codes Returned:
EFI_SUCCESS 		The function completed successfully.
EFI_NOT_FOUND 		The next variable was not found.
EFI_BUFFER_TOO_SMALL 	The VariableNameSize is too small for the result.
			VariableNameSize has been updated with the size needed to complete the request.
...

이전에 gST/gBS를 얻기 위해 파일에 #include <Library/UefiBootServicesTableLib.h>를 포함했다. EFI Runtime Services Table에 대한 바로가기를 얻으려면 비슷한 헤더파일을 추가해야 한다.

#include <Library/UefiRuntimeServicesTableLib.h>

위 파일을 보면 라이브러리 생성자 호출 때 gRT = SystemTable->RuntimeServices;로 채워지는 extern EFI_RUNTIME_SERVICES *gRT;만 단순히 추가해준다.

UEFI 스펙에 따르면 검색을 하려면 Null (=0)과 같은 1개의 문자로 문자열을 생성해야 한다고 한다.이러한 문자열을 생성하기 위해 AllocateZeroPool함수를 사용한다.

UINTN VariableNameSize = sizeof (CHAR16);
CHAR16* VariableName = AllocateZeroPool(sizeof(CHAR16));

AllocateZeroPool 은 UEFI 스펙에서 정의된 기능이 아니고 EDKII의 MemoryAllocationLib에서 사용자를 편하게 해주기 위해 만든 기능이다.

/**
  Allocates and zeros a buffer of type EfiBootServicesData.
   ...
  @param  AllocationSize        The number of bytes to allocate and zero.

  @return A pointer to the allocated buffer or NULL if allocation fails.
**/

VOID *
EFIAPI
AllocateZeroPool (
  IN UINTN  AllocationSize
  )

이 문자열은 변수 이름을 저장하기에 충분히 크지 않을 것이므로 적어도 첫 번째 호출에서는 확실하게 EFI_BUFFER_TOO_SMALL을 반환할 것이다.

이 경우 버퍼를 재할당해야 하는데 ReallocatePool 함수로 이를 수행할 수 있다.

ReallocatePool또한 EDKII의 MemoryAllocationLib에서 만들어진 함수이다.

/**
  Reallocates a buffer of type EfiBootServicesData.
   ...
  @param  OldSize        The size, in bytes, of OldBuffer.
  @param  NewSize        The size, in bytes, of the buffer to reallocate.
  @param  OldBuffer      The buffer to copy to the allocated buffer.  This is an optional
                         parameter that may be NULL.
  @return A pointer to the allocated buffer or NULL if allocation fails.
**/

VOID *
EFIAPI
ReallocatePool (
  IN UINTN  OldSize,
  IN UINTN  NewSize,
  IN VOID   *OldBuffer  OPTIONAL
  )

이제 ListVariables라는 애플리케이션을 만들어서 첫 번째 변수를 출력해보자.

#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;
  }

  UINTN VariableNameSizeOld = VariableNameSize;
  EFI_STATUS Status = gRT->GetNextVariableName(&VariableNameSize, VariableName, &VendorGuid);
  if (Status == EFI_BUFFER_TOO_SMALL) {
    VariableName = ReallocatePool(VariableNameSizeOld, VariableNameSize, VariableName);
    if (VariableName == NULL) {
      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 {
    Print(L"Error on 'gRT->GetNextVariableName' call: %s\n", Status);
    return Status;
  }
  FreePool(VariableName);
  return EFI_SUCCESS;
}

빌드 후에 OVMF로 실행해보면 다음과 같은 결과를 얻을 수 있다.

FS0:\> ListVariables.efi
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: OsIndicationsSupported

이제 사용되는 모든 변수를 출력하는 반복문을 작성하여 모든 변수를 출력해보자.

#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) {
    rint(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;
}

while(TRUE) 반복문 안에서 gRT->GetNextVariableName함수를 계속 실행하여 반환된 EFI_STATUS코드를 구분한다.

  • EFI_SUCCESS는 변수를 성공적으로 획득했음을 나타내므로 그냥 출력하면 된다.

  • EFI_BUFFER_TOO_SMALL은 배열을 ReAllocatePool을 호출해 크기를 늘리고 다시 gRT->GetNextVariableName를 호출해야 함을 의미한다.

  • EFI_NOT_FOUND는 우리가 모든 변수를 파싱하여 멈춰야 한다는 것을 의미한다.

  • 다른 상태에서는 단순 오류로 출력하고 반환한다.

이제 우리 프로그램을 OVMF에서 실행하면 다음과 같이 출력된다.

FS0:\> ListVariables.efi
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: OsIndicationsSupported
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: BootOptionSupport
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: LangCodes
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: PlatformLangCodes
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: PlatformRecovery0000
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: ConOutDev
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: ErrOutDev
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: ConInDev
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: BootCurrent
158DEF5A-F656-419C-B027-7A3192C079D2: path
158DEF5A-F656-419C-B027-7A3192C079D2: nonesting
0053D9D6-2659-4599-A26B-EF4536E631A9: cat
0053D9D6-2659-4599-A26B-EF4536E631A9: cd..
0053D9D6-2659-4599-A26B-EF4536E631A9: cd\
0053D9D6-2659-4599-A26B-EF4536E631A9: copy
0053D9D6-2659-4599-A26B-EF4536E631A9: del
0053D9D6-2659-4599-A26B-EF4536E631A9: dir
0053D9D6-2659-4599-A26B-EF4536E631A9: md
0053D9D6-2659-4599-A26B-EF4536E631A9: mem
0053D9D6-2659-4599-A26B-EF4536E631A9: mount
0053D9D6-2659-4599-A26B-EF4536E631A9: move
0053D9D6-2659-4599-A26B-EF4536E631A9: ren
158DEF5A-F656-419C-B027-7A3192C079D2: profiles
158DEF5A-F656-419C-B027-7A3192C079D2: uefishellsupport
158DEF5A-F656-419C-B027-7A3192C079D2: uefishellversion
158DEF5A-F656-419C-B027-7A3192C079D2: uefiversion
158DEF5A-F656-419C-B027-7A3192C079D2: cwd
158DEF5A-F656-419C-B027-7A3192C079D2: debuglasterror
158DEF5A-F656-419C-B027-7A3192C079D2: lasterror
59324945-EC44-4C0D-B1CD-9DB139DF070C: Attempt 1
59324945-EC44-4C0D-B1CD-9DB139DF070C: Attempt 2
59324945-EC44-4C0D-B1CD-9DB139DF070C: Attempt 3
59324945-EC44-4C0D-B1CD-9DB139DF070C: Attempt 4
59324945-EC44-4C0D-B1CD-9DB139DF070C: Attempt 5
59324945-EC44-4C0D-B1CD-9DB139DF070C: Attempt 6
59324945-EC44-4C0D-B1CD-9DB139DF070C: Attempt 7
4B47D616-A8D6-4552-9D44-CCAD2E0F4CF9: InitialAttemptOrder
59324945-EC44-4C0D-B1CD-9DB139DF070C: Attempt 8
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: Boot0000
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: Timeout
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: PlatformLang
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: Lang
04B37FE8-F6AE-480B-BDD5-37D98C5E89AA: VarErrorFlag
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: Key0000
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: Key0001
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: Boot0001
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: Boot0002
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: Boot0003
4C19049F-4137-4DD3-9C10-8B97A83FFDFA: MemoryTypeInformation
5B446ED1-E30B-4FAA-871A-3654ECA36080: 525400123456
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: BootOrder
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: Boot0004
EB704011-1402-11D3-8E77-00A0C969723B: MTC
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: ConOut
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: ConIn
8BE4DF61-93CA-11D2-AA0D-00E098032B8C: ErrOut

8BE4DF61-93CA-11D2-AA0D-00E098032B8C를 GUID로 가지고 있는 그룹이 제일 중요하다.

EFI_GLOBAL_VARIABLE을 뜻하는 GUID며 UEFI 스펙에 정의되어 있다.

EDKII에서는 여기에서 찾을 수 있다.

#define EFI_GLOBAL_VARIABLE \
  { \
    0x8BE4DF61, 0x93CA, 0x11d2, {0xAA, 0x0D, 0x00, 0xE0, 0x98, 0x03, 0x2B, 0x8C } \
  }

extern EFI_GUID gEfiGlobalVariableGuid;

Boot####같은 옵션들은 UEFI 스펙에서 정의되므로 미리 정의된 GUID인 EFI_GLOBAL_VARIABLE를 가지고 있다. 고유한 옵션을 만들고 싶다면 EFI_GLOBAL_VARIABLE을 사용하면 안되고 충돌 가능성을 없애기 위해 고유한 옵션을 만들어야한다.

EDKII 코드베이스에서 GUID가 정의된 위치를 보려면 다음과 같이 하면 된다.

$ grep -i 4B37FE8 -r ./ --exclude-dir=Build

GUID별로 변수를 정렬하려면 위의 명령 실행결과를 파일로 저장하고 Linux Shell에서 정렬을 수행하면 된다.

$ cat guids.txt | sort

여기서부터는 GUID에 대한 정의가 있는 파일이 있고 그룹화된 GUID를 쓰는 변수들의 목록이다.

8BE4DF61-93CA-11D2-AA0D-00E098032B8C - gEfiGlobalVariableGuid

Boot0000
Boot0001
Boot0002
Boot0003
Boot0004
BootCurrent
BootOptionSupport
BootOrder
ConIn
ConInDev
ConOut
ConOutDev
ErrOut
ErrOutDev
Key0000
Key0001
Lang
LangCodes
OsIndicationsSupported
PlatformLang
PlatformLangCodes
PlatformRecovery0000
Timeout

04B37FE8-F6AE-480B-BDD5-37D98C5E89AA - gEdkiiVarErrorFlagGuid

VarErrorFlag

4C19049F-4137-4DD3-9C10-8B97A83FFDFA - gEfiMemoryTypeInformationGuid

MemoryTypeInformation

5B446ED1-E30B-4FAA-871A-3654ECA36080 - gEfiIp4Config2ProtocolGuid

525400123456

EB704011-1402-11D3-8E77-00A0C969723B - gMtcVendorGuid

MTC

59324945-EC44-4C0D-B1CD-9DB139DF070C - gEfiIScsiInitiatorNameProtocolGuid

Attempt 1
Attempt 2
Attempt 3
Attempt 4
Attempt 5
Attempt 6
Attempt 7
Attempt 8

158DEF5A-F656-419C-B027-7A3192C079D2 - gShellVariableGuid

cwd
debuglasterror
lasterror
nonesting
path
profiles
uefishellsupport
uefishellversion
uefiversion

4B47D616-A8D6-4552-9D44-CCAD2E0F4CF9 - gIScsiConfigGuid

InitialAttemptOrder

0053D9D6-2659-4599-A26B-EF4536E631A9 - gShellAliasGuid

cat
cd..
cd\
copy
del
dir
md
mem
mount
move
ren
Previous13.ShellAppMain Entry pointNext부팅 옵션

Last updated 2 years ago

🖥️
https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Include/Guid/VarErrorFlag.h
https://github.com/tianocore/edk2/blob/master/MdeModulePkg/MdeModulePkg.dec
https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Include/Guid/MemoryTypeInformation.h
https://github.com/tianocore/edk2/blob/master/MdeModulePkg/MdeModulePkg.dec
https://github.com/tianocore/edk2/blob/master/MdePkg/Include/Protocol/Ip4Config2.h
https://github.com/tianocore/edk2/blob/master/MdePkg/MdePkg.dec
https://github.com/tianocore/edk2/blob/master/MdeModulePkg/Include/Guid/MtcVendor.h
https://github.com/tianocore/edk2/blob/master/MdeModulePkg/MdeModulePkg.dec
https://github.com/tianocore/edk2/blob/master/MdePkg/Include/Protocol/IScsiInitiatorName.h
https://github.com/tianocore/edk2/blob/master/MdePkg/MdePkg.dec
https://github.com/tianocore/edk2/blob/master/ShellPkg/Include/Guid/ShellVariableGuid.h
https://github.com/tianocore/edk2/blob/master/ShellPkg/ShellPkg.dec
https://github.com/tianocore/edk2/blob/master/NetworkPkg/Include/Guid/IScsiConfigHii.h
https://github.com/tianocore/edk2/blob/master/NetworkPkg/NetworkPkg.dec
https://github.com/tianocore/edk2/blob/master/ShellPkg/Include/Guid/ShellAliasGuid.h
https://github.com/tianocore/edk2/blob/master/ShellPkg/ShellPkg.dec
edk2/UefiRuntimeServicesTableLib.c at master · tianocore/edk2GitHub
edk2/MemoryAllocationLib.c at master · tianocore/edk2GitHub
edk2/MemoryAllocationLib.c at master · tianocore/edk2GitHub
edk2/GlobalVariable.h at master · tianocore/edk2GitHub
edk2/GlobalVariable.h at master · tianocore/edk2GitHub
edk2/MdePkg.dec at master · tianocore/edk2GitHub
Logo
Logo
Logo
Logo
Logo
Logo