mirror of
https://github.com/ventoy/Ventoy.git
synced 2026-06-29 14:38:12 +00:00
Compare commits
9 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2f66a309e4 | ||
|
|
aa75cdac7d | ||
|
|
ccf4f7234a | ||
|
|
c1cad99584 | ||
|
|
d9cab1cb33 | ||
|
|
18f4c8afcc | ||
|
|
aeb46cd3c8 | ||
|
|
475de1dada | ||
|
|
31648a0d4b |
@@ -37,12 +37,70 @@ else
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
if [ -e $VTEFI_PATH ]; then
|
if [ -e $VTEFI_PATH ]; then
|
||||||
|
|
||||||
|
objdump -h "$VTEFI_PATH"
|
||||||
|
echo ""
|
||||||
|
|
||||||
objcopy \
|
objcopy \
|
||||||
--add-section .sbat="MdeModulePkg/Application/VtoyShim/sbat.csv" \
|
--add-section .sbat="MdeModulePkg/Application/VtoyShim/sbat.csv" \
|
||||||
--set-section-flags .sbat=alloc,load,readonly,data \
|
--set-section-flags .sbat=alloc,load,readonly,data \
|
||||||
"$VTEFI_PATH" "$DST_PATH"
|
"$VTEFI_PATH" "$DST_PATH"
|
||||||
|
|
||||||
objcopy --adjust-section-vma .sbat=0x1000 "$DST_PATH"
|
#find the right sbat section VMA
|
||||||
|
tmpfile=$(mktemp)
|
||||||
|
|
||||||
|
cnt1=$(objdump -h "$DST_PATH" | grep -P '^\s*[0-9][0-9]* \.' | wc -l)
|
||||||
|
cnt2=$(objdump -h "$DST_PATH" | grep -P 'ALLOC' | wc -l)
|
||||||
|
|
||||||
|
if [ $cnt1 -ne $cnt2 ]; then
|
||||||
|
echo "Section count mismatch $cnt1 $cnt2"
|
||||||
|
objdump -h "$DST_PATH"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
objdump -h "$DST_PATH" | grep -P '^\s*[0-9][0-9]* \.' > $tmpfile
|
||||||
|
sbat_size=$(stat -c '%s' MdeModulePkg/Application/VtoyShim/sbat.csv)
|
||||||
|
sbat_size_hex=$(printf '0x%08x' $sbat_size)
|
||||||
|
|
||||||
|
lmax='0000000000000000'
|
||||||
|
lsize='0000000000000000'
|
||||||
|
while read line; do
|
||||||
|
echo $line
|
||||||
|
lbase=$(echo $line | awk '{print $4}')
|
||||||
|
if expr "$lmax" \< "$lbase" > /dev/null; then
|
||||||
|
lmax=$lbase
|
||||||
|
lsize=$(echo $line | awk '{print $3}')
|
||||||
|
fi
|
||||||
|
echo "max=$lmax size=$lsize"
|
||||||
|
done < $tmpfile
|
||||||
|
rm -f $tmpfile
|
||||||
|
|
||||||
|
|
||||||
|
lvma=$((0x${lsize}+0x${lmax}))
|
||||||
|
lvma_align=`printf '0x%08x' $(( (lvma + 4095) / 4096 * 4096 ))`
|
||||||
|
echo "sbat section lvma_align=$lvma_align"
|
||||||
|
|
||||||
|
objcopy --adjust-section-vma .sbat=$lvma_align "$DST_PATH"
|
||||||
|
|
||||||
|
img_base=$(objdump -p "$DST_PATH" | grep ImageBase | awk '{print $2}')
|
||||||
|
size_img=0x$(objdump -p "$DST_PATH" | grep SizeOfImage | awk '{print $2}')
|
||||||
|
sbat_end=`printf '0x%08x' $(($lvma_align+$sbat_size_hex))`
|
||||||
|
|
||||||
|
if [ "$img_base" != "0000000000000000" ]; then
|
||||||
|
echo "#### ImageBase is not 0 $img_base"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "size_img=$size_img sbat_size=$sbat_size_hex sbat_range $lvma_align - $sbat_end"
|
||||||
|
|
||||||
|
if expr "$size_img" \< "$sbat_end" > /dev/null; then
|
||||||
|
echo "SizeOfImage $size_img less than sbat section addr $sbat_end"
|
||||||
|
exit 1
|
||||||
|
else
|
||||||
|
echo "SizeOfImage $size_img >= $sbat_end is OK"
|
||||||
|
fi
|
||||||
|
|
||||||
|
objdump -h "$DST_PATH"
|
||||||
|
|
||||||
echo -e '\n\n====================== SUCCESS ========================\n\n'
|
echo -e '\n\n====================== SUCCESS ========================\n\n'
|
||||||
|
|
||||||
|
|||||||
@@ -1232,25 +1232,58 @@ EFI_STATUS EFIAPI ventoy_boot(IN EFI_HANDLE ImageHandle)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if defined (MDE_CPU_X64)
|
#if defined (MDE_CPU_X64)
|
||||||
STATIC BOOLEAN EFIAPI CheckVtoyShim(VOID)
|
|
||||||
|
STATIC BOOLEAN EFIAPI IsSecureBootEnabled(VOID)
|
||||||
{
|
{
|
||||||
UINT8 SecureBoot = 0;
|
UINT8 SecureBoot = 0;
|
||||||
UINTN DataSize;
|
UINTN DataSize;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_GUID Guid = VTOY_SHIM_POLICY_GUID;
|
|
||||||
VOID *Prot = NULL;
|
|
||||||
|
|
||||||
DataSize = sizeof(SecureBoot);
|
DataSize = sizeof(SecureBoot);
|
||||||
Status = gST->RuntimeServices->GetVariable(L"SecureBoot", &gEfiGlobalVariableGuid, NULL,
|
Status = gST->RuntimeServices->GetVariable(L"SecureBoot", &gEfiGlobalVariableGuid, NULL,
|
||||||
&DataSize, &SecureBoot);
|
&DataSize, &SecureBoot);
|
||||||
if (!EFI_ERROR(Status) && SecureBoot)
|
if (EFI_ERROR(Status))
|
||||||
{
|
{
|
||||||
Status = gBS->LocateProtocol(&Guid, NULL, (VOID**)&Prot);
|
return FALSE;
|
||||||
if (EFI_ERROR(Status))
|
}
|
||||||
{
|
|
||||||
VtoyDebug("Failed to locate Vtoy Shim Protocol %lx\r\n", Status);
|
return SecureBoot ? TRUE : FALSE;
|
||||||
return FALSE;
|
}
|
||||||
}
|
|
||||||
|
STATIC BOOLEAN EFIAPI IsSetupMode(VOID)
|
||||||
|
{
|
||||||
|
UINT8 SetupMode = 0;
|
||||||
|
UINTN DataSize;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
DataSize = sizeof(SetupMode);
|
||||||
|
Status = gST->RuntimeServices->GetVariable(L"SetupMode", &gEfiGlobalVariableGuid, NULL,
|
||||||
|
&DataSize, &SetupMode);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SetupMode ? TRUE : FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
STATIC BOOLEAN EFIAPI CheckVtoyShim(VOID)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_GUID Guid = VTOY_SHIM_POLICY_GUID;
|
||||||
|
VOID *Prot = NULL;
|
||||||
|
|
||||||
|
/* If secure boot is not enabled or in SetupMode, nothing needed */
|
||||||
|
if (!IsSecureBootEnabled() || IsSetupMode())
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = gBS->LocateProtocol(&Guid, NULL, (VOID**)&Prot);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
VtoyDebug("Failed to locate Vtoy Shim Protocol %lx\r\n", Status);
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|||||||
@@ -35,14 +35,16 @@
|
|||||||
#define CUR_SBAT_VER 1
|
#define CUR_SBAT_VER 1
|
||||||
|
|
||||||
STATIC EFI_GUID gVtoySbatGUID = { 0xf755068a, 0xe04f, 0x452b, { 0x9d, 0x6d, 0x7c, 0x55, 0x96, 0xb3, 0xc0, 0x7d }};
|
STATIC EFI_GUID gVtoySbatGUID = { 0xf755068a, 0xe04f, 0x452b, { 0x9d, 0x6d, 0x7c, 0x55, 0x96, 0xb3, 0xc0, 0x7d }};
|
||||||
STATIC EFI_DEVICE_PATH_TO_TEXT_PROTOCOL *gDpToText = NULL;
|
STATIC EFI_GUID gShimLockGUID = SHIM_LOCK_GUID;
|
||||||
STATIC EFI_DEVICE_PATH_FROM_TEXT_PROTOCOL *gTextToDp = NULL;
|
|
||||||
STATIC EFI_SECURITY_FILE_AUTHENTICATION_STATE gSysSecFileAuth = NULL;
|
STATIC EFI_SECURITY_FILE_AUTHENTICATION_STATE gSysSecFileAuth = NULL;
|
||||||
STATIC EFI_SECURITY2_FILE_AUTHENTICATION gSysSec2FileAuth = NULL;
|
STATIC EFI_SECURITY2_FILE_AUTHENTICATION gSysSec2FileAuth = NULL;
|
||||||
STATIC BOOLEAN gVtoyByPassSB = FALSE; /* must be FALSE by default for revoke */
|
STATIC BOOLEAN gVtoyByPassSB = FALSE; /* must be FALSE by default for revoke */
|
||||||
STATIC VTOY_SHIM gVtoyShimProtocol;
|
STATIC VTOY_SHIM gVtoyShimProtocol;
|
||||||
STATIC EFI_HANDLE gVtoyShimProtHandle;
|
STATIC EFI_HANDLE gVtoyShimProtHandle;
|
||||||
STATIC SHIM_LOCK *gShimLock = NULL;
|
STATIC SHIM_LOCK gShimLock;
|
||||||
|
|
||||||
|
STATIC EFI_EXIT_BOOT_SERVICES gSysExitBootServices = NULL;
|
||||||
|
STATIC EFI_GET_VARIABLE gSysGetVariable = NULL;
|
||||||
|
|
||||||
STATIC VOID EFIAPI VtoyLog(CONST CHAR16 *Format, ...)
|
STATIC VOID EFIAPI VtoyLog(CONST CHAR16 *Format, ...)
|
||||||
{
|
{
|
||||||
@@ -66,7 +68,7 @@ STATIC VOID EFIAPI DumpDevicePath(const EFI_DEVICE_PATH_PROTOCOL *DevicePath)
|
|||||||
{
|
{
|
||||||
CHAR16 *DPStr = NULL;
|
CHAR16 *DPStr = NULL;
|
||||||
|
|
||||||
DPStr = gDpToText->ConvertDevicePathToText(DevicePath, TRUE, TRUE);
|
DPStr = ConvertDevicePathToText(DevicePath, TRUE, TRUE);
|
||||||
if (DPStr)
|
if (DPStr)
|
||||||
{
|
{
|
||||||
vLog(L"%s", DPStr);
|
vLog(L"%s", DPStr);
|
||||||
@@ -95,8 +97,11 @@ STATIC VOID EFIAPI ShowSBWarning(BOOLEAN Reboot, const EFI_DEVICE_PATH_PROTOCOL
|
|||||||
if (Reboot)
|
if (Reboot)
|
||||||
{
|
{
|
||||||
vLog(L"\r\n###### Press Enter to reboot... ######");
|
vLog(L"\r\n###### Press Enter to reboot... ######");
|
||||||
gST->ConIn->Reset(gST->ConIn, FALSE);
|
if (gST->ConIn)
|
||||||
gBS->WaitForEvent(1, &gST->ConIn->WaitForKey, &Index);
|
{
|
||||||
|
gST->ConIn->Reset(gST->ConIn, FALSE);
|
||||||
|
gBS->WaitForEvent(1, &gST->ConIn->WaitForKey, &Index);
|
||||||
|
}
|
||||||
gRT->ResetSystem(EfiResetWarm, EFI_SECURITY_VIOLATION, 0, NULL);
|
gRT->ResetSystem(EfiResetWarm, EFI_SECURITY_VIOLATION, 0, NULL);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
@@ -129,7 +134,6 @@ STATIC VOID * EFIAPI FindShimFuncAddr(UINT64 FuncOffset)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
EFI_STATUS EFIAPI LaunchRealGrub(EFI_HANDLE ImageHandle, CONST CHAR16 *FileName)
|
EFI_STATUS EFIAPI LaunchRealGrub(EFI_HANDLE ImageHandle, CONST CHAR16 *FileName)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
@@ -156,7 +160,7 @@ EFI_STATUS EFIAPI LaunchRealGrub(EFI_HANDLE ImageHandle, CONST CHAR16 *FileName)
|
|||||||
goto END;
|
goto END;
|
||||||
}
|
}
|
||||||
|
|
||||||
DevDpStr = gDpToText->ConvertDevicePathToText(DeviceDP, FALSE, TRUE);
|
DevDpStr = ConvertDevicePathToText(DeviceDP, FALSE, TRUE);
|
||||||
if (!DevDpStr)
|
if (!DevDpStr)
|
||||||
{
|
{
|
||||||
vLog(L"Failed to convert device path to text");
|
vLog(L"Failed to convert device path to text");
|
||||||
@@ -175,7 +179,7 @@ EFI_STATUS EFIAPI LaunchRealGrub(EFI_HANDLE ImageHandle, CONST CHAR16 *FileName)
|
|||||||
|
|
||||||
UnicodeSPrint(NewDpStr, BufferSize, L"%s/EFI/BOOT/%s", DevDpStr, FileName);
|
UnicodeSPrint(NewDpStr, BufferSize, L"%s/EFI/BOOT/%s", DevDpStr, FileName);
|
||||||
|
|
||||||
TargetDp = gTextToDp->ConvertTextToDevicePath(NewDpStr);
|
TargetDp = ConvertTextToDevicePath(NewDpStr);
|
||||||
if (!TargetDp)
|
if (!TargetDp)
|
||||||
{
|
{
|
||||||
vLog(L"Failed to convert new text <%s> to device path", NewDpStr);
|
vLog(L"Failed to convert new text <%s> to device path", NewDpStr);
|
||||||
@@ -200,9 +204,9 @@ EFI_STATUS EFIAPI LaunchRealGrub(EFI_HANDLE ImageHandle, CONST CHAR16 *FileName)
|
|||||||
|
|
||||||
END:
|
END:
|
||||||
|
|
||||||
CheckBSFreePool(DevDpStr);
|
CheckFreePool(DevDpStr);
|
||||||
CheckFreePool(NewDpStr);
|
CheckFreePool(NewDpStr);
|
||||||
CheckBSFreePool(TargetDp);
|
CheckFreePool(TargetDp);
|
||||||
|
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
@@ -243,7 +247,7 @@ STATIC EFI_STATUS EFIAPI ReadAuthFile
|
|||||||
goto END;
|
goto END;
|
||||||
}
|
}
|
||||||
|
|
||||||
DpStr = gDpToText->ConvertDevicePathToText(DevPath, FALSE, TRUE);
|
DpStr = ConvertDevicePathToText(DevPath, FALSE, TRUE);
|
||||||
if (!DpStr)
|
if (!DpStr)
|
||||||
{
|
{
|
||||||
Status = EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
@@ -311,7 +315,7 @@ END:
|
|||||||
}
|
}
|
||||||
|
|
||||||
CheckFreePool(TmpPath);
|
CheckFreePool(TmpPath);
|
||||||
CheckBSFreePool(DpStr);
|
CheckFreePool(DpStr);
|
||||||
|
|
||||||
if (EFI_ERROR(Status))
|
if (EFI_ERROR(Status))
|
||||||
{
|
{
|
||||||
@@ -332,7 +336,7 @@ STATIC BOOLEAN VtoyCheckRevoke(VOID *Buffer, UINTN Size)
|
|||||||
UINT32 uiVer = 0;
|
UINT32 uiVer = 0;
|
||||||
EFI_IMAGE_DOS_HEADER *DosHead = (EFI_IMAGE_DOS_HEADER *)Buffer;
|
EFI_IMAGE_DOS_HEADER *DosHead = (EFI_IMAGE_DOS_HEADER *)Buffer;
|
||||||
|
|
||||||
if (Size > sizeof(EFI_IMAGE_DOS_HEADER))
|
if (Size > sizeof(EFI_IMAGE_DOS_HEADER) && DosHead->e_magic == 0x5A4D)
|
||||||
{
|
{
|
||||||
if (CompareMem(DosHead->e_res2, &gVtoySbatGUID, 16) == 0)
|
if (CompareMem(DosHead->e_res2, &gVtoySbatGUID, 16) == 0)
|
||||||
{
|
{
|
||||||
@@ -386,12 +390,12 @@ STATIC EFI_STATUS EFIAPI SecurityPolicyAuth
|
|||||||
* Use shim verify API.
|
* Use shim verify API.
|
||||||
* If it's OK, it may be signed with a MOK key. (e.g. Ventoy EFI files)
|
* If it's OK, it may be signed with a MOK key. (e.g. Ventoy EFI files)
|
||||||
*/
|
*/
|
||||||
if (gShimLock && gShimLock->Verify)
|
if (gShimLock.Verify)
|
||||||
{
|
{
|
||||||
Status = ReadAuthFile(DevicePathConst, &Buffer, &Size);
|
Status = ReadAuthFile(DevicePathConst, &Buffer, &Size);
|
||||||
if (!EFI_ERROR(Status))
|
if (!EFI_ERROR(Status))
|
||||||
{
|
{
|
||||||
Status = gShimLock->Verify(Buffer, Size);
|
Status = gShimLock.Verify(Buffer, Size);
|
||||||
if (!EFI_ERROR(Status))
|
if (!EFI_ERROR(Status))
|
||||||
{
|
{
|
||||||
bRevokeChkOK = VtoyCheckRevoke(Buffer, Size);
|
bRevokeChkOK = VtoyCheckRevoke(Buffer, Size);
|
||||||
@@ -448,11 +452,11 @@ STATIC EFI_STATUS EFIAPI Security2PolicyAuth
|
|||||||
* Use shim verify API.
|
* Use shim verify API.
|
||||||
* If it's OK, it may be signed with a MOK key. (e.g. Ventoy EFI files)
|
* If it's OK, it may be signed with a MOK key. (e.g. Ventoy EFI files)
|
||||||
*/
|
*/
|
||||||
if (gShimLock && gShimLock->Verify)
|
if (gShimLock.Verify)
|
||||||
{
|
{
|
||||||
if (FileBuffer && FileSize > 0 && FileSize < 0xFFFFFFFFUL)
|
if (FileBuffer && FileSize > 0 && FileSize < 0xFFFFFFFFUL)
|
||||||
{
|
{
|
||||||
Status = gShimLock->Verify(FileBuffer, (UINT32)FileSize);
|
Status = gShimLock.Verify(FileBuffer, (UINT32)FileSize);
|
||||||
if (!EFI_ERROR(Status))
|
if (!EFI_ERROR(Status))
|
||||||
{
|
{
|
||||||
bRevokeChkOK = VtoyCheckRevoke(FileBuffer, FileSize);
|
bRevokeChkOK = VtoyCheckRevoke(FileBuffer, FileSize);
|
||||||
@@ -522,13 +526,13 @@ STATIC VOID EFIAPI UnHookSecurityPolicy(VOID)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Security2 && gSysSec2FileAuth)
|
if (Security2 && gSysSec2FileAuth && Security2->FileAuthentication == Security2PolicyAuth)
|
||||||
{
|
{
|
||||||
Security2->FileAuthentication = gSysSec2FileAuth;
|
Security2->FileAuthentication = gSysSec2FileAuth;
|
||||||
gSysSec2FileAuth = NULL;
|
gSysSec2FileAuth = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Security && gSysSecFileAuth)
|
if (Security && gSysSecFileAuth && Security->FileAuthenticationState == SecurityPolicyAuth)
|
||||||
{
|
{
|
||||||
Security->FileAuthenticationState = gSysSecFileAuth;
|
Security->FileAuthenticationState = gSysSecFileAuth;
|
||||||
gSysSecFileAuth = NULL;
|
gSysSecFileAuth = NULL;
|
||||||
@@ -599,47 +603,38 @@ STATIC BOOLEAN EFIAPI IsSecureBootEnabled(VOID)
|
|||||||
return SecureBoot ? TRUE : FALSE;
|
return SecureBoot ? TRUE : FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
STATIC EFI_STATUS EFIAPI EnvInit(VOID)
|
STATIC BOOLEAN EFIAPI IsSetupMode(VOID)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
UINT8 SetupMode = 0;
|
||||||
|
UINTN DataSize;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
Status = gBS->LocateProtocol(&gEfiDevicePathToTextProtocolGuid, NULL, (VOID**)&gDpToText);
|
DataSize = sizeof(SetupMode);
|
||||||
if (EFI_ERROR(Status) || !gDpToText || !gDpToText->ConvertDevicePathToText)
|
Status = gST->RuntimeServices->GetVariable(L"SetupMode", &gEfiGlobalVariableGuid, NULL,
|
||||||
|
&DataSize, &SetupMode);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
{
|
{
|
||||||
vLog(L"Failed to locate PathToText Protocol %lx", Status);
|
return FALSE;
|
||||||
return Status;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = gBS->LocateProtocol(&gEfiDevicePathFromTextProtocolGuid, NULL, (VOID**)&gTextToDp);
|
return SetupMode ? TRUE : FALSE;
|
||||||
if (EFI_ERROR(Status) || !gTextToDp || !gTextToDp->ConvertTextToDevicePath)
|
|
||||||
{
|
|
||||||
vLog(L"Failed to locate PathFromText Protocol %lx", Status);
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
return EFI_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
STATIC EFI_STATUS EFIAPI ShimEfiMain
|
||||||
EFI_STATUS EFIAPI VtoyShimEfiMain
|
|
||||||
(
|
(
|
||||||
IN EFI_HANDLE ImageHandle,
|
IN EFI_HANDLE ImageHandle,
|
||||||
IN EFI_SYSTEM_TABLE *SystemTable
|
IN EFI_SYSTEM_TABLE *SystemTable,
|
||||||
|
IN BOOLEAN IsSecureBoot,
|
||||||
|
IN BOOLEAN IsSetup
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_GUID Guid = SHIM_LOCK_GUID;
|
SHIM_LOCK *ShimLock = NULL;
|
||||||
unhook_system_services_pf Func = NULL;
|
shim_void_func_pf Func1 = NULL;
|
||||||
|
shim_void_func_pf Func2 = NULL;
|
||||||
|
|
||||||
Status = EnvInit();
|
/* If secure boot is not enabled or in SetupMode, nothing needed, just launch Ventoy grub */
|
||||||
if (EFI_ERROR(Status))
|
if (!IsSecureBoot || IsSetup)
|
||||||
{
|
|
||||||
vErr(L"Failed to prepare env");
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If secure boot is not enabled, nothing needed, just launch Ventoy grub */
|
|
||||||
if (!IsSecureBootEnabled())
|
|
||||||
{
|
{
|
||||||
Status = LaunchRealGrub(ImageHandle, REAL_GRUB_FILE);
|
Status = LaunchRealGrub(ImageHandle, REAL_GRUB_FILE);
|
||||||
if (EFI_ERROR(Status))
|
if (EFI_ERROR(Status))
|
||||||
@@ -649,13 +644,18 @@ EFI_STATUS EFIAPI VtoyShimEfiMain
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
Status = gBS->LocateProtocol(&Guid, NULL, (VOID**)&gShimLock);
|
/* We must be launched by shim */
|
||||||
if (EFI_ERROR(Status) || !gShimLock)
|
Status = gBS->LocateProtocol(&gShimLockGUID, NULL, (VOID**)&ShimLock);
|
||||||
|
if (EFI_ERROR(Status) || !ShimLock)
|
||||||
{
|
{
|
||||||
vErr(L"Failed to locate SHIM LOCK Protocol %lx", Status);
|
vErr(L"Failed to locate SHIM LOCK Protocol %lx", Status);
|
||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Backup shim Lock because we will remove it later */
|
||||||
|
gShimLock.Verify = ShimLock->Verify;
|
||||||
|
gShimLock.Hash = ShimLock->Hash;
|
||||||
|
gShimLock.Context = ShimLock->Context;
|
||||||
|
|
||||||
Status = InstallVtoyShimProtocol();
|
Status = InstallVtoyShimProtocol();
|
||||||
if (EFI_ERROR(Status))
|
if (EFI_ERROR(Status))
|
||||||
@@ -679,15 +679,17 @@ EFI_STATUS EFIAPI VtoyShimEfiMain
|
|||||||
* It may break in future versions of shim, and a better approach may exist.
|
* It may break in future versions of shim, and a better approach may exist.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
Func = FindShimFuncAddr(NM_UNHOOK_SYSTEM_SERVICES_OFFSET);
|
Func1 = FindShimFuncAddr(NM_UNHOOK_SYSTEM_SERVICES_OFFSET);
|
||||||
if (!Func)
|
Func2 = FindShimFuncAddr(NM_UNINSTALL_SHIM_PROTOCOLS_OFFSET);
|
||||||
|
if (!Func1 || !Func2)
|
||||||
{
|
{
|
||||||
vErr(L"Can not find shim unhook_system_services");
|
vErr(L"Can not find shim func %p %p", Func1, Func2);
|
||||||
Status = EFI_NOT_FOUND;
|
Status = EFI_NOT_FOUND;
|
||||||
goto END;
|
goto END;
|
||||||
}
|
}
|
||||||
|
|
||||||
Func(); /* call shim unhook_system_services() */
|
Func1(); /* call shim unhook_system_services() */
|
||||||
|
Func2(); /* call shim uninstall_shim_protocols() */
|
||||||
|
|
||||||
|
|
||||||
/* Hook the system security policy */
|
/* Hook the system security policy */
|
||||||
@@ -716,3 +718,83 @@ END:
|
|||||||
return Status;
|
return Status;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
STATIC EFI_STATUS EFIAPI VtoyExitBootServices
|
||||||
|
(
|
||||||
|
IN EFI_HANDLE ImageHandle,
|
||||||
|
IN UINTN MapKey
|
||||||
|
)
|
||||||
|
{
|
||||||
|
UnHookSecurityPolicy();
|
||||||
|
UnInstallVtoyShimProtocol();
|
||||||
|
|
||||||
|
gST->RuntimeServices->GetVariable = gSysGetVariable;
|
||||||
|
gBS->ExitBootServices = gSysExitBootServices;
|
||||||
|
|
||||||
|
return gSysExitBootServices(ImageHandle, MapKey);
|
||||||
|
}
|
||||||
|
|
||||||
|
EFI_STATUS EFIAPI VtoyGetVariable
|
||||||
|
(
|
||||||
|
IN CHAR16 *VariableName,
|
||||||
|
IN EFI_GUID *VendorGuid,
|
||||||
|
OUT UINT32 *Attributes, OPTIONAL
|
||||||
|
IN OUT UINTN *DataSize,
|
||||||
|
OUT VOID *Data OPTIONAL
|
||||||
|
)
|
||||||
|
{
|
||||||
|
BOOLEAN bChk = FALSE;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
if (gVtoyByPassSB && VariableName && VendorGuid && DataSize && Data && (*DataSize) > 0)
|
||||||
|
{
|
||||||
|
bChk = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = gSysGetVariable(VariableName, VendorGuid, Attributes, DataSize, Data);
|
||||||
|
if (bChk && (!EFI_ERROR(Status)))
|
||||||
|
{
|
||||||
|
if (CompareMem(&gShimLockGUID, VendorGuid, 16) == 0 &&
|
||||||
|
StrCmp(VariableName, L"MokSBState") == 0)
|
||||||
|
{
|
||||||
|
*(UINT8 *)Data = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
EFI_STATUS EFIAPI VtoyShimEfiMain
|
||||||
|
(
|
||||||
|
IN EFI_HANDLE ImageHandle,
|
||||||
|
IN EFI_SYSTEM_TABLE *SystemTable
|
||||||
|
)
|
||||||
|
{
|
||||||
|
BOOLEAN IsSetup = FALSE;
|
||||||
|
BOOLEAN IsSecureBoot = FALSE;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
IsSetup = IsSetupMode();
|
||||||
|
IsSecureBoot = IsSecureBootEnabled();
|
||||||
|
|
||||||
|
if (!IsSecureBoot || IsSetup)
|
||||||
|
{
|
||||||
|
Status = ShimEfiMain(ImageHandle, SystemTable, IsSecureBoot, IsSetup);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
gSysExitBootServices = gBS->ExitBootServices;
|
||||||
|
gBS->ExitBootServices = VtoyExitBootServices;
|
||||||
|
|
||||||
|
gSysGetVariable = gST->RuntimeServices->GetVariable;
|
||||||
|
gST->RuntimeServices->GetVariable = VtoyGetVariable;
|
||||||
|
|
||||||
|
Status = ShimEfiMain(ImageHandle, SystemTable, IsSecureBoot, IsSetup);
|
||||||
|
|
||||||
|
gBS->ExitBootServices = gSysExitBootServices;
|
||||||
|
gST->RuntimeServices->GetVariable = gSysGetVariable;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -66,19 +66,21 @@ typedef struct _SHIM_IMAGE_LOADER {
|
|||||||
EFI_IMAGE_UNLOAD UnloadImage;
|
EFI_IMAGE_UNLOAD UnloadImage;
|
||||||
} SHIM_IMAGE_LOADER;
|
} SHIM_IMAGE_LOADER;
|
||||||
|
|
||||||
typedef VOID (*unhook_system_services_pf)(VOID);
|
typedef VOID (*shim_void_func_pf)(VOID);
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The two offset here are extract from the shim file which used in Ventoy.
|
* The two offset here are extract from the shim file which used in Ventoy.
|
||||||
* nm BOOTX64.EFI | grep shim_load_image
|
* nm BOOTX64.EFI | grep shim_load_image
|
||||||
* nm BOOTX64.EFI | grep unhook_system_services
|
* nm BOOTX64.EFI | grep unhook_system_services
|
||||||
|
* nm BOOTX64.EFI | grep uninstall_shim_protocols
|
||||||
*
|
*
|
||||||
* It means that they must be updated every time Ventoy update the shim file.
|
* It means that they must be updated every time Ventoy update the shim file.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
#define NM_SHIM_LOAD_IMAGE_OFFSET 0x2dc12
|
#define NM_SHIM_LOAD_IMAGE_OFFSET 0x2dc12
|
||||||
#define NM_UNHOOK_SYSTEM_SERVICES_OFFSET 0x2e278
|
#define NM_UNHOOK_SYSTEM_SERVICES_OFFSET 0x2e278
|
||||||
|
#define NM_UNINSTALL_SHIM_PROTOCOLS_OFFSET 0x26264
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -95,15 +97,6 @@ do { \
|
|||||||
}\
|
}\
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define CheckBSFreePool(p) \
|
|
||||||
do { \
|
|
||||||
if (p) { \
|
|
||||||
gBS->FreePool(p); \
|
|
||||||
(p) = NULL; \
|
|
||||||
}\
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define VTOY_SHIM_POLICY_GUID {0x90a29d14, 0x3968, 0x48fe, { 0x85, 0x81, 0x6b, 0x7f, 0x7d, 0xc4, 0x70, 0x55 }};
|
#define VTOY_SHIM_POLICY_GUID {0x90a29d14, 0x3968, 0x48fe, { 0x85, 0x81, 0x6b, 0x7f, 0x7d, 0xc4, 0x70, 0x55 }};
|
||||||
|
|
||||||
|
|||||||
@@ -146,25 +146,59 @@ STATIC EFI_STATUS ParseCmdline(IN EFI_HANDLE ImageHandle)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if defined (MDE_CPU_X64)
|
#if defined (MDE_CPU_X64)
|
||||||
STATIC BOOLEAN EFIAPI CheckVtoyShim(VOID)
|
|
||||||
|
STATIC BOOLEAN EFIAPI IsSecureBootEnabled(VOID)
|
||||||
{
|
{
|
||||||
UINT8 SecureBoot = 0;
|
UINT8 SecureBoot = 0;
|
||||||
UINTN DataSize;
|
UINTN DataSize;
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_GUID Guid = VTOY_SHIM_POLICY_GUID;
|
|
||||||
VOID *Prot = NULL;
|
|
||||||
|
|
||||||
DataSize = sizeof(SecureBoot);
|
DataSize = sizeof(SecureBoot);
|
||||||
Status = gST->RuntimeServices->GetVariable(L"SecureBoot", &gEfiGlobalVariableGuid, NULL,
|
Status = gST->RuntimeServices->GetVariable(L"SecureBoot", &gEfiGlobalVariableGuid, NULL,
|
||||||
&DataSize, &SecureBoot);
|
&DataSize, &SecureBoot);
|
||||||
if (!EFI_ERROR(Status) && SecureBoot)
|
if (EFI_ERROR(Status))
|
||||||
{
|
{
|
||||||
Status = gBS->LocateProtocol(&Guid, NULL, (VOID**)&Prot);
|
return FALSE;
|
||||||
if (EFI_ERROR(Status))
|
}
|
||||||
{
|
|
||||||
gST->ConOut->OutputString(gST->ConOut, L"Can not locate Vtoy Shim\r\n");
|
return SecureBoot ? TRUE : FALSE;
|
||||||
return FALSE;
|
}
|
||||||
}
|
|
||||||
|
STATIC BOOLEAN EFIAPI IsSetupMode(VOID)
|
||||||
|
{
|
||||||
|
UINT8 SetupMode = 0;
|
||||||
|
UINTN DataSize;
|
||||||
|
EFI_STATUS Status;
|
||||||
|
|
||||||
|
DataSize = sizeof(SetupMode);
|
||||||
|
Status = gST->RuntimeServices->GetVariable(L"SetupMode", &gEfiGlobalVariableGuid, NULL,
|
||||||
|
&DataSize, &SetupMode);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return SetupMode ? TRUE : FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
STATIC BOOLEAN EFIAPI CheckVtoyShim(VOID)
|
||||||
|
{
|
||||||
|
EFI_STATUS Status;
|
||||||
|
EFI_GUID Guid = VTOY_SHIM_POLICY_GUID;
|
||||||
|
VOID *Prot = NULL;
|
||||||
|
|
||||||
|
/* If secure boot is not enabled or in SetupMode, nothing needed */
|
||||||
|
if (!IsSecureBootEnabled() || IsSetupMode())
|
||||||
|
{
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = gBS->LocateProtocol(&Guid, NULL, (VOID**)&Prot);
|
||||||
|
if (EFI_ERROR(Status))
|
||||||
|
{
|
||||||
|
gST->ConOut->OutputString(gST->ConOut, L"Can not locate Vtoy Shim\r\n");
|
||||||
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|||||||
@@ -359,12 +359,27 @@ int ventoy_set_sb_policy(void)
|
|||||||
|
|
||||||
static void ventoy_get_uefi_sb(void)
|
static void ventoy_get_uefi_sb(void)
|
||||||
{
|
{
|
||||||
|
grub_uint8_t secure_boot = 0;
|
||||||
|
grub_uint8_t setup_mode = 0;
|
||||||
grub_uint8_t *var = NULL;
|
grub_uint8_t *var = NULL;
|
||||||
grub_size_t size = 0;
|
grub_size_t size = 0;
|
||||||
grub_efi_guid_t global = GRUB_EFI_GLOBAL_VARIABLE_GUID;
|
grub_efi_guid_t global = GRUB_EFI_GLOBAL_VARIABLE_GUID;
|
||||||
|
|
||||||
var = grub_efi_get_variable("SecureBoot", &global, &size);
|
var = grub_efi_get_variable("SecureBoot", &global, &size);
|
||||||
if (var && size == 1 && *var == 1)
|
if (var && size == 1 && *var == 1)
|
||||||
|
{
|
||||||
|
secure_boot = 1;
|
||||||
|
}
|
||||||
|
grub_check_free(var);
|
||||||
|
|
||||||
|
size = 0;
|
||||||
|
var = grub_efi_get_variable("SetupMode", &global, &size);
|
||||||
|
if (var && size == 1 && *var == 1)
|
||||||
|
{
|
||||||
|
setup_mode = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (secure_boot == 1 && setup_mode == 0)
|
||||||
{
|
{
|
||||||
g_sys_sb = 1;
|
g_sys_sb = 1;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -896,6 +896,36 @@ static grub_err_t ventoy_cmd_strstr(grub_extcmd_context_t ctxt, int argc, char *
|
|||||||
return (grub_strstr(args[0], args[1])) ? 0 : 1;
|
return (grub_strstr(args[0], args[1])) ? 0 : 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static grub_err_t ventoy_cmd_istrstr(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
|
{
|
||||||
|
grub_err_t ret = 1;
|
||||||
|
char *s1 = NULL;
|
||||||
|
char *s2 = NULL;
|
||||||
|
|
||||||
|
(void)ctxt;
|
||||||
|
|
||||||
|
if (argc != 2)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
s1 = grub_strdup(args[0]);
|
||||||
|
s2 = grub_strdup(args[1]);
|
||||||
|
if (s1 == NULL || s2 == NULL)
|
||||||
|
{
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
ventoy_str_toupper(s1);
|
||||||
|
ventoy_str_toupper(s2);
|
||||||
|
ret = (grub_strstr(s1, s2)) ? 0 : 1;
|
||||||
|
|
||||||
|
end:
|
||||||
|
grub_check_free(s1);
|
||||||
|
grub_check_free(s2);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
static grub_err_t ventoy_cmd_strbegin(grub_extcmd_context_t ctxt, int argc, char **args)
|
static grub_err_t ventoy_cmd_strbegin(grub_extcmd_context_t ctxt, int argc, char **args)
|
||||||
{
|
{
|
||||||
char *c0, *c1;
|
char *c0, *c1;
|
||||||
@@ -6944,6 +6974,7 @@ static cmd_para ventoy_cmds[] =
|
|||||||
{ "vt_incr", ventoy_cmd_incr, 0, NULL, "{Var} {INT}", "Increase integer variable", NULL },
|
{ "vt_incr", ventoy_cmd_incr, 0, NULL, "{Var} {INT}", "Increase integer variable", NULL },
|
||||||
{ "vt_mod", ventoy_cmd_mod, 0, NULL, "{Int} {Int} {Var}", "mod integer variable", NULL },
|
{ "vt_mod", ventoy_cmd_mod, 0, NULL, "{Int} {Int} {Var}", "mod integer variable", NULL },
|
||||||
{ "vt_strstr", ventoy_cmd_strstr, 0, NULL, "", "", NULL },
|
{ "vt_strstr", ventoy_cmd_strstr, 0, NULL, "", "", NULL },
|
||||||
|
{ "vt_istrstr", ventoy_cmd_istrstr, 0, NULL, "", "", NULL },
|
||||||
{ "vt_str_begin", ventoy_cmd_strbegin, 0, NULL, "", "", NULL },
|
{ "vt_str_begin", ventoy_cmd_strbegin, 0, NULL, "", "", NULL },
|
||||||
{ "vt_str_casebegin", ventoy_cmd_strcasebegin, 0, NULL, "", "", NULL },
|
{ "vt_str_casebegin", ventoy_cmd_strcasebegin, 0, NULL, "", "", NULL },
|
||||||
{ "vt_debug", ventoy_cmd_debug, 0, NULL, "{on|off}", "turn debug on/off", NULL },
|
{ "vt_debug", ventoy_cmd_debug, 0, NULL, "{on|off}", "turn debug on/off", NULL },
|
||||||
|
|||||||
@@ -1457,7 +1457,10 @@ function ventoy_iso_busybox_ver {
|
|||||||
set ventoy_busybox_ver=64
|
set ventoy_busybox_ver=64
|
||||||
elif vt_strstr "$vt_volume_id" "x86_64"; then
|
elif vt_strstr "$vt_volume_id" "x86_64"; then
|
||||||
set ventoy_busybox_ver=64
|
set ventoy_busybox_ver=64
|
||||||
|
elif vt_istrstr "${vt_chosen_path}" "x86_64"; then
|
||||||
|
set ventoy_busybox_ver=64
|
||||||
|
elif vt_istrstr "${vt_chosen_path}" "amd64"; then
|
||||||
|
set ventoy_busybox_ver=64
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
@@ -2449,7 +2452,7 @@ function mimg_common_menuentry {
|
|||||||
#############################################################
|
#############################################################
|
||||||
#############################################################
|
#############################################################
|
||||||
|
|
||||||
set VENTOY_VERSION="1.1.15"
|
set VENTOY_VERSION="1.1.16"
|
||||||
|
|
||||||
#ACPI not compatible with Window7/8, so disable by default
|
#ACPI not compatible with Window7/8, so disable by default
|
||||||
set VTOY_PARAM_NO_ACPI=1
|
set VTOY_PARAM_NO_ACPI=1
|
||||||
|
|||||||
@@ -1,18 +1,18 @@
|
|||||||
L - Seleccionar lenguaje
|
L - Seleccionar idioma
|
||||||
F1 - Mostrar información de ayuda
|
F1 - Mostrar información de ayuda
|
||||||
F2 - Navegar y arranca archivos en el disco local
|
F2 - Navegar y arrancar archivos en el disco local
|
||||||
F3 - Cambiar modo de menú entre vista de árbol <-> vista de lista
|
F3 - Cambiar modo de menú entre Vista de árbol <-> Vista de lista
|
||||||
F4 - arrancar Windows/Linux en el disco local
|
F4 - Arrancar Windows/Linux en el disco local
|
||||||
F5 - Utilidades
|
F5 - Utilidades
|
||||||
F6 - Cargar menú de Grub2 personalizado
|
F6 - Cargar menú de Grub2 personalizado
|
||||||
F7 - Cambiar entre modo grafico <-> modo texto
|
F7 - Cambiar entre Modo GUI <-> Modo texto
|
||||||
|
|
||||||
m/Ctrl+m - Suma de comprobación de archivos de imagen (md5/sha1/sha256/sha512)
|
m/Ctrl+m - Suma de comprobación de archivos de imagen (md5/sha1/sha256/sha512)
|
||||||
d/Ctrl+d - Modo Memdisk (solo para WinPE/LiveCD ISO/IMG pequeños)
|
d/Ctrl+d - Modo Memdisk (Sólo para WinPE/LiveCD ISO/IMG pequeños)
|
||||||
w/Ctrl+w - Modo WIMBOOT (Solo para archivos Windows/WinPE ISO)
|
w/Ctrl+w - Modo WIMBOOT (Sólo para archivos Windows/WinPE ISO)
|
||||||
r/Ctrl+r - Modo Grub2 (Solo para algunas distribuciones de Linux)
|
r/Ctrl+r - Modo Grub2 (Sólo para algunas distros de Linux)
|
||||||
i/Ctrl+i - Modo compatible (Solo para depuración)
|
i/Ctrl+i - Modo compatible (Sólo para depuración)
|
||||||
u/Ctrl+u - Cargar controlador ISO EFI (Solo para depuración, no se puede usar oficialmente)
|
u/Ctrl+u - Cargar controlador ISO EFI (Sólo para depuración, uso no oficial)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
{
|
{
|
||||||
"VTLANG_LANGUAGE_NAME": "Spanish (Español)",
|
"VTLANG_LANGUAGE_NAME": "Spanish (Español)",
|
||||||
|
|
||||||
"VTLANG_STR_HOTKEY_LIST": "L:Lenguaje F1:Ayuda F2:Navegar F3:Vista de lista F4:Arranque local F5:Herramientas F6:Extensión de menú",
|
"VTLANG_STR_HOTKEY_LIST": "L:Idioma F1:Ayuda F2:Navegar F3:Vista de lista F4:Arranque local F5:Herramientas F6:Menú ext.",
|
||||||
"VTLANG_STR_HOTKEY_TREE": "L:Lenguaje F1:Ayuda F2:Navegar F3:Vista de árbol F4:Arranque local F5:Herramientas F6:Extensión de menú",
|
"VTLANG_STR_HOTKEY_TREE": "L:Idioma F1:Ayuda F2:Navegar F3:Vista de árbol F4:Arranque local F5:Herramientas F6:Menú ext.",
|
||||||
"VTLANG_RETURN_PREVIOUS": "Regresar al menú previo [Esc]",
|
"VTLANG_RETURN_PREVIOUS": "Regresar al menú anterior [Esc]",
|
||||||
"VTLANG_RETURN_PRV_NOESC": "Regresar al menú previo",
|
"VTLANG_RETURN_PRV_NOESC": "Regresar al menú anterior",
|
||||||
|
|
||||||
"VTLANG_MENU_LANG": "Selección de idioma del menú",
|
"VTLANG_MENU_LANG": "Selección de idioma del menú",
|
||||||
|
|
||||||
@@ -28,13 +28,13 @@
|
|||||||
"VTLANG_CHKSUM_SHA256_CALC_CHK": "Calcular y comprobar sha256sum",
|
"VTLANG_CHKSUM_SHA256_CALC_CHK": "Calcular y comprobar sha256sum",
|
||||||
"VTLANG_CHKSUM_SHA512_CALC_CHK": "Calcular y comprobar sha512sum",
|
"VTLANG_CHKSUM_SHA512_CALC_CHK": "Calcular y comprobar sha512sum",
|
||||||
|
|
||||||
"VTLANG_POWER": "Poder",
|
"VTLANG_POWER": "Energía",
|
||||||
"VTLANG_POWER_REBOOT": "Reiniciar",
|
"VTLANG_POWER_REBOOT": "Reiniciar",
|
||||||
"VTLANG_POWER_HALT": "Detener",
|
"VTLANG_POWER_HALT": "Apagar",
|
||||||
"VTLANG_POWER_BOOT_EFIFW": "Reiniciar a configuración EFI",
|
"VTLANG_POWER_BOOT_EFIFW": "Reiniciar a la configuración EFI",
|
||||||
|
|
||||||
"VTLANG_KEYBRD_LAYOUT": "Distribuciones de teclado",
|
"VTLANG_KEYBRD_LAYOUT": "Distribuciones de teclado",
|
||||||
"VTLANG_HWINFO": "Información de Hardware",
|
"VTLANG_HWINFO": "Información de hardware",
|
||||||
|
|
||||||
"VTLANG_RESOLUTION_CFG": "Configuración de resolución",
|
"VTLANG_RESOLUTION_CFG": "Configuración de resolución",
|
||||||
"VTLANG_SCREEN_MODE": "Modo de visualización de pantalla",
|
"VTLANG_SCREEN_MODE": "Modo de visualización de pantalla",
|
||||||
@@ -45,23 +45,23 @@
|
|||||||
|
|
||||||
"VTLANG_UEFI_UTIL": "Utilidades UEFI de Ventoy",
|
"VTLANG_UEFI_UTIL": "Utilidades UEFI de Ventoy",
|
||||||
"VTLANG_UTIL_SHOW_EFI_DRV": "Mostrar controladores EFI",
|
"VTLANG_UTIL_SHOW_EFI_DRV": "Mostrar controladores EFI",
|
||||||
"VTLANG_UTIL_FIX_BLINIT_FAIL": "Reparar la falla de BinitializeLibrary de Windows",
|
"VTLANG_UTIL_FIX_BLINIT_FAIL": "Reparar error BlinitializeLibrary de Windows",
|
||||||
|
|
||||||
"VTLANG_JSON_CHK_JSON": "Comprobar configuración de complemento de json (ventoy.json)",
|
"VTLANG_JSON_CHK_JSON": "Comprobar configuración del complemento de json (ventoy.json)",
|
||||||
"VTLANG_JSON_CHK_CONTROL": "Comprobar configuración de complemento de control global",
|
"VTLANG_JSON_CHK_CONTROL": "Comprobar configuración del complemento de control global",
|
||||||
"VTLANG_JSON_CHK_THEME": "Comprobar configuración de complemento de tema",
|
"VTLANG_JSON_CHK_THEME": "Comprobar configuración del complemento de tema",
|
||||||
"VTLANG_JSON_CHK_AUTOINS": "Comprobar configuración de complemento de auto instalación",
|
"VTLANG_JSON_CHK_AUTOINS": "Comprobar configuración del complemento de autoinstalación",
|
||||||
"VTLANG_JSON_CHK_PERSIST": "Comprobar configuración de complemento de persistencia",
|
"VTLANG_JSON_CHK_PERSIST": "Comprobar configuración del complemento de persistencia",
|
||||||
"VTLANG_JSON_CHK_MENU_ALIAS": "Comprobar configuración de complemento de alias de menú",
|
"VTLANG_JSON_CHK_MENU_ALIAS": "Comprobar configuración del complemento de alias de menú",
|
||||||
"VTLANG_JSON_CHK_MENU_TIP": "Comprobar configuración de complemento de consejo de menú",
|
"VTLANG_JSON_CHK_MENU_TIP": "Comprobar configuración del complemento de consejo de menú",
|
||||||
"VTLANG_JSON_CHK_MENU_CLASS": "Comprobar configuración de complemento de clase de menú",
|
"VTLANG_JSON_CHK_MENU_CLASS": "Comprobar configuración del complemento de clases de menú",
|
||||||
"VTLANG_JSON_CHK_INJECTION": "Comprobar configuración de complemento de inyección",
|
"VTLANG_JSON_CHK_INJECTION": "Comprobar configuración del complemento de inyección",
|
||||||
"VTLANG_JSON_CHK_AUTO_MEMDISK": "Comprobar configuración de complemento de auto memdisk",
|
"VTLANG_JSON_CHK_AUTO_MEMDISK": "Comprobar configuración del complemento auto memdisk",
|
||||||
"VTLANG_JSON_CHK_IMG_LIST": "Comprobar configuración de complemento de lista de imágenes",
|
"VTLANG_JSON_CHK_IMG_LIST": "Comprobar configuración del complemento de lista de imágenes",
|
||||||
"VTLANG_JSON_CHK_IMG_BLIST": "Comprobar configuración de complemento de lista negra de imágenes",
|
"VTLANG_JSON_CHK_IMG_BLIST": "Comprobar configuración del complemento de lista negra de imágenes",
|
||||||
"VTLANG_JSON_CHK_CONF_REPLACE": "Comprobar configuración de complemento de reemplazo de configuración de arranque",
|
"VTLANG_JSON_CHK_CONF_REPLACE": "Comprobar configuración del complemento de reemplazo de configuración de arranque",
|
||||||
"VTLANG_JSON_CHK_DUD": "Comprobar configuración de complemento de dud",
|
"VTLANG_JSON_CHK_DUD": "Comprobar configuración del complemento dud",
|
||||||
"VTLANG_JSON_CHK_PASSWORD": "Comprobar configuración de complemento de contraseñas",
|
"VTLANG_JSON_CHK_PASSWORD": "Comprobar configuración del complemento de contraseñas",
|
||||||
|
|
||||||
"VTLANG_NORMAL_MODE": "Arrancar en modo normal",
|
"VTLANG_NORMAL_MODE": "Arrancar en modo normal",
|
||||||
"VTLANG_WIMBOOT_MODE": "Arrancar en modo wimboot",
|
"VTLANG_WIMBOOT_MODE": "Arrancar en modo wimboot",
|
||||||
@@ -71,7 +71,7 @@
|
|||||||
"VTLANG_RET_TO_LISTVIEW": "Regresar a vista de lista",
|
"VTLANG_RET_TO_LISTVIEW": "Regresar a vista de lista",
|
||||||
"VTLANG_RET_TO_TREEVIEW": "regresar a vista de árbol",
|
"VTLANG_RET_TO_TREEVIEW": "regresar a vista de árbol",
|
||||||
|
|
||||||
"VTLANG_NO_AUTOINS_SCRIPT": "Arrancar sin plantilla de auto instalación",
|
"VTLANG_NO_AUTOINS_SCRIPT": "Arrancar sin plantilla de autoinstalación",
|
||||||
"VTLANG_AUTOINS_USE": "Arrancar con",
|
"VTLANG_AUTOINS_USE": "Arrancar con",
|
||||||
|
|
||||||
"VTLANG_NO_PERSIST": "Arrancar sin persistencia",
|
"VTLANG_NO_PERSIST": "Arrancar sin persistencia",
|
||||||
@@ -79,20 +79,20 @@
|
|||||||
|
|
||||||
"VTLANG_BROWER_RETURN": "Regresar",
|
"VTLANG_BROWER_RETURN": "Regresar",
|
||||||
|
|
||||||
"VTLANG_ENTER_EXIT": "presiona tecla Entrar para salir",
|
"VTLANG_ENTER_EXIT": "Presiona la tecla Entrar para salir",
|
||||||
"VTLANG_ENTER_REBOOT": "presiona tecla Entrar para reiniciar",
|
"VTLANG_ENTER_REBOOT": "Presiona la tecla Entrar para reiniciar",
|
||||||
"VTLANG_ENTER_CONTINUE": "presiona tecla Entrar para continuar",
|
"VTLANG_ENTER_CONTINUE": "Presiona la tecla Entrar para continuar",
|
||||||
|
|
||||||
"VTLANG_CTRL_TEMP_SET": "Ajustes de control temporales",
|
"VTLANG_CTRL_TEMP_SET": "Ajustes de control temporales",
|
||||||
"VTLANG_WIN11_BYPASS_CHECK": "Saltar comprobación de CPU/TPM/Arranque Seguro al instalar Windows 11",
|
"VTLANG_WIN11_BYPASS_CHECK": "Omitir comprobación de CPU/TPM/SecureBoot al instalar Windows 11",
|
||||||
"VTLANG_WIN11_BYPASS_NRO": "Saltar requerimiento de cuenta en linea al instalar Windows 11",
|
"VTLANG_WIN11_BYPASS_NRO": "Omitir requisito de cuenta en línea al instalar Windows 11",
|
||||||
"VTLANG_LINUX_REMOUNT": "Montar partición de Ventoy después de arrancar Linux",
|
"VTLANG_LINUX_REMOUNT": "Montar partición de Ventoy después de arrancar Linux",
|
||||||
"VTLANG_SECONDARY_BOOT_MENU": "Mostrar menú de arranque secundario",
|
"VTLANG_SECONDARY_BOOT_MENU": "Mostrar menú de arranque secundario",
|
||||||
"VTLANG_WIN_UEFI_RES_LOCK": "Lock the resolution when UEFI boot Windows/WinPE",
|
"VTLANG_WIN_UEFI_RES_LOCK": "Bloquear la resolución al arrancar Windows/WinPE en modo UEFI",
|
||||||
"VTLANG_UEFI_RES_LOCK_NONE": "None",
|
"VTLANG_UEFI_RES_LOCK_NONE": "Ninguno",
|
||||||
"VTLANG_UEFI_RES_LOCK_MAX": "Highest",
|
"VTLANG_UEFI_RES_LOCK_MAX": "La más alta",
|
||||||
"VTLANG_UEFI_RES_LOCK_1024_768": "Fixed 1024 x 768",
|
"VTLANG_UEFI_RES_LOCK_1024_768": "Fija 1024 x 768",
|
||||||
"VTLANG_UEFI_RES_LOCK_BE1024_768": "At least 1024 x 768",
|
"VTLANG_UEFI_RES_LOCK_BE1024_768": "Al menos 1024 x 768",
|
||||||
|
|
||||||
|
|
||||||
"MENU_STR_XXX": ""
|
"MENU_STR_XXX": ""
|
||||||
|
|||||||
@@ -88,11 +88,11 @@
|
|||||||
"VTLANG_WIN11_BYPASS_NRO": "Windows 11 설치 시 온라인 계정 요구 사항 무시",
|
"VTLANG_WIN11_BYPASS_NRO": "Windows 11 설치 시 온라인 계정 요구 사항 무시",
|
||||||
"VTLANG_LINUX_REMOUNT": "Linux 부팅 후 Ventoy 파티션 마운트",
|
"VTLANG_LINUX_REMOUNT": "Linux 부팅 후 Ventoy 파티션 마운트",
|
||||||
"VTLANG_SECONDARY_BOOT_MENU": "보조 부팅 메뉴 표시",
|
"VTLANG_SECONDARY_BOOT_MENU": "보조 부팅 메뉴 표시",
|
||||||
"VTLANG_WIN_UEFI_RES_LOCK": "Lock the resolution when UEFI boot Windows/WinPE",
|
"VTLANG_WIN_UEFI_RES_LOCK": "UEFI 부팅 시 Windows/WinPE 해상도 고정",
|
||||||
"VTLANG_UEFI_RES_LOCK_NONE": "None",
|
"VTLANG_UEFI_RES_LOCK_NONE": "고정 안 함",
|
||||||
"VTLANG_UEFI_RES_LOCK_MAX": "Highest",
|
"VTLANG_UEFI_RES_LOCK_MAX": "최고 해상도로 고정",
|
||||||
"VTLANG_UEFI_RES_LOCK_1024_768": "Fixed 1024 x 768",
|
"VTLANG_UEFI_RES_LOCK_1024_768": "1024 x 768로 고정",
|
||||||
"VTLANG_UEFI_RES_LOCK_BE1024_768": "At least 1024 x 768",
|
"VTLANG_UEFI_RES_LOCK_BE1024_768": "1024 x 768 이상으로 고정",
|
||||||
|
|
||||||
|
|
||||||
"MENU_STR_XXX": ""
|
"MENU_STR_XXX": ""
|
||||||
|
|||||||
@@ -1172,13 +1172,13 @@
|
|||||||
"name":"Spanish (Latinoamérica)",
|
"name":"Spanish (Latinoamérica)",
|
||||||
"FontFamily":"Courier New",
|
"FontFamily":"Courier New",
|
||||||
"FontSize":16,
|
"FontSize":16,
|
||||||
"Author":"MELERIX",
|
"Author":"MELERIX, independent-arg",
|
||||||
|
|
||||||
"STR_ERROR":"Error",
|
"STR_ERROR":"Error",
|
||||||
"STR_WARNING":"Advertencia",
|
"STR_WARNING":"Advertencia",
|
||||||
"STR_INFO":"Información",
|
"STR_INFO":"Información",
|
||||||
"STR_INCORRECT_DIR":"¡Por favor, ejecuta bajo el directorio correcto!",
|
"STR_INCORRECT_DIR":"¡Por favor, ejecuta el programa bajo el directorio correcto!",
|
||||||
"STR_INCORRECT_TREE_DIR":"No me ejecutes aquí, por favor descarga el paquete de instalación lanzado, y ejecútalo allí.",
|
"STR_INCORRECT_TREE_DIR":"No me ejecutes aquí. Por favor descarga el paquete de instalación oficial y ejecútalo desde allí.",
|
||||||
"STR_DEVICE":"Dispositivo",
|
"STR_DEVICE":"Dispositivo",
|
||||||
"STR_LOCAL_VER":"Ventoy En Paquete",
|
"STR_LOCAL_VER":"Ventoy En Paquete",
|
||||||
"STR_DISK_VER":"Ventoy En Dispositivo",
|
"STR_DISK_VER":"Ventoy En Dispositivo",
|
||||||
@@ -1189,47 +1189,47 @@
|
|||||||
"STR_INSTALL_TIP":"El dispositivo será formateado y todos los datos se perderán.#@¿Continuar?",
|
"STR_INSTALL_TIP":"El dispositivo será formateado y todos los datos se perderán.#@¿Continuar?",
|
||||||
"STR_INSTALL_TIP2":"El dispositivo será formateado y todos los datos se perderán.#@¿Continuar? (Doble Comprobación)",
|
"STR_INSTALL_TIP2":"El dispositivo será formateado y todos los datos se perderán.#@¿Continuar? (Doble Comprobación)",
|
||||||
"STR_INSTALL_SUCCESS":"¡Felicitaciones!#@Ventoy ha sido instalado exitosamente en el dispositivo.",
|
"STR_INSTALL_SUCCESS":"¡Felicitaciones!#@Ventoy ha sido instalado exitosamente en el dispositivo.",
|
||||||
"STR_INSTALL_FAILED":"Ocurrió un error durante la instalación. Puedes reinsertar el dispositivo USB e intentar de nuevo. Comprueba log.txt para detalles. Si siempre falla, consulta las PF en el sitio web oficial.",
|
"STR_INSTALL_FAILED":"Ocurrió un error durante la instalación. Puedes reinsertar el dispositivo USB e intentar de nuevo. Comprueba log.txt para más detalles. Si siempre falla, consulta las preguntas frecuentes (FAQ) en el sitio web oficial.",
|
||||||
"STR_UPDATE_SUCCESS":"¡Felicitaciones!#@Ventoy ha sido actualizado exitosamente en el dispositivo.",
|
"STR_UPDATE_SUCCESS":"¡Felicitaciones!#@Ventoy ha sido actualizado exitosamente en el dispositivo.",
|
||||||
"STR_UPDATE_FAILED":"Ocurrió un error durante la actualización. Puedes reinsertar el dispositivo USB e intentar de nuevo. Comprueba log.txt para detalles. Si siempre falla, consulta las PF en el sitio web oficial.",
|
"STR_UPDATE_FAILED":"Ocurrió un error durante la actualización. Puedes reinsertar el dispositivo USB e intentar de nuevo. Comprueba log.txt para más detalles. Si siempre falla, consulta las preguntas frecuentes (FAQ) en el sitio web oficial.",
|
||||||
"STR_WAIT_PROCESS":"Un hilo está ejecutándose, por favor espera...",
|
"STR_WAIT_PROCESS":"Un hilo del sistema está ejecutándose, por favor espera...",
|
||||||
"STR_MENU_OPTION":"Opción",
|
"STR_MENU_OPTION":"Opción",
|
||||||
"STR_MENU_SECURE_BOOT":"Soporte De Arranque Seguro",
|
"STR_MENU_SECURE_BOOT":"Soporte de arranque seguro",
|
||||||
"STR_MENU_PART_CFG":"Configuración De Partición",
|
"STR_MENU_PART_CFG":"Configuración de partición",
|
||||||
"STR_BTN_OK":"Aceptar",
|
"STR_BTN_OK":"Aceptar",
|
||||||
"STR_BTN_CANCEL":"Cancelar",
|
"STR_BTN_CANCEL":"Cancelar",
|
||||||
"STR_PRESERVE_SPACE":"Preservar algo de espacio al final del dispositivo",
|
"STR_PRESERVE_SPACE":"Preservar algo de espacio al final del dispositivo",
|
||||||
"STR_SPACE_VAL_INVALID":"Valor inválido para espacio reservado",
|
"STR_SPACE_VAL_INVALID":"Valor inválido para el espacio reservado",
|
||||||
"STR_MENU_CLEAR":"Limpiar Ventoy",
|
"STR_MENU_CLEAR":"Limpiar Ventoy",
|
||||||
"STR_CLEAR_SUCCESS":"Ventoy ha sido removido exitosamente desde el dispositivo.",
|
"STR_CLEAR_SUCCESS":"Ventoy ha sido eliminado exitosamente del dispositivo.",
|
||||||
"STR_CLEAR_FAILED":"Ocurrió un error al remover Ventoy del dispositivo. Puedes reinsertar el dispositivo USB e intentar de nuevo. Comprueba log.txt para detalles.",
|
"STR_CLEAR_FAILED":"Ocurrió un error al eliminar Ventoy del dispositivo. Puedes reinsertar el dispositivo USB e intentar de nuevo. Comprueba log.txt para más detalles.",
|
||||||
"STR_MENU_PART_STYLE":"Estilo De Partición",
|
"STR_MENU_PART_STYLE":"Estilo de partición",
|
||||||
"STR_DISK_2TB_MBR_ERROR":"Por favor selecciona GPT para dispositivos sobre 2TB",
|
"STR_DISK_2TB_MBR_ERROR":"Por favor selecciona GPT para dispositivos de más de 2TB",
|
||||||
"STR_SHOW_ALL_DEV":"Mostrar Todos Los Dispositivos",
|
"STR_SHOW_ALL_DEV":"Mostrar todos los dispositivos",
|
||||||
"STR_PART_ALIGN_4KB":"Alinear particiones con 4KB",
|
"STR_PART_ALIGN_4KB":"Alinear particiones a 4KB",
|
||||||
"STR_WEB_COMMUNICATION_ERR":"Error de comunicación:",
|
"STR_WEB_COMMUNICATION_ERR":"Error de comunicación:",
|
||||||
"STR_WEB_REMOTE_ABNORMAL":"Error de comunicación: anormal remoto",
|
"STR_WEB_REMOTE_ABNORMAL":"Error de comunicación: anomalía remoto",
|
||||||
"STR_WEB_REQUEST_TIMEOUT":"Error de comunicación: Tiempo de espera agotado",
|
"STR_WEB_REQUEST_TIMEOUT":"Error de comunicación: tiempo de espera agotado",
|
||||||
"STR_WEB_SERVICE_UNAVAILABLE":"Error de comunicación: Servicio No Disponible",
|
"STR_WEB_SERVICE_UNAVAILABLE":"Error de comunicación: servicio no disponible",
|
||||||
"STR_WEB_TOKEN_MISMATCH":" Estado del daemon actualizado, por favor reintenta más tarde.",
|
"STR_WEB_TOKEN_MISMATCH":" Estado del daemon actualizado, por favor reintenta más tarde.",
|
||||||
"STR_WEB_SERVICE_BUSY":" El servicio está ocupado, por favor reintenta más tarde.",
|
"STR_WEB_SERVICE_BUSY":" El servicio está ocupado, por favor reintenta más tarde.",
|
||||||
"STR_MENU_VTSI_CREATE":"Generar Archivo VTSI",
|
"STR_MENU_VTSI_CREATE":"Generar archivo VTSI",
|
||||||
"STR_VTSI_CREATE_TIP":"Esta vez no se escribirá al dispositivo, pero solo generará un archivo VTSI#@¿Continuar?",
|
"STR_VTSI_CREATE_TIP":"Esta acción no escribirá en el dispositivo, sólo generará un archivo VTSI.#@¿Continuar?",
|
||||||
"STR_VTSI_CREATE_SUCCESS":"¡Archivo VTSI creado exitosamente!#@Puedes usar Rufus(3.15+) para escribirlo al dispositivo a fin de completar la instalación de Ventoy.",
|
"STR_VTSI_CREATE_SUCCESS":"¡Archivo VTSI creado exitosamente!#@Puedes usar Rufus(3.15+) para escribirlo al dispositivo a fin de completar la instalación de Ventoy.",
|
||||||
"STR_VTSI_CREATE_FAILED":"Fallo en el archivo VTSI creado.",
|
"STR_VTSI_CREATE_FAILED":"Error al crear el archivo VTSI.",
|
||||||
"STR_MENU_PART_RESIZE":"Instalación no destructiva",
|
"STR_MENU_PART_RESIZE":"Instalación no destructiva",
|
||||||
"STR_PART_RESIZE_TIP":"Ventoy intentará una instalación no destructiva si es posible. #@¿Continuar?",
|
"STR_PART_RESIZE_TIP":"Ventoy intentará una instalación no destructiva si es posible. #@¿Continuar?",
|
||||||
"STR_PART_RESIZE_SUCCESS":"¡Felicitaciones!#@La instalación no destructiva de Ventoy a finalizado exitosamente.",
|
"STR_PART_RESIZE_SUCCESS":"¡Felicitaciones!#@La instalación no destructiva de Ventoy a finalizado exitosamente.",
|
||||||
"STR_PART_RESIZE_FAILED":"Instalación no destructiva fallida, Comprueba log.txt para detalles.",
|
"STR_PART_RESIZE_FAILED":"Instalación no destructiva fallida, Comprueba log.txt para detalles.",
|
||||||
"STR_PART_RESIZE_UNSUPPORTED":"Instalación no destructiva de Ventoy detenida porque algunas condiciones no se pueden cumplir. Comprueba log.txt para detalles.",
|
"STR_PART_RESIZE_UNSUPPORTED":"Instalación no destructiva de Ventoy detenida porque algunas condiciones no se pueden cumplir. Comprueba log.txt para más detalles.",
|
||||||
"STR_INSTALL_YES_TIP1":"Advertencia: ¡Los datos se perderán!",
|
"STR_INSTALL_YES_TIP1":"Advertencia: ¡Los datos se perderán!",
|
||||||
"STR_INSTALL_YES_TIP2":"Por favor ingresa YES en el cuadro de texto a continuación para confirmar que realmente quieres realizar una instalación nueva en vez de actualizar.",
|
"STR_INSTALL_YES_TIP2":"Por favor ingresa YES en el cuadro de texto a continuación para confirmar que realmente quieres realizar una instalación nueva en vez de actualizar.",
|
||||||
"STR_PART_VENTOY_FS":"Sistema de archivos para partición de Ventoy",
|
"STR_PART_VENTOY_FS":"Sistema de archivos para partición de Ventoy",
|
||||||
"STR_PART_FS":"Sistema de archivos",
|
"STR_PART_FS":"Sistema de archivos",
|
||||||
"STR_PART_CLUSTER":"Tamaño de cluster",
|
"STR_PART_CLUSTER":"Tamaño del clúster",
|
||||||
"STR_PART_CLUSTER_DEFAULT":"Valor predeterminado del sistema",
|
"STR_PART_CLUSTER_DEFAULT":"Valor predeterminado del sistema",
|
||||||
"STR_DONATE":"Donar",
|
"STR_DONATE":"Donar",
|
||||||
"STR_4KN_UNSUPPORTED":"Actualmente Ventoy no soporta dispositivos nativos 4K.",
|
"STR_4KN_UNSUPPORTED":"Actualmente Ventoy no es compatible con dispositivos nativos 4K.",
|
||||||
|
|
||||||
"STRXXX":""
|
"STRXXX":""
|
||||||
},
|
},
|
||||||
@@ -3043,14 +3043,14 @@
|
|||||||
"STR_PART_RESIZE_SUCCESS":"Onnittelut!#@Ventoyn ei-tuhoisa asennus saapui päätökseen onnistuneesti.",
|
"STR_PART_RESIZE_SUCCESS":"Onnittelut!#@Ventoyn ei-tuhoisa asennus saapui päätökseen onnistuneesti.",
|
||||||
"STR_PART_RESIZE_FAILED":"Ei-tuhoisa asennusmuoto epäonnistui, tarkista log.txt nähdäksesi yksityiskohtaiset tiedot.",
|
"STR_PART_RESIZE_FAILED":"Ei-tuhoisa asennusmuoto epäonnistui, tarkista log.txt nähdäksesi yksityiskohtaiset tiedot.",
|
||||||
"STR_PART_RESIZE_UNSUPPORTED":"Ventoyn ei-tuhoisa asennus pysähtyi koska jotkut ehdot eivät täyttyneet. Tarkista log.txt nähdäksesi yksityiskohdat.",
|
"STR_PART_RESIZE_UNSUPPORTED":"Ventoyn ei-tuhoisa asennus pysähtyi koska jotkut ehdot eivät täyttyneet. Tarkista log.txt nähdäksesi yksityiskohdat.",
|
||||||
"STR_INSTALL_YES_TIP1":"Warning: Data will be lost!",
|
"STR_INSTALL_YES_TIP1":"Varoitus: Data menetetään!",
|
||||||
"STR_INSTALL_YES_TIP2":"Please enter YES in the text box below to confirm that you indeed want to do a fresh install instead of upgrade.",
|
"STR_INSTALL_YES_TIP2":"Kirjoita YES alla olevaan tekstikenttään vahvistaaksesi että haluat tehdä uuden asennuksen päivityksen sijaan.",
|
||||||
"STR_PART_VENTOY_FS":"File System For Ventoy Partition",
|
"STR_PART_VENTOY_FS":"Ventoy -osion tiedostojärjestelmä",
|
||||||
"STR_PART_FS":"File System",
|
"STR_PART_FS":"Tiedostojärjestelmä",
|
||||||
"STR_PART_CLUSTER":"Cluster Size",
|
"STR_PART_CLUSTER":"Klusterin koko",
|
||||||
"STR_PART_CLUSTER_DEFAULT":"System Default Value",
|
"STR_PART_CLUSTER_DEFAULT":"Järjestelmän oletusarvo",
|
||||||
"STR_DONATE":"Lahjoittaa",
|
"STR_DONATE":"Lahjoittaa",
|
||||||
"STR_4KN_UNSUPPORTED":"Currently Ventoy does not support 4K native devices.",
|
"STR_4KN_UNSUPPORTED":"Tällä hetkellä Ventoy ei tue 4K laitteita.",
|
||||||
|
|
||||||
"STRXXX":""
|
"STRXXX":""
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -414,7 +414,7 @@ else\
|
|||||||
if (node->unData.pcStrVal[0] == '0') val = 0
|
if (node->unData.pcStrVal[0] == '0') val = 0
|
||||||
|
|
||||||
#define CONTROL_PARSE_INT_DEF_3(node, val) \
|
#define CONTROL_PARSE_INT_DEF_3(node, val) \
|
||||||
if (node->unData.pcStrVal[0] == '3') val = 3
|
if (node->unData.pcStrVal[0] >= '0' && node->unData.pcStrVal[0] < '3') val = node->unData.pcStrVal[0] - '0'
|
||||||
|
|
||||||
#define VTOY_JSON_INT(key, val) vtoy_json_get_int(json, key, &val)
|
#define VTOY_JSON_INT(key, val) vtoy_json_get_int(json, key, &val)
|
||||||
#define VTOY_JSON_STR(key, buf) vtoy_json_get_string(json, key, sizeof(buf), buf)
|
#define VTOY_JSON_STR(key, buf) vtoy_json_get_string(json, key, sizeof(buf), buf)
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
20260624 16:39:09
|
20260625 19:36:29
|
||||||
@@ -760,7 +760,7 @@
|
|||||||
|
|
||||||
<footer class="main-footer">
|
<footer class="main-footer">
|
||||||
<div class="pull-right hidden-xs">
|
<div class="pull-right hidden-xs">
|
||||||
<b id="plugson_build_date">20260624 16:39:09</b>
|
<b id="plugson_build_date">20260625 19:36:29</b>
|
||||||
</div>
|
</div>
|
||||||
<strong><a href="https://www.ventoy.net" target="_blank">https://www.ventoy.net</a></strong>
|
<strong><a href="https://www.ventoy.net" target="_blank">https://www.ventoy.net</a></strong>
|
||||||
</footer>
|
</footer>
|
||||||
@@ -780,10 +780,10 @@
|
|||||||
<script src="/static/js/jQuery-2.1.4.min.js"></script>
|
<script src="/static/js/jQuery-2.1.4.min.js"></script>
|
||||||
<!-- jquery validate -->
|
<!-- jquery validate -->
|
||||||
<script src="/static/js/jquery.validate.min.js"></script>
|
<script src="/static/js/jquery.validate.min.js"></script>
|
||||||
<script src="/static/js/jquery.validate.vtoymethods.js?v=317"></script>
|
<script src="/static/js/jquery.validate.vtoymethods.js?v=331"></script>
|
||||||
|
|
||||||
<script src="/static/js/jquery.vtoy.alert.js?v=317"></script>
|
<script src="/static/js/jquery.vtoy.alert.js?v=331"></script>
|
||||||
<script src="/static/js/vtoy.js?v=317"></script>
|
<script src="/static/js/vtoy.js?v=331"></script>
|
||||||
<script src="/static/js/md5.min.js"></script>
|
<script src="/static/js/md5.min.js"></script>
|
||||||
|
|
||||||
<!-- Bootstrap 3.3.5 -->
|
<!-- Bootstrap 3.3.5 -->
|
||||||
|
|||||||
Reference in New Issue
Block a user