#include <Protocol/SimpleFileSystem.h>
#include <Ventoy.h>
-#define PROCOTOL_SLEEP_SECONDS 0
+#define PROCOTOL_SLEEP_MSECONDS 0
-#define debug_sleep() if (PROCOTOL_SLEEP_SECONDS) sleep(PROCOTOL_SLEEP_SECONDS)
+#define debug_sleep() if (PROCOTOL_SLEEP_MSECONDS) gBS->Stall(1000 * PROCOTOL_SLEEP_MSECONDS)
STATIC ventoy_system_wrapper g_system_wrapper;
IN UINT32 Attributes
)
{
- debug("ventoy_open_protocol:%a", ventoy_get_guid_name(Protocol)); debug_sleep();
+ debug("ventoy_open_protocol:<%p> %a", Handle, ventoy_get_guid_name(Protocol)); debug_sleep();
return g_system_wrapper.OriOpenProtocol(Handle, Protocol, Interface, AgentHandle, ControllerHandle, Attributes);
}
return g_system_wrapper.OriLocateProtocol(Protocol, Registration, Interface);
}
+STATIC EFI_STATUS EFIAPI ventoy_locate_handle_buffer
+(
+ IN EFI_LOCATE_SEARCH_TYPE SearchType,
+ IN EFI_GUID *Protocol, OPTIONAL
+ IN VOID *SearchKey, OPTIONAL
+ IN OUT UINTN *NoHandles,
+ OUT EFI_HANDLE **Buffer
+)
+{
+ debug("ventoy_locate_handle_buffer:%a", ventoy_get_guid_name(Protocol)); debug_sleep();
+ return g_system_wrapper.OriLocateHandleBuffer(SearchType, Protocol, SearchKey, NoHandles, Buffer);
+}
+
+STATIC EFI_STATUS EFIAPI ventoy_protocol_per_handle
+(
+ IN EFI_HANDLE Handle,
+ OUT EFI_GUID ***ProtocolBuffer,
+ OUT UINTN *ProtocolBufferCount
+)
+{
+ debug("ventoy_protocol_per_handle:%p", Handle); debug_sleep();
+ return g_system_wrapper.OriProtocolsPerHandle(Handle, ProtocolBuffer, ProtocolBufferCount);
+}
+
+EFI_STATUS EFIAPI ventoy_locate_handle
+(
+ IN EFI_LOCATE_SEARCH_TYPE SearchType,
+ IN EFI_GUID *Protocol, OPTIONAL
+ IN VOID *SearchKey, OPTIONAL
+ IN OUT UINTN *BufferSize,
+ OUT EFI_HANDLE *Buffer
+)
+{
+ UINTN i;
+ EFI_HANDLE Handle;
+ EFI_STATUS Status = EFI_SUCCESS;
+
+ debug("ventoy_locate_handle: %d %a %p", SearchType, ventoy_get_guid_name(Protocol), SearchKey);
+ Status = g_system_wrapper.OriLocateHandle(SearchType, Protocol, SearchKey, BufferSize, Buffer);
+ debug("ventoy_locate_handle: %r Handle Count:%u", Status, *BufferSize/sizeof(EFI_HANDLE));
+
+ if (EFI_SUCCESS == Status)
+ {
+ for (i = 0; i < *BufferSize / sizeof(EFI_HANDLE); i++)
+ {
+ if (Buffer[i] == gBlockData.Handle)
+ {
+ Handle = Buffer[0];
+ Buffer[0] = Buffer[i];
+ Buffer[i] = Handle;
+ debug("####### Handle at %u", i);
+ break;
+ }
+ }
+ }
+
+ debug_sleep();
+
+ return Status;
+}
+
+STATIC EFI_STATUS EFIAPI ventoy_locate_device_path
+(
+ IN EFI_GUID *Protocol,
+ IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath,
+ OUT EFI_HANDLE *Device
+)
+{
+ debug("ventoy_locate_device_path:%a", ventoy_get_guid_name(Protocol)); debug_sleep();
+ return g_system_wrapper.OriLocateDevicePath(Protocol, DevicePath, Device);
+}
+
EFI_STATUS EFIAPI ventoy_wrapper_system(VOID)
{
- ventoy_wrapper(gBS, g_system_wrapper, LocateProtocol, ventoy_locate_protocol);
- ventoy_wrapper(gBS, g_system_wrapper, HandleProtocol, ventoy_handle_protocol);
- ventoy_wrapper(gBS, g_system_wrapper, OpenProtocol, ventoy_open_protocol);
+ ventoy_wrapper(gBS, g_system_wrapper, LocateProtocol, ventoy_locate_protocol);
+ ventoy_wrapper(gBS, g_system_wrapper, HandleProtocol, ventoy_handle_protocol);
+ ventoy_wrapper(gBS, g_system_wrapper, OpenProtocol, ventoy_open_protocol);
+ ventoy_wrapper(gBS, g_system_wrapper, LocateHandleBuffer, ventoy_locate_handle_buffer);
+ ventoy_wrapper(gBS, g_system_wrapper, ProtocolsPerHandle, ventoy_protocol_per_handle);
+ ventoy_wrapper(gBS, g_system_wrapper, LocateHandle, ventoy_locate_handle);
+ ventoy_wrapper(gBS, g_system_wrapper, LocateDevicePath, ventoy_locate_device_path);
return EFI_SUCCESS;
}