Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
dadigang
Ventoy
Commits
7b78fe55
Commit
7b78fe55
authored
Jul 24, 2021
by
longpanda
Browse files
Support nested boot.
For example: Ventoy-->rEFInd.iso-->Ventoy-->Windows.iso
parent
094ba618
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
101 additions
and
12 deletions
+101
-12
EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.c
...dk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.c
+47
-8
EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.h
...dk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.h
+0
-1
EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c
...le201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c
+54
-3
No files found.
EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.c
View file @
7b78fe55
...
...
@@ -363,10 +363,22 @@ EFI_HANDLE EFIAPI ventoy_get_parent_handle(IN EFI_DEVICE_PATH_PROTOCOL *pDevPath
return
Handle
;
}
STATIC
ventoy_ram_disk
g_backup_ramdisk_param
;
STATIC
ventoy_os_param
g_backup_os_param_var
;
EFI_STATUS
EFIAPI
ventoy_save_ramdisk_param
(
VOID
)
{
UINTN
DataSize
;
EFI_STATUS
Status
=
EFI_SUCCESS
;
EFI_GUID
VarGuid
=
VENTOY_GUID
;
DataSize
=
sizeof
(
g_backup_ramdisk_param
);
Status
=
gRT
->
GetVariable
(
L"VentoyRamDisk"
,
&
VarGuid
,
NULL
,
&
DataSize
,
&
g_backup_ramdisk_param
);
if
(
!
EFI_ERROR
(
Status
))
{
debug
(
"find previous ramdisk variable <%llu>"
,
g_backup_ramdisk_param
.
DiskSize
);
}
Status
=
gRT
->
SetVariable
(
L"VentoyRamDisk"
,
&
VarGuid
,
EFI_VARIABLE_BOOTSERVICE_ACCESS
|
EFI_VARIABLE_RUNTIME_ACCESS
,
...
...
@@ -380,21 +392,38 @@ EFI_STATUS EFIAPI ventoy_delete_ramdisk_param(VOID)
{
EFI_STATUS
Status
=
EFI_SUCCESS
;
EFI_GUID
VarGuid
=
VENTOY_GUID
;
Status
=
gRT
->
SetVariable
(
L"VentoyRamDisk"
,
&
VarGuid
,
if
(
g_backup_ramdisk_param
.
DiskSize
>
0
&&
g_backup_ramdisk_param
.
PhyAddr
>
0
)
{
Status
=
gRT
->
SetVariable
(
L"VentoyRamDisk"
,
&
VarGuid
,
EFI_VARIABLE_BOOTSERVICE_ACCESS
|
EFI_VARIABLE_RUNTIME_ACCESS
,
sizeof
(
g_backup_ramdisk_param
),
&
g_backup_ramdisk_param
);
debug
(
"resotre ramdisk variable %r"
,
Status
);
}
else
{
Status
=
gRT
->
SetVariable
(
L"VentoyRamDisk"
,
&
VarGuid
,
EFI_VARIABLE_BOOTSERVICE_ACCESS
|
EFI_VARIABLE_RUNTIME_ACCESS
,
0
,
NULL
);
debug
(
"delete efi variable %r"
,
Status
);
debug
(
"delete ramdisk variable %r"
,
Status
);
}
return
Status
;
}
EFI_STATUS
EFIAPI
ventoy_save_variable
(
VOID
)
{
UINTN
DataSize
;
EFI_STATUS
Status
=
EFI_SUCCESS
;
EFI_GUID
VarGuid
=
VENTOY_GUID
;
DataSize
=
sizeof
(
g_backup_os_param_var
);
Status
=
gRT
->
GetVariable
(
L"VentoyOsParam"
,
&
VarGuid
,
NULL
,
&
DataSize
,
&
g_backup_os_param_var
);
if
(
!
EFI_ERROR
(
Status
))
{
debug
(
"find previous efi variable <%a>"
,
g_backup_os_param_var
.
vtoy_img_path
);
}
Status
=
gRT
->
SetVariable
(
L"VentoyOsParam"
,
&
VarGuid
,
EFI_VARIABLE_BOOTSERVICE_ACCESS
|
EFI_VARIABLE_RUNTIME_ACCESS
,
sizeof
(
g_chain
->
os_param
),
&
(
g_chain
->
os_param
));
...
...
@@ -407,11 +436,21 @@ EFI_STATUS EFIAPI ventoy_delete_variable(VOID)
{
EFI_STATUS
Status
=
EFI_SUCCESS
;
EFI_GUID
VarGuid
=
VENTOY_GUID
;
Status
=
gRT
->
SetVariable
(
L"VentoyOsParam"
,
&
VarGuid
,
if
(
0
==
CompareMem
(
&
(
g_backup_os_param_var
.
guid
),
&
VarGuid
,
sizeof
(
EFI_GUID
)))
{
Status
=
gRT
->
SetVariable
(
L"VentoyOsParam"
,
&
VarGuid
,
EFI_VARIABLE_BOOTSERVICE_ACCESS
|
EFI_VARIABLE_RUNTIME_ACCESS
,
sizeof
(
g_backup_os_param_var
),
&
(
g_backup_os_param_var
));
debug
(
"restore efi variable %r"
,
Status
);
}
else
{
Status
=
gRT
->
SetVariable
(
L"VentoyOsParam"
,
&
VarGuid
,
EFI_VARIABLE_BOOTSERVICE_ACCESS
|
EFI_VARIABLE_RUNTIME_ACCESS
,
0
,
NULL
);
debug
(
"delete efi variable %r"
,
Status
);
debug
(
"delete efi variable %r"
,
Status
);
}
return
Status
;
}
...
...
EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/Ventoy.h
View file @
7b78fe55
...
...
@@ -169,7 +169,6 @@ typedef struct ventoy_virt_chunk
{ 0x37b87ac6, 0xc180, 0x4583, { 0xa7, 0x05, 0x41, 0x4d, 0xa8, 0xf7, 0x7e, 0xd2 }}
#define VTOY_BLOCK_DEVICE_PATH_NAME L"ventoy"
#if defined (MDE_CPU_IA32)
#define VENTOY_UEFI_DESC L"IA32 UEFI"
...
...
EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c
View file @
7b78fe55
...
...
@@ -624,26 +624,77 @@ EFI_STATUS EFIAPI ventoy_block_io_flush(IN EFI_BLOCK_IO_PROTOCOL *This)
return
EFI_SUCCESS
;
}
STATIC
UINTN
ventoy_get_current_device_path_id
(
VOID
)
{
UINTN
i
=
0
;
UINTN
Count
=
0
;
UINTN
NameLen
=
0
;
UINTN
MaxId
=
0
;
UINTN
CurId
=
0
;
BOOLEAN
Find
=
FALSE
;
EFI_HANDLE
*
Handles
=
NULL
;
EFI_STATUS
Status
=
EFI_SUCCESS
;
EFI_DEVICE_PATH_PROTOCOL
*
DevicePath
=
NULL
;
VENDOR_DEVICE_PATH
*
venPath
=
NULL
;
NameLen
=
StrSize
(
L"ventoy_xxx"
);
Status
=
gBS
->
LocateHandleBuffer
(
ByProtocol
,
&
gEfiDevicePathProtocolGuid
,
NULL
,
&
Count
,
&
Handles
);
if
(
EFI_ERROR
(
Status
))
{
return
0
;
}
for
(
i
=
0
;
i
<
Count
;
i
++
)
{
Status
=
gBS
->
HandleProtocol
(
Handles
[
i
],
&
gEfiDevicePathProtocolGuid
,
(
VOID
**
)
&
DevicePath
);
if
(
EFI_ERROR
(
Status
))
{
continue
;
}
if
(
DevicePath
->
Type
==
HARDWARE_DEVICE_PATH
&&
DevicePath
->
SubType
==
HW_VENDOR_DP
)
{
venPath
=
(
VENDOR_DEVICE_PATH
*
)
DevicePath
;
if
(
CompareGuid
(
&
venPath
->
Guid
,
&
gVtoyBlockDevicePathGuid
))
{
CurId
=
StrDecimalToUintn
((
CHAR16
*
)(
venPath
+
1
)
+
StrLen
(
L"ventoy_"
));
MaxId
=
MAX
(
MaxId
,
CurId
);
Find
=
TRUE
;
}
}
}
FreePool
(
Handles
);
return
Find
?
(
MaxId
+
1
)
:
0
;
}
EFI_STATUS
EFIAPI
ventoy_fill_device_path
(
VOID
)
{
UINTN
CurVtoyDpId
=
0
;
UINTN
NameLen
=
0
;
UINT8
TmpBuf
[
128
]
=
{
0
};
VENDOR_DEVICE_PATH
*
venPath
=
NULL
;
CHAR16
VtoyDpName
[
32
];
CurVtoyDpId
=
ventoy_get_current_device_path_id
();
UnicodeSPrintAsciiFormat
(
VtoyDpName
,
sizeof
(
VtoyDpName
),
"ventoy_%03lu"
,
CurVtoyDpId
);
venPath
=
(
VENDOR_DEVICE_PATH
*
)
TmpBuf
;
NameLen
=
StrSize
(
V
TOY_BLOCK_DEVICE_PATH_NAME
);
NameLen
=
StrSize
(
V
toyDpName
);
venPath
->
Header
.
Type
=
HARDWARE_DEVICE_PATH
;
venPath
->
Header
.
SubType
=
HW_VENDOR_DP
;
venPath
->
Header
.
Length
[
0
]
=
sizeof
(
VENDOR_DEVICE_PATH
)
+
NameLen
;
venPath
->
Header
.
Length
[
1
]
=
0
;
CopyMem
(
&
venPath
->
Guid
,
&
gVtoyBlockDevicePathGuid
,
sizeof
(
EFI_GUID
));
CopyMem
(
venPath
+
1
,
V
TOY_BLOCK_DEVICE_PATH_NAME
,
NameLen
);
CopyMem
(
venPath
+
1
,
V
toyDpName
,
NameLen
);
gBlockData
.
Path
=
AppendDevicePathNode
(
NULL
,
(
EFI_DEVICE_PATH_PROTOCOL
*
)
TmpBuf
);
gBlockData
.
DevicePathCompareLen
=
sizeof
(
VENDOR_DEVICE_PATH
)
+
NameLen
;
debug
(
"gBlockData.Path=<%
s>
\n
"
,
ConvertDevicePathToText
(
gBlockData
.
Path
,
FALSE
,
FALSE
));
debug
(
"gBlockData.Path=<%
lu><%s>
\n
"
,
CurVtoyDpId
,
ConvertDevicePathToText
(
gBlockData
.
Path
,
FALSE
,
FALSE
));
return
EFI_SUCCESS
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment