
ããããŸãã«ãã®èšäºã§è¡ãããšã§ãããåæã«DXEãã©ã€ããŒãšã¯äœãããããèªåã§äœæãçµã¿ç«ãŠããã¹ãããæ¹æ³ãUEFIã§ã®ããŒããŒãå ¥åãšç»é¢ãžã®åºåã®ä»çµã¿ãæ¥ç¶ãããã¹ãã¬ãŒãžããã€ã¹éã§ãããèŠã€ããæ¹æ³ããã¡ã€ã«ãæžã蟌ãããšãã§ããå ŽæãUEFIãããã¡ã€ã«ã«äœããä¿åããæ¹æ³ãããã³å€éšCã³ãŒãããã¡ãŒã ãŠã§ã¢ã®äžéšãšããŠæ©èœããããã«é©åãããæ¹æ³ã
ããªãããŸã èå³ããããªããç§ã¯ããªãã®äžã§ããªããåŸ ã£ãŠããŸãã
å 責äºé
UEFIã®ãã©ã€ããŒã®äœæãšãããã°ã«ã€ããŠè©±ãåã«ããã¡ãŒã ãŠã§ã¢ã®å®éšã¯å±éºãªããžãã¹ã§ããããã¬ã³ã¬ãã«ã€ãªããå¯èœæ§ããããæãäžå¹žãªå Žåã«ã¯ããŒããŠã§ã¢é害ã«ã€ãªããå¯èœæ§ããããšããã«èšã£ãŠãã䟡å€ããããŸããäºåã«èŠåããŸããããªããããã§èªããã¹ãŠã¯ãããªãèªèº«ã®å±éºãšãªã¹ã¯ã§äœ¿çšããŸããç§ã¯ããªãã®ãã¡ãŒã ãŠã§ã¢ãŸãã¯ããŒãã®æ©èœæ§ã®æ倱ã«å¯ŸããŠè²¬ä»»ãè² ããŸããã ãã¡ãŒã ãŠã§ã¢ã§å®éšãéå§ããåã«ãããã°ã©ãã䜿çšããŠSPIãã©ãã·ã¥ã®å å®¹å šäœã®å®å šãªã³ããŒãäœæããå¿ èŠããããŸãã ãã®æ¹æ³ã§ã®ã¿ããœãããŠã§ã¢ã®é害åŸã®ãã¡ãŒã ãŠã§ã¢ã®æ£åžžãªå埩ãä¿èšŒã§ããŸãã
ããã°ã©ããŒã¯ããªããã DXEãã©ã€ããŒãäœæããŠãããã°ãããå Žåã¯ã OVMF ãVmWare Workstation 12ããŸãã¯UEFIããµããŒããããŠããä»ã®ä»®æ³åã·ã¹ãã ã䜿çšããŠãã ããã
ããã§å¿ èŠãªãã®ãšãããDXEãã©ã€ããŒã§ããçç±
ç§ãã¡ã®ã¿ã¹ã¯ã¯ãç¹å®ã®ããŒã®çµã¿åãããæŒãããšã§ãUEFIã¢ããªã±ãŒã·ã§ã³ã®æäœäžïŒããšãã°BIOSã»ããã¢ããïŒã«ç»é¢å šäœããã¹ã¯ãªãŒã³ã·ã§ãããååŸããæžã蟌ã¿ã¢ã¯ã»ã¹æš©ãæã€ãã¡ã€ã«ã·ã¹ãã ãèŠã€ããŠãçµæã®ã¹ã¯ãªãŒã³ã·ã§ãããä¿åããããšã§ãã äœããã®ã¹ããŒã¿ã¹è¡šç€ºãååŸããã®ãããã§ãããã ãªããªã ã¹ã¯ãªãŒã³ã·ã§ãããæ®ãã«ã¯ãUEFIã¢ããªã±ãŒã·ã§ã³ã®æäœãäžæããå¿ èŠããããŸããUEFIã«ã¯ããªãšã³ããã£ããã«ãã¿ã¹ã¯ããŸã ãªããããããããåé€ããããã°ã©ã èªäœã¯ã¢ããªã±ãŒã·ã§ã³ã«ã¯ãªããŸããããããã£ãŠãDXEãã©ã€ããŒãå¿ èŠã§ãã
ãã®äœæ¥ã®ã¹ããŒã ã¯ãããã次ã®ããã«èšç»ãããŠããŸãã
0 ã ããã¹ãå ¥åïŒããŒã¹ãããŒã¯ãåŠçããããïŒãšã°ã©ãã£ãã¯åºåïŒã¹ã¯ãªãŒã³ã·ã§ãããååŸãããã®ãããããã«ïŒã®åºçŸåŸã«ã®ã¿ããŒãããŸãã
1 LCtrl + LAlt + F12ã®çµã¿åããïŒãŸãã¯å¥œã¿ã«åãããŠïŒã䜿çšå¯èœãªãã¹ãŠã®å ¥åããã¹ãã³ã³ãœãŒã«ã«æŒãããã®ãã³ãã©ãŒãåæããŸãã
2 ã ãã³ãã©ãŒã§ã¯ããã¹ãŠã®åºåã°ã©ãã£ãã¯ã³ã³ãœãŒã«ãèŠã€ãããããããã¹ã¯ãªãŒã³ã·ã§ãããååŸãã PNG圢åŒã«ãšã³ã³ãŒãããŸã ïŒUEFIã¢ããªã±ãŒã·ã§ã³ã¯éåžžæ°çŸäžè²ã䜿çšããªãããããã®åœ¢åŒã®ã¹ã¯ãªãŒã³ã·ã§ããã¯BMPã§æ°ã¡ã¬ãã€ãã§ã¯ãªãæ°åãããã€ãã®ãµã€ãºã§ååŸãããŸãïŒã
ïŒ ã åããã³ãã©ãŒã§ãã«ãŒãã«æžã蟌ãããšãã§ããæåã®ãã¡ã€ã«ã·ã¹ãã ãèŠã€ããããã«åä¿¡ãããã¡ã€ã«ãä¿åããŸãã
æåã«èŠã€ãã£ãFSã§ã¯ãªããããšãã°USBããã€ã¹ã®ã¿ãŸãã¯ESPããŒãã£ã·ã§ã³ã®ã¿ãéžæããããšã§æ©èœãæ¡åŒµããããšãã§ããŸãããããèªè ã«ä»»ããŠãç¬ç«ããŠåäœãããŠãã ããã
SDKãéžæ
UEFIã§åäœããæ°ããã³ãŒããäœæããããã®2ã€ã®ç°ãªãSDKããããŸããUEFIãã©ãŒã©ã ã®æ°ããEDK2ãšãå€ãIntelã³ãŒãã«åºã¥ããç¬ç«ããéçºè ã®GNU-EFIã§ãã ã©ã¡ãã®ãœãªã¥ãŒã·ã§ã³ããCããã³/ãŸãã¯ã¢ã»ã³ãã©ãŒã§ã³ãŒããèšè¿°ããããšãæå³ããŸãããã®å ŽåãçŽç²ãªCãšã®ããåããè©Šã¿ãŸãã
ã©ã®SDKãåªããŠããããå€æããããšã¯ç§ã«ãšã£ãŠã§ã¯ãããŸããããEDK2ã䜿çšããããšããå§ãããŸãã å ¬åŒã§ã¯ãã¹ãã©ãããã©ãŒã ã§ãããå€æŽã®ãœãŒã¹ã«è¿ããããæ°ããæ©èœïŒå€ããã°ã®ä¿®æ£ãšãšãã«ïŒãã¯ããã«éã衚瀺ãããŸãããŸããã³ãŒããäœæãããã¹ãŠã®IBVã§äœ¿çšãããŸãã
EDK2ã¯çµ¶ãéãªãéçºã®éçšã«ããããã©ã³ã¯ã«1æ¥ã«2ã3ã³ããããäžè²«ããŠè¿œå ããŠããŸãããããã§ã¯ææ°ã®ãã¬ã³ãã远跡ããªãããïŒãŸã åäœããŸããïŒããã®ããã«åŸè ã䜿çšããŸãUDK2015ãšåŒã°ããç¬éå®å®ã«ããEDK2 ã
ããŸããŸãªã³ã³ãã€ã©ãŒã«ãã£ãŠã¯ãã¹ãã©ãããã©ãŒã ããã³ãã«ãæ©èœãæäŸããããã«ãEDK2ã¯TXTïŒç°å¢æ§æïŒãDECãDSCããã³FDFïŒããã±ãŒãžæ§æïŒããã³INFïŒã³ã³ããŒãã³ãæ§æïŒæ§æãã¡ã€ã«ã䜿çšããŠåãã©ãããã©ãŒã ã®ã¡ã€ã¯ãã¡ã€ã«ãçæããŸããç©èªããããŠä»ããEDK2ãå ¥æããŠHelloWorldãã¢ã»ã³ãã«ããå¿ èŠããããŸã ãä»ãã詳现ã調ã¹ãã®ãåŸ ã¡ãããªãå Žåã¯ãããã¥ã¡ã³ãã«åŸã£ãŠãã ããã
ãã«ãç°å¢ãã«ã¹ã¿ãã€ãºãã
Cããã³ã¢ã»ã³ãã©ãŒã§ã³ãŒãããã«ãããããã«å¿ èŠãªãœãããŠã§ã¢ã¯ãã§ã«ãã·ã³ã«ã€ã³ã¹ããŒã«ãããŠããããšãç解ãããŠããŸãã ããã§ãªãå ŽåãWindowsãŠãŒã¶ãŒã¯Windowsãã¹ã¯ãããçšVisual Studio 2013 Expressãã€ã³ã¹ããŒã«ããããšããå§ãããŸã; Linuxããã³OSXãŠãŒã¶ãŒã¯GCC 4.4-4.9ããã³NASMãå¿ èŠã§ãã
ããããã¹ãŠãæ¢ã«ã€ã³ã¹ããŒã«ãããŠããå Žåã¯ã UDK2015ãããŠã³ããŒãããUDK2015.MyWorkSpace.zipã®ãã¹ãŠã®ã³ã³ãã³ãããã¡ã€ã«ãäœæããæš©éãããå ŽæïŒå°ãªããšããã¹ã¯ããããŸãã¯ããŒã ãã£ã¬ã¯ããªã«çŽæ¥ïŒã«è§£åãã BaseToolsïŒWindowsïŒã®ã³ã³ãã³ãã解åããã ãã§ãã .zipãŸãã¯BaseToolsïŒUnix.zipïŒãåã®æé ã§ååŸããMyWorkSpaceãã£ã¬ã¯ããªã«è¿œå ãã UDK2015ãªã©ã§é©åãªååã«å€æŽããŸãã
ã¿ãŒããã«ãéããæ°ããäœæãããUDK2015ãã£ã¬ã¯ããªã«ç§»åããŠã edksetup.bat ïŒãŸãã¯.sh ïŒ ã¹ã¯ãªãããå®è¡ããŸã ãããã«ãããããã¹ããã¡ã€ã«ã®ã»ãããConfãµããã£ã¬ã¯ããªã«ã³ããŒãããŸããtools_def.txtããã³target.txtã«æ³šç®ããŸãã
æåã®ãã¡ã€ã«ã¯ååã«å€§ãããã¢ã»ã³ããªãŒç°å¢ã«å¿ èŠãªã³ã³ãã€ã©ãŒCããã³ASL ãã¢ã»ã³ãã©ãŒããªã³ã«ãŒãªã©ãžã®ãã¹ãæã€ç°å¢å€æ°ã®å®çŸ©ãå«ãŸããŠããŸãã å¿ èŠã«å¿ããŠãããã«ç€ºãããŠãããã¹ãä¿®æ£ããããç¬èªã®ãŠãŒãã£ãªãã£ã»ããïŒããããToolChain ïŒãè¿œå ã§ããŸãããç§ã®ã¢ããã€ã¹ãèããå Žåã¯ãVS2013ïŒ32ãããWindowsã®å ŽåïŒãŸãã¯VS2013x86ïŒã§64ãããWindowsã®å ŽåïŒããŸãã¯GCC44 | ... | GCC49ïŒGCCã®ããŒãžã§ã³ã«å¿ããŠã gcc --versionã«å¿ããŠèŠªåã«è¡šç€ºãããŸãïŒã
2çªç®ã®ãã¡ã€ã«ã«ã¯ããã©ã«ãã®ã¢ã»ã³ããªèšå®ãå«ãŸããŠããã次ã®å€ãèšå®ããããšããå§ãããŸãã
ACTIVE_PLATFROM = MdeModulePkg/MdeModulePkg.dsc # TARGET = RELEASE # TARGET_ARCH = X64 # DXE 64-, TOOL_CHAN_TAG = VS2013x86 # | VS2013 | GCC44 | ... | GCC49 | YOUR_FANCY_TOOLCHAIN,
UDK2015ã§å¥ã®ã¿ãŒããã«ãéããLinux / OSXã§æ¬¡ã®ã³ãã³ããå®è¡ããŸãã Windowsã®å Žåããã©ã¡ãŒã¿ãŒã®ãªãéåžžã®edksetup.batã§ååã§ãã. edksetup.sh BaseTools
ããã§ããã¹ãŠãæ£ããå®è¡ãããå Žåã ãã«ãã³ãã³ãã䜿çšããŠãã«ãç°å¢ããã¹ãããäžå®æéåŸã«æ¬¡ã®ãããªã¡ãã»ãŒãžã§çµäºããŸãã
[ å®äº]ã®ä»£ããã«[ 倱æ]ã衚瀺ãããå Žåãèšå®ã«åé¡ããããŸãã Windowsã®VS2013x86ããã³Xubuntu 14.04.3- OIAã® GCC48ã§äžèšã確èªããŸããã- Done - Build end time: ... Build total time: ...
ãããžã§ã¯ãæ§é
EDK2ã®ã¢ããªã±ãŒã·ã§ã³ãšãã©ã€ããŒã¯åå¥ã«ã¢ã»ã³ãã«ãããã®ã§ã¯ãªããããããããã±ãŒãžã®äžéšãšããŠãã€ãŸã ããã±ãŒãžã ã¢ããªã±ãŒã·ã§ã³èªäœã«å ããŠãããã±ãŒãžã«ã¯ãã©ã€ãã©ãªãããããŒãã¡ã€ã«ã®ã»ãããããã³ããã±ãŒãžã®æ§æãšãã®å 容ã®èª¬æãèšè¿°ããããã¡ã€ã«ãå«ãŸããŸãã ããã¯ãããŸããŸãªãã©ã€ããŒãšã¢ããªã±ãŒã·ã§ã³ãããŸããŸãªã©ã€ãã©ãªãŒå®è£ ã䜿çšããŠãããŸããŸãªããããŒãã¡ã€ã«ãšGUIDã«ã¢ã¯ã»ã¹ã§ããããã«ããããã«è¡ãããŸãã MdeModulePkgã䜿çšããŸããããã¯ãã¢ãŒããã¯ãã£ãšããŒããŠã§ã¢ã«äŸåããªãéåžžã«äžè¬çãªããã±ãŒãžã§ããããã©ã€ããŒãçµã¿èŸŒãããšãã§ããã°ãUEFI 2.1以éã®å®è£ ã§åäœããããšãã»ãŒä¿èšŒãããŸãã ãã®ã¢ãããŒãã®æ¬ ç¹ã¯ããã®äžã®ã»ãšãã©ã®ã©ã€ãã©ãªïŒããšãã°ããããã°åºåãååŸããããã«äœ¿çšãããDebugLibïŒãåãªãã¹ã¿ãã§ããããã®ãããªå¿ èŠãçããå Žåã¯èªåã§äœæããå¿ èŠãããããšã§ãã
ãã©ã€ããŒããã«ãããã«ã¯ããã«ãããå¿ èŠã®ããã©ã€ãã©ãªããããã³ã«ããã¡ã€ã«ã«é¢ããæ å ±ãå«ãINFãã¡ã€ã«ãå¿ èŠã§ãããŸãããã®INFãã¡ã€ã«ãžã®ãã¹ãããã±ãŒãžã®DSCãã¡ã€ã«ã«è¿œå ããŠãã¢ã»ã³ããªã·ã¹ãã ããã®INFãèªèã§ããããã«ããŸããã¡ã€ã«ã¯ã
æåŸããå§ããŸãããããã¡ã€ã«UDK2015 / MdeModulePkg / MdeModulePkg.dscãéããŠã[Components]ã»ã¯ã·ã§ã³ãŸã§ã¹ã¯ããŒã«ããŸãïŒæ€çŽ¢ã§èŠã€ããããšãã§ããŸã-é«éã§ãïŒã ãã®ã»ã¯ã·ã§ã³ã«ã¯ãããã±ãŒãžã«å±ãããã¹ãŠã®ãã¡ã€ã«ãé çªã«ãªã¹ããããŸã;ã»ã¯ã·ã§ã³ã®å é ã¯æ¬¡ã®ããã«ãªããŸãã
ããã«å°æ¥ã®INFãã¡ã€ã«ãã UDK2015ã«å¯Ÿããçžå¯Ÿãã¹ãšãšãã«è¿œå ããŸãã MScreenModuleDkgã§CrScreenshotDxeãã©ã«ããŒãçŽæ¥äœæããINFãã¡ã€ã«ã«CrScreenshotDxe.infãšããååãä»ããããšãææ¡ããŸãã ãæ³åã®ãšãããCrã¯CodeRushã®åºèº«ã§ããããã®èšäºã®èè ã¯è¬èã§ãã çµæã¯æ¬¡ã®ããã«ãªããŸãã[Components] MdeModulePkg/Application/HelloWorld/HelloWorld.inf MdeModulePkg/Application/MemoryProfileInfo/MemoryProfileInfo.inf ...
å€æŽãä¿åããDSCãã¡ã€ã«ãéããŸãããããã°åºåãæ§æããããªãå Žåã¯ããããå€æŽããŸããããããã¯ãŸã£ããå¥ã®è©±ã§ãã[Components] MdeModulePkg/CrScreenshotDxe/CrScreenshotDxe.inf MdeModulePkg/Application/HelloWorld/HelloWorld.inf MdeModulePkg/Application/MemoryProfileInfo/MemoryProfileInfo.inf ...
次ã«ãINFãã¡ã€ã«èªäœãå ¥åããå¿ èŠããããŸãã
ãã®ããã«ãªããŸã
äžèšã®CrScreenshotDxe.sãã¡ã€ã«ãäœæããŸãã [Defines] # INF_VERSION = 0x00010005 # , 1.5 BASE_NAME = CrScreenshotDxe # FILE_GUID = cab058df-e938-4f85-8978-1f7e6aabdb96 # GUID MODULE_TYPE = DXE_DRIVER # VERSION_STRING = 1.0 # ENTRY_POINT = CrScreenshotDxeEntry # [Sources.common] # , common - CrScreenshotDxe.c # #... # , - , PNG, [Packages] # MdePkg/MdePkg.dec # , UEFI MdeModulePkg/MdeModulePkg.dec # , [LibraryClasses] # UefiBootServicesTableLib # UEFI Boot Services gBS UefiRuntimeServicesTableLib # UEFI Runtime services gRT UefiDriverEntryPoint # UEFI-, , DebugLib # DEBUG PrintLib # UnicodeSPrint, snprintf [Protocols] # gEfiGraphicsOutputProtocolGuid # gEfiSimpleTextInputExProtocolGuid # gEfiSimpleFileSystemProtocolGuid # [Depex] # , , gEfiGraphicsOutputProtocolGuid AND # , gEfiSimpleTextInputExProtocolGuid #
ãã®ã³ã³ãã³ãã§
ä»ããbuildã³ãã³ããç¹°ãè¿ããå Žåãæåããå¿
èŠããããŸããããã§ãªããã°ãäœãééã£ãããšãããŸããã
#include <Uefi.h> #include <Library/DebugLib.h> #include <Library/PrintLib.h> #include <Library/UefiDriverEntryPoint.h> #include <Library/UefiBootServicesTableLib.h> #include <Library/UefiRuntimeServicesTableLib.h> #include <Protocol/GraphicsOutput.h> #include <Protocol/SimpleTextInEx.h> #include <Protocol/SimpleFileSystem.h> EFI_STATUS EFIAPI CrScreenshotDxeEntry ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { return EFI_SUCCESS; }
ããŠãæåŸã«ããã©ã€ããŒçšã®ç©ºçœããããã³ãŒãã®äœæã«çŽæ¥é²ãããšãã§ããŸãã ãã®ãããªã¢ã»ã³ããªã·ã¹ãã ã¯åœ¹ã«ç«ããªãããšã¯æããã§ãããããã¹ããã¡ã€ã«ãç·šéããŠäœæ¥ããããšã¯ããŸãå¿«é©ã§ã¯ãªããããåIBVã«ã¯EDK2ã¢ã»ã³ããªã·ã¹ãã ãææ°ã®IDEã«çµ±åããç¬èªã®ãœãªã¥ãŒã·ã§ã³ããããŸããããšãã°ãAMI Visual eBIOSç°å¢ã¯ããã«ã¯Eclipseãã©ã°ã€ã³ãå«ãŸããPhoenixãšInsydeã«ã¯Visual Studioãå«ãŸããŠããŸãã
æåãªã³ã³ãã¥ãŒã¿ãŒã»ãã¥ãªãã£ã®å°é家ã§ããAlex Ionescuã«ãã£ãŠäœæãããçŽ æŽãããVisualUefiãããžã§ã¯ãããŸã ãããŸããVisualStudioã奜ããªãããã²è©ŠããŠã¿ãããšããå§ãããŸãããä»ã®ãšããããŒãã³ã¢ã䜿ãç¶ãããªãŒã«ãã¹ã¯ãŒã«ã®ç²Ÿç¥ãç¶æããŸãã
ããŒã¹ãããŒã¯ãžã®å¯Ÿå¿
ããã§ã¯ãã¹ãŠãéåžžã«ç°¡åã§ãïŒãã©ã€ããŒãèªã¿èŸŒããšãã SimpleTextInputExãããã³ã«ã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ããœãŒãããŸããããã¯ãããã€ãã®ããŒããŒããã·ã¹ãã ã«æ¥ç¶ãããŠããå Žåã§ããããŒããŒããã©ã€ããŒã«ãã£ãŠå ¬éãããŸãã ããã«ããããããã念ã®ãããå©çšå¯èœãªãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ããœãŒãããå¿çããããŒã®çµã¿åããããã©ã¡ãŒã¿ãŒãšããŠåãå ¥ããåé¢æ°RegisterKeyNotifyãšãæŒããåŸã«åŒã³åºãããã³ãŒã«ããã¯é¢æ°ãžã®ãã€ã³ã¿ãŒãåŒã³åºããçµã¿åãããå¿ èŠã§ãããã¹ãŠã®äž»èŠãªäœæ¥ã¯ãã§ã«å®äºããŠããŸãã
ãã·ã¢èªããCã«ç¿»èš³
ã³ã³ãã€ã«ãæåãããã«ã¯ã åŸè¿°ã®TakeScreenshotããã³ShowStatusé¢æ°ã§ã¯ãŸã ååã§ã¯ãããŸããã
EFI_STATUS EFIAPI CrScreenshotDxeEntry ( IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable ) { EFI_STATUS Status; EFI_KEY_DATA KeyStroke; UINTN HandleCount; EFI_HANDLE *HandleBuffer = NULL; UINTN i; // Set keystroke to be LCtrl+LAlt+F12 KeyStroke.Key.ScanCode = SCAN_F12; KeyStroke.Key.UnicodeChar = 0; KeyStroke.KeyState.KeyShiftState = EFI_SHIFT_STATE_VALID | EFI_LEFT_CONTROL_PRESSED | EFI_LEFT_ALT_PRESSED; KeyStroke.KeyState.KeyToggleState = 0; // Locate all SimpleTextInEx protocols Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiSimpleTextInputExProtocolGuid, NULL, &HandleCount, &HandleBuffer); if (EFI_ERROR (Status)) { DEBUG((-1, "CrScreenshotDxeEntry: gBS->LocateHandleBuffer returned %r\n", Status)); return EFI_UNSUPPORTED; } // For each instance for (i = 0; i < HandleCount; i++) { EFI_HANDLE Handle; EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *SimpleTextInEx; // Get protocol handle Status = gBS->HandleProtocol (HandleBuffer[i], &gEfiSimpleTextInputExProtocolGuid, (VOID **) &SimpleTextInEx); if (EFI_ERROR (Status)) { DEBUG((-1, "CrScreenshotDxeEntry: gBS->HandleProtocol[%d] returned %r\n", i, Status)); continue; } // Register key notification function Status = SimpleTextInEx->RegisterKeyNotify( SimpleTextInEx, &KeyStroke, TakeScreenshot, &Handle); if (EFI_ERROR (Status)) { DEBUG((-1, "CrScreenshotDxeEntry: SimpleTextInEx->RegisterKeyNotify[%d] returned %r\n", i, Status)); } } // Free memory used for handle buffer if (HandleBuffer) gBS->FreePool(HandleBuffer); // Show driver loaded ShowStatus(0xFF, 0xFF, 0xFF); // White return EFI_SUCCESS; }
æžã蟌ã¿ã¢ã¯ã»ã¹ããã¡ã€ã«ãžã®ããŒã¿æžã蟌ã¿ãå¯èœãªFSãæ¢ããŠããŸã
å©çšå¯èœãªã°ã©ãã£ãã¯ã³ã³ãœãŒã«ãæ¢ããŠãããããã¹ã¯ãªãŒã³ã·ã§ãããæ®ãåã«ããããã®åãã¹ã¯ãªãŒã³ã·ã§ãããã©ããã«ä¿åã§ãããã©ããã確èªããå¿ èŠããããŸãã ãããè¡ãã«ã¯ã SimpleFileSystemãããã³ã«ã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ãæ€çŽ¢ããŸããSimpleFileSystemãããã³ã«ã¯ãFSããã¡ãŒã ãŠã§ã¢ã«èªèãããŠããæ€åºãããåããªã¥ãŒã ã®PartitionDxeãã©ã€ããŒã«ãã£ãŠå ¬éãããŸãã ã»ãšãã©ã®å Žåãæ¢ç¥ã®FSã¯FAT12 / 16/32ãã¡ããªïŒFAT32ã®ã¿ïŒã®ã¿ã§ãããUEFIèŠæ Œã«åŸã£ãŠESPã«äœ¿çšã§ããŸãã 次ã«ãèŠã€ãã£ãFSã«æžã蟌ãããšãã§ããããšã確èªããå¿ èŠããããŸããããŸããŸãªæ¹æ³ã§ãããè¡ãããšãã§ããŸããæãç°¡åãªæ¹æ³ã¯ããã®äžã«ãã¡ã€ã«ãäœæããèªã¿åãããã³æžã蟌ã¿çšã«éãããšã§ãããããæ©èœããå Žåããã®FSã«æžã蟌ãããšãã§ããŸã ãã¡ããããã®ãœãªã¥ãŒã·ã§ã³ã¯æé©ã§ã¯ãããŸããããæ©èœãããããæŒç¿ãšããŠèªè ã«æ£ããå®è£ ãæäŸãããŸãã
åã³ãã·ã¢èªããCã«ç¿»èš³ãã
ãã®ã³ãŒãã¯ä»ã«äœãå¿
èŠãšããããã®ãŸãŸæ©èœããŸãã
EFI_STATUS EFIAPI FindWritableFs ( OUT EFI_FILE_PROTOCOL **WritableFs ) { EFI_HANDLE *HandleBuffer = NULL; UINTN HandleCount; UINTN i; // Locate all the simple file system devices in the system EFI_STATUS Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiSimpleFileSystemProtocolGuid, NULL, &HandleCount, &HandleBuffer); if (!EFI_ERROR (Status)) { EFI_FILE_PROTOCOL *Fs = NULL; // For each located volume for (i = 0; i < HandleCount; i++) { EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFs = NULL; EFI_FILE_PROTOCOL *File = NULL; // Get protocol pointer for current volume Status = gBS->HandleProtocol(HandleBuffer[i], &gEfiSimpleFileSystemProtocolGuid, (VOID **) &SimpleFs); if (EFI_ERROR (Status)) { DEBUG((-1, "FindWritableFs: gBS->HandleProtocol[%d] returned %r\n", i, Status)); continue; } // Open the volume Status = SimpleFs->OpenVolume(SimpleFs, &Fs); if (EFI_ERROR (Status)) { DEBUG((-1, "FindWritableFs: SimpleFs->OpenVolume[%d] returned %r\n", i, Status)); continue; } // Try opening a file for writing Status = Fs->Open(Fs, &File, L"crsdtest.fil", EFI_FILE_MODE_CREATE | EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE, 0); if (EFI_ERROR (Status)) { DEBUG((-1, "FindWritableFs: Fs->Open[%d] returned %r\n", i, Status)); continue; } // Writable FS found Fs->Delete(File); *WritableFs = Fs; Status = EFI_SUCCESS; break; } } // Free memory if (HandleBuffer) { gBS->FreePool(HandleBuffer); } return Status; }
ã°ã©ãã£ã«ã«ã³ã³ãœãŒã«ãæ¢ããŠããããã®ã¹ã¯ãªãŒã³ã·ã§ãããæ®ããŸã
ã¹ã¯ãªãŒã³ã·ã§ãããä¿åãããã®ãããããšã確èªããããããããåé€ããŸãããã ãããè¡ãã«ã¯ãååºåããã€ã¹ã«ã€ããŠãGOPãã©ã€ããŒããã³VideoBIOSã«ãã£ãŠå ¬éãããGOPãããã³ã«ã®ãã¹ãŠã®ã€ã³ã¹ã¿ã³ã¹ïŒããæ£ç¢ºã«ã¯ããããã³ã«ã«ã€ããŠäœãç¥ããªãVBIOSèªäœã§ã¯ãªããå€ãVBIOSãšUEFIã®éã®ã¬ã€ã€ãŒãå®è£ ããConSplitterãã©ã€ããŒïŒããœãŒãããå¿ èŠããããŸãã°ã©ãã£ãã¯ã¹ä»ãã ãã®ãããã³ã«ã«ã¯ã æåã®ç»åã®ã¿ãå¿ èŠã«ãªããŸã§ãã¬ãŒã ãããã¡ãšã®éã§ç»åãã³ããŒããããã®Bltæ©èœããããŸãã åããããã³ã«ã®Modeãªããžã§ã¯ãã䜿çšãããšãç®çã®ãµã€ãºã®ãããã¡ãŒãéžæããç»é¢ã®äžéšããã§ã¯ãªãç»é¢å šäœããã¹ã¯ãªãŒã³ã·ã§ãããæ®ãã®ã«å¿ èŠãªçŸåšã®ç»é¢è§£å床ãååŸã§ããŸãã ã¹ã¯ãªãŒã³ã·ã§ãããåãåã£ãã®ã§ãå®å šã«é»ã§ã¯ãªãããšã確èªãã䟡å€ããããŸãããã®ãããªãã®ãä¿åãããšãFSã§æéãšã¹ããŒã¹ãç¡é§ã«æ¶è²»ãããããã§ãããã€ã³ãã§å¿ èŠãªãµã€ãºã®é»ãé·æ¹åœ¢ãæç»ã§ããŸãã 次ã«ãç»åãBGRïŒBltãæäŸããïŒããRGBïŒPNGãšã³ã³ãŒããå¿ èŠãšããïŒã«å€æããå¿ èŠããããŸããããããªããšãã¹ã¯ãªãŒã³ã·ã§ããã®è²ãééã£ãŠããŸããŸãã å€æåŸã«ååŸããç»åããšã³ã³ãŒãããåã®æé ã§èŠã€ãããã¡ã€ã«ã·ã¹ãã äžã®ãã¡ã€ã«ã«ä¿åããŸãã çŸåšã®æ¥æãã8.3圢åŒã§ãã¡ã€ã«åãåéãããããããã¹ã¯ãªãŒã³ã·ã§ãããå¥ã®ã¹ã¯ãªãŒã³ã·ã§ãããäžæžãããå¯èœæ§ã¯äœããªããŸãã
åã³ãã·ã¢èªããCã«ç¿»èš³ãã
Lodepng_encode32ã¯äœæ¥ãšShowStatusã«æ¢ã«ååã§ã¯ãããŸããããç¶ç¶ããŸãã
EFI_STATUS EFIAPI TakeScreenshot ( IN EFI_KEY_DATA *KeyData ) { EFI_FILE_PROTOCOL *Fs = NULL; EFI_FILE_PROTOCOL *File = NULL; EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput = NULL; EFI_GRAPHICS_OUTPUT_BLT_PIXEL *Image = NULL; UINTN ImageSize; // Size in pixels UINT8 *PngFile = NULL; UINTN PngFileSize; // Size in bytes EFI_STATUS Status; UINTN HandleCount; EFI_HANDLE *HandleBuffer = NULL; UINT32 ScreenWidth; UINT32 ScreenHeight; CHAR16 FileName[8+1+3+1]; // 0-terminated 8.3 file name EFI_TIME Time; UINTN i, j; // Find writable FS Status = FindWritableFs(&Fs); if (EFI_ERROR (Status)) { DEBUG((-1, "TakeScreenshot: Can't find writable FS\n")); ShowStatus(0xFF, 0xFF, 0x00); // Yellow return EFI_SUCCESS; } // Locate all instances of GOP Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiGraphicsOutputProtocolGuid, NULL, &HandleCount, &HandleBuffer); if (EFI_ERROR (Status)) { DEBUG((-1, "ShowStatus: Graphics output protocol not found\n")); return EFI_SUCCESS; } // For each GOP instance for (i = 0; i < HandleCount; i++) { do { // Break from do used instead of "goto error" // Handle protocol Status = gBS->HandleProtocol(HandleBuffer[i], &gEfiGraphicsOutputProtocolGuid, (VOID **) &GraphicsOutput); if (EFI_ERROR (Status)) { DEBUG((-1, "ShowStatus: gBS->HandleProtocol[%d] returned %r\n", i, Status)); break; } // Set screen width, height and image size in pixels ScreenWidth = GraphicsOutput->Mode->Info->HorizontalResolution; ScreenHeight = GraphicsOutput->Mode->Info->VerticalResolution; ImageSize = ScreenWidth * ScreenHeight; // Get current time Status = gRT->GetTime(&Time, NULL); if (!EFI_ERROR(Status)) { // Set file name to current day and time UnicodeSPrint(FileName, 26, L"%02d%02d%02d%02d.png", Time.Day, Time.Hour, Time.Minute, Time.Second); } else { // Set file name to scrnshot.png UnicodeSPrint(FileName, 26, L"scrnshot.png"); } // Allocate memory for screenshot Status = gBS->AllocatePool(EfiBootServicesData, ImageSize * sizeof(EFI_GRAPHICS_OUTPUT_BLT_PIXEL), (VOID **)&Image); if (EFI_ERROR(Status)) { DEBUG((-1, "TakeScreenshot: gBS->AllocatePool returned %r\n", Status)); break; } // Take screenshot Status = GraphicsOutput->Blt(GraphicsOutput, Image, EfiBltVideoToBltBuffer, 0, 0, 0, 0, ScreenWidth, ScreenHeight, 0); if (EFI_ERROR(Status)) { DEBUG((-1, "TakeScreenshot: GraphicsOutput->Blt returned %r\n", Status)); break; } // Check for pitch black image (it means we are using a wrong GOP) for (j = 0; j < ImageSize; j++) { if (Image[j].Red != 0x00 || Image[j].Green != 0x00 || Image[j].Blue != 0x00) break; } if (j == ImageSize) { DEBUG((-1, "TakeScreenshot: GraphicsOutput->Blt returned pitch black image, skipped\n")); ShowStatus(0x00, 0x00, 0xFF); // Blue break; } // Open or create output file Status = Fs->Open(Fs, &File, FileName, EFI_FILE_MODE_CREATE | EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE, 0); if (EFI_ERROR (Status)) { DEBUG((-1, "TakeScreenshot: Fs->Open of %s returned %r\n", FileName, Status)); break; } // Convert BGR to RGBA with Alpha set to 0xFF for (j = 0; j < ImageSize; j++) { UINT8 Temp = Image[j].Blue; Image[j].Blue = Image[j].Red; Image[j].Red = Temp; Image[j].Reserved = 0xFF; } // Encode raw RGB image to PNG format j = lodepng_encode32(&PngFile, &PngFileSize, (CONST UINT8*)Image, ScreenWidth, ScreenHeight); if (j) { DEBUG((-1, "TakeScreenshot: lodepng_encode32 returned %d\n", j)); break; } // Write PNG image into the file and close it Status = File->Write(File, &PngFileSize, PngFile); File->Close(File); if (EFI_ERROR(Status)) { DEBUG((-1, "TakeScreenshot: File->Write returned %r\n", Status)); break; } // Show success ShowStatus(0x00, 0xFF, 0x00); // Green } while(0); // Free memory if (Image) gBS->FreePool(Image); if (PngFile) gBS->FreePool(PngFile); Image = NULL; PngFile = NULL; } // Show error if (EFI_ERROR(Status)) ShowStatus(0xFF, 0x00, 0x00); // Red return EFI_SUCCESS; }
ç»åãPNG圢åŒã§ãšã³ã³ãŒãããŸã
ã³ãŒããèšè¿°ããæè¯ã®æ¹æ³ã¯ãã³ãŒããèšè¿°ããªãããšã§ãããã®ããã lodepngãšåŒã°ããPNGã®ãšã³ã³ãŒãããã³ãã³ãŒãçšã®æ¢è£œã®ã©ã€ãã©ãªã䜿çšããŠã¿ãŸãããã ããŠã³ããŒãããCãã¡ã€ã«ã®æšªã«çœ®ãã lodepng.hãšlodepng.cã®è¡ã[Sources.common] ã»ã¯ã·ã§ã³ã®INFãã¡ã€ã«ã«è¿œå ããããããŒãã¡ã€ã«ãå«ããŸãã...äœãã³ã³ãã€ã«ããŸãããæšæºã®Cèšèªã©ã€ãã©ãªã¯ãã®ããã«ããŠå®å šã«åé€ã§ããŸãã åããŠä»äžããŸãã
lodepng.hã®å é ã«ã次ãè¿œå ããŸãã
#include <Uefi.h> // UEFI #define LODEPNG_NO_COMPILE_DECODER // PNG #define LODEPNG_NO_COMPILE_DISK // , .. fopen/fwrite #define LODEPNG_NO_COMPILE_ALLOCATORS // malloc/realloc/free, .. #define LODEPNG_NO_COMPILE_ERROR_TEXT // #define LODEPNG_NO_COMPILE_ANCILLARY_CHUNKS // PNG, .. #if !defined(_MSC_VER) // size_t GCC, MS #define size_t UINTN #endif
ãããŠãè¡ã#include <string.h>ã§ã³ã¡ã³ãã¢ãŠãããŸãã ãããããããŸããã ãã¡ãããããã«type_tåãå®çŸ©ããããšã§åãååã®ããŒã«ã«ãã¡ã€ã«ãäœæã§ããŸãããå€æŽãå§ããŠããã®ã§å€æŽããŸãã
Lodepng.cã¯ããå°ãè€éã§ã size_tã«å ããŠãæšæºã©ã€ãã©ãªãããmemsetãmemcpyãmallocãreallocãfreeãqsortãå¿ èŠã§ãããæµ®åå°æ°ç¹èšç®ã䜿çšããŸãã Qsortã®å®è£ ã¯Appleãããã©ãã°ã§ããã¡ã¢ãªé¢æ°ã¯gBS-> CopyMem ã gBS-> SetMem ã gBS-> AllocatePoolããã³gBS-> FreePoolã®ã©ãããŒã«ããããšãã§ããFPUã§ã®äœæ¥ã«ã€ããŠéç¥ããã«ã¯CONST INT32å®æ°ãå®çŸ©ããå¿ èŠããããŸã_fltused = 0; ããã§ãªããã°ããªã³ã«ãŒã¯åœŒå¥³ã®äžåšãèªããŸãã æšæºã®#includesã䜿çšããŠãã¡ã€ã«ã«ã³ã¡ã³ããä»ããããšã«ã€ããŠã¯ãã話ããŠããŸããããã¹ãŠãæ確ã§ãã
Qsort.cãåãæ¹æ³ã§éåžžã®æŠéã«éå ãããŸããããã.infãã¡ã€ã«ã«è¿œå ããããšãå¿ããªãã§ãã ããã
ã¹ããŒã¿ã¹ã衚瀺ãã
ShowStatusé¢æ°ãèšè¿°ããã®ã¯æ®ãããã©ã€ããŒã®æºåã¯å®äºã§ãã ãã®åãã¹ããŒã¿ã¹ã¯ããŸããŸãªæ¹æ³ã§ååŸã§ããŸããããšãã°ãPOSTãšã³ã³ãŒããŒã«æ¥ç¶ãããŠããCPU IOããŒã80hã§0x00ãã0xFFãŸã§ã®æ°åãåºåããŸããã誰ããæã£ãŠããããã§ã¯ãããŸããããã©ãããããã§ã¯ãŸã£ããçºçããŸããã ã¹ããŒã«ãŒããããããšã¯ã§ããŸãããããã¯ãŸããã©ãããã©ãŒã ã«äŸåããŠããã2çªç®ã«ã¹ã¯ãªãŒã³ã·ã§ããã2ææ®ã£ãåŸãç§ãæ¿æãããŸãã ããŒããŒãã®ã©ã€ããç¹æ» ãããããšãã§ããŸããããã¯èªè ã«ãšã£ãŠè¿œå ã®ã¿ã¹ã¯ã§ãããã®ã°ã©ãã£ãã¯ã³ã³ãœãŒã«ãä»ããŠã°ã©ãã£ãã¯ã³ã³ãœãŒã«ãçŽæ¥æäœããç¶æ ã衚瀺ããŸããç»é¢ã®å·Šäžé ã«ç®çã®è²ã®å°ããªåè§åœ¢ã衚瀺ããŸãã ãã®å Žåãçœãåè§ã¯ããã©ã€ããŒãæ£åžžã«ããŒããããŸããããé»è²-ãèšé²æ©èœã®ãªãFSããé-ãçŸåšã®ã³ã³ãœãŒã«ã®ã¹ã¯ãªãŒã³ã·ã§ããã¯å®å šã«é»ã§ãä¿åããŠãæå³ããããŸããããèµ€-ããšã©ãŒãçºçããŸããããæåŸã«ç·-ãæå³ããŸãã¹ã¯ãªãŒã³ã·ã§ãããæ®ã£ãŠä¿åããŸãããã ãã¹ãŠã®ã³ã³ãœãŒã«ã§ãã®åè§åœ¢ã衚瀺ãããã°ããããŠãããäžæžããããã€ã¡ãŒãžã®äžéšã埩å ããå¿ èŠããããŸãã
ååããã·ã¢èªããCã«ç¿»èš³ããŸãã
ããã§ãã¹ãŠãæºåãæŽããæ£åžžã«å®è¡ãããŸãããæºåãæŽããŸã§èŠãããGitHubããæ¢è£œã®ãã©ã€ããŒãããŠã³ããŒãããŠèªåã®ãã©ã€ããŒãšæ¯èŒããããããã€ãã®å€æŽã説æããã®ãå¿ããŠããŸããã
EFI_STATUS EFIAPI ShowStatus ( IN UINT8 Red, IN UINT8 Green, IN UINT8 Blue ) { // Determines the size of status square #define STATUS_SQUARE_SIDE 5 UINTN HandleCount; EFI_HANDLE *HandleBuffer = NULL; EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput = NULL; EFI_GRAPHICS_OUTPUT_BLT_PIXEL Square[STATUS_SQUARE_SIDE * STATUS_SQUARE_SIDE]; EFI_GRAPHICS_OUTPUT_BLT_PIXEL Backup[STATUS_SQUARE_SIDE * STATUS_SQUARE_SIDE]; UINTN i; // Locate all instances of GOP EFI_STATUS Status = gBS->LocateHandleBuffer(ByProtocol, &gEfiGraphicsOutputProtocolGuid, NULL, &HandleCount, &HandleBuffer); if (EFI_ERROR (Status)) { DEBUG((-1, "ShowStatus: Graphics output protocol not found\n")); return EFI_UNSUPPORTED; } // Set square color for (i = 0 ; i < STATUS_SQUARE_SIDE * STATUS_SQUARE_SIDE; i++) { Square[i].Blue = Blue; Square[i].Green = Green; Square[i].Red = Red; Square[i].Reserved = 0x00; } // For each GOP instance for (i = 0; i < HandleCount; i ++) { // Handle protocol Status = gBS->HandleProtocol(HandleBuffer[i], &gEfiGraphicsOutputProtocolGuid, (VOID **) &GraphicsOutput); if (EFI_ERROR (Status)) { DEBUG((-1, "ShowStatus: gBS->HandleProtocol[%d] returned %r\n", i, Status)); continue; } // Backup current image GraphicsOutput->Blt(GraphicsOutput, Backup, EfiBltVideoToBltBuffer, 0, 0, 0, 0, STATUS_SQUARE_SIDE, STATUS_SQUARE_SIDE, 0); // Draw the status square GraphicsOutput->Blt(GraphicsOutput, Square, EfiBltBufferToVideo, 0, 0, 0, 0, STATUS_SQUARE_SIDE, STATUS_SQUARE_SIDE, 0); // Wait 500ms gBS->Stall(500*1000); // Restore the backup GraphicsOutput->Blt(GraphicsOutput, Backup, EfiBltBufferToVideo, 0, 0, 0, 0, STATUS_SQUARE_SIDE, STATUS_SQUARE_SIDE, 0); } return EFI_SUCCESS; }
UEFIã·ã§ã«ã§çµæããã¹ããã
UDK2015 / Build / MdeModulePkg / RELEASE / X64 / MdeModulePkg / CrScreenshotDxe / CrScreenshotDxe / OUTPUTããã¢ã»ã³ãã«ããããã©ã€ããŒãååŸããŸããããããå¿ èŠãªãã¡ã€ã«ã¯2ã€ã ãã§ããCrScreenshotDxe.efiãã©ã€ããŒèªäœãšã CrScreenspexDeã®äŸåé¢ä¿ã»ã¯ã·ã§ã³ã§ãã
æåã«ãUEFIã·ã§ã«ãããã©ã€ããŒã®åäœããã¹ãããŸãã UEFIã·ã§ã«ã䜿çšããŠãã¡ã€ã«CrScreenshotDxe.efiãUSBã¹ãã£ãã¯ã«ã³ããŒããããŒãããŠã fs0ïŒã§ãã©ãã·ã¥ãã©ã€ãã®ã«ãŒãã«ç§»åããŸãïŒã·ã¹ãã ã«æ¥ç¶ãããŠãããã£ã¹ã¯ã®æ°ã«å¿ããŠæ°ãå€ããå ŽåããããŸãïŒ ãload CrScreenshotDxe.efiã³ãã³ããå®è¡ããŸã ã æåã¡ãã»ãŒãžã衚瀺ãããç»é¢ã®äžéšé ã«çœãåè§ãç¹æ» ããŠããå Žåã¯ããã©ã€ããŒã皌åäžã§ããããšãæå³ããŸãã ç§ã«ãšã£ãŠã¯ãã®ããã«èŠããŸãïŒ
UEFIã·ã§ã«
ãã®ã¹ã¯ãªãŒã³ã·ã§ããã¯ãåŸç¶ã®ãã¹ãŠã®ã¹ã¯ãªãŒã³ã·ã§ãããšåæ§ã«ããã©ã€ããŒãæ®åœ±ãããã®ã§ãããããã³ãŒããŒã®åè§ã¯è¡šç€ºãããŸããã
次ã«ã LCtrl + LAlt + F12ã倧èã«æŒããŠãã¹ããŒã¿ã¹ã確èªããŸãã AMIã·ã¹ãã ã§ã¯ãã°ã©ãã£ãã¯ã³ã³ãœãŒã«ã1ã€ãããªããããç·è²ã®åè§åœ¢ãç¹æ»
ãã1åã®çµã¿åããã§1ã€ã®ã¹ã¯ãªãŒã³ã·ã§ãããååŸããŸãã PhoenixãšInsydeã䜿çšããŠããã·ã¹ãã ã§ã¯ã2ã€ã®ã°ã©ãã£ãã¯ã³ã³ãœãŒã«ãããããã®ãã¡ã®1ã€ã¯ç©ºã§ãããããæåã«éãæ£æ¹åœ¢ã次ã«ç·ã®æ£æ¹åœ¢ã衚瀺ãããŸãããã¹ã¯ãªãŒã³ã·ã§ããã1ã€ãããããŸããã UEFIã·ã§ã«ããã®ãã¹ãçµæã¯åãããã«èŠããŸãã解å床ã¯800x600ã§ã¯ãªãã1366x768ã§ãã

ãã®ã¹ã¯ãªãŒã³ã·ã§ããã¯ãåŸç¶ã®ãã¹ãŠã®ã¹ã¯ãªãŒã³ã·ã§ãããšåæ§ã«ããã©ã€ããŒãæ®åœ±ãããã®ã§ãããããã³ãŒããŒã®åè§ã¯è¡šç€ºãããŸããã
ããŠããã¹ãŠãã·ã§ã«ããæ©èœãã次ã®ããã«UEFIã¢ããªã±ãŒã·ã§ã³ããã¹ã¯ãªãŒã³ã·ã§ãããååŸã§ããŸãã
RU.efi

å€æŽããããã¡ãŒã ãŠã§ã¢ã§çµæããã¹ããã
æ®å¿µãªãããBIOSã»ããã¢ããã®ã¹ã¯ãªãŒã³ã·ã§ããã¯ãã®æ¹æ³ã§ã¯åé€ã§ããŸãã-ãã©ã€ããŒã®èªã¿èŸŒã¿ãé ãããŸãã 2ã€ã®è§£æ±ºçããããŸãã1ã€ç®ã¯ã UEFIToolã䜿çšããŠãã¡ãŒã ãŠã§ã¢ã®DXEããªã¥ãŒã ã®äŸåé¢ä¿ã»ã¯ã·ã§ã³ãšå ±ã«ãã©ã€ããŒãè¿œå ããããšã§ãã2ã€ç®ã¯ãPCIeããã€ã¹ã®OptionROMã«è¿œå ããããšã§ãããã®åŸããã¡ãŒã ãŠã§ã¢ã®å€æŽã¯äžèŠã§ããåŸã§å¿ èŠãªéçãå ¥æãããã2çªç®ã®æ¹æ³ãå®è£ ããããšããŸãããæåã®æ¹æ³ã«ã¯åé¡ã¯ãããŸãããUSBãã©ãã·ã¥ãã©ã€ããæ¿å ¥ã瞫補ãéå§ãã¹ãã£ãã¯ããBIOSã»ããã¢ããã«ç§»åããLCtrl + LAlt + F12ãæŒããŸã- åºæ¥äžãããéãšç·ã®æ£æ¹åœ¢ã衚瀺ããããã¹ãŠãæ©èœããŸããçµæã¯æ¬¡ã®ããã«ãªããŸãã
ãã¹ã¯ãŒãå
¥åãã©ãŒã

æ
å ±ã¿ã

ã¡ã€ã³ã¿ã

ã»ãã¥ãªãã£ã¿ã

ããŒãã¿ã

çµäºã¿ã
ããã¯æåã§ãã玳士ã

ãããã«
ãã©ã€ããŒãäœæãããã³ãŒããGitHubã«æçš¿ãããOptionROMã§ã¢ã€ãã¢ã確èªããããã«æ®ãããããã¯ã¯éããããŠãããšèšããŸãã
ããã§äœãèµ·ãã£ãŠããã®ããŸã ç解ã§ããªãå Žåã¯ãã³ãŒãã«ãã°ãèŠã€ããŸãããããŸãã¯èšäºãèè ãUEFIã®æ¥µæªãããŸãã¯ã¬ã¬ã·ãŒBIOSã§ã©ãã ãè¯ãã£ãã®ããè°è«ãããã ãã§ããã³ã¡ã³ããæè¿ããŸãã
èªè ã®çããã®æ³šæãè¯ãDXEãã©ã€ããŒã«æè¬ããŸãã