X-Git-Url: https://glassweightruler.freedombox.rocks/gitweb/Ventoy.git/blobdiff_plain/a5c706511b84eb0f9e5f042f18f2f3c9602977c4..1cbe4c81b4978311696ab4e9e8dffb7d98b82570:/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c diff --git a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c index 624055d..0e19153 100644 --- a/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c +++ b/EDK2/edk2_mod/edk2-edk2-stable201911/MdeModulePkg/Application/Ventoy/VentoyProtocol.c @@ -57,6 +57,18 @@ UINT64 g_fixup_iso9660_secover_1st_secs = 0; UINT64 g_fixup_iso9660_secover_cur_secs = 0; UINT64 g_fixup_iso9660_secover_tot_secs = 0; +STATIC UINTN g_keyboard_hook_count = 0; +STATIC BOOLEAN g_blockio_start_record_bcd = FALSE; +STATIC BOOLEAN g_blockio_bcd_read_done = FALSE; + +EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *g_con_simple_input_ex = NULL; +STATIC EFI_INPUT_READ_KEY_EX g_org_read_key_ex = NULL; +STATIC EFI_INPUT_READ_KEY g_org_read_key = NULL; + +#if 0 +/* Block IO procotol */ +#endif + EFI_STATUS EFIAPI ventoy_block_io_reset ( IN EFI_BLOCK_IO_PROTOCOL *This, @@ -176,6 +188,14 @@ STATIC EFI_STATUS EFIAPI ventoy_read_iso_sector } } + if (g_blockio_start_record_bcd && FALSE == g_blockio_bcd_read_done) + { + if (*(UINT32 *)Buffer == 0x66676572) + { + g_blockio_bcd_read_done = TRUE; + } + } + return EFI_SUCCESS; } @@ -194,6 +214,14 @@ EFI_STATUS EFIAPI ventoy_block_io_ramdisk_read (VOID)MediaId; CopyMem(Buffer, (char *)g_chain + (Lba * 2048), BufferSize); + + if (g_blockio_start_record_bcd && FALSE == g_blockio_bcd_read_done) + { + if (*(UINT32 *)Buffer == 0x66676572) + { + g_blockio_bcd_read_done = TRUE; + } + } return EFI_SUCCESS; } @@ -548,7 +576,187 @@ EFI_STATUS EFIAPI ventoy_install_blockio(IN EFI_HANDLE ImageHandle, IN UINT64 Im return EFI_SUCCESS; } -EFI_STATUS EFIAPI ventoy_wrapper_file_open +#if 0 +/* For file replace */ +#endif + +STATIC EFI_STATUS EFIAPI +ventoy_wrapper_fs_open(EFI_FILE_HANDLE This, EFI_FILE_HANDLE *New, CHAR16 *Name, UINT64 Mode, UINT64 Attributes) +{ + (VOID)This; + (VOID)New; + (VOID)Name; + (VOID)Mode; + (VOID)Attributes; + return EFI_SUCCESS; +} + +STATIC EFI_STATUS EFIAPI +ventoy_wrapper_file_open_ex(EFI_FILE_HANDLE This, EFI_FILE_HANDLE *New, CHAR16 *Name, UINT64 Mode, UINT64 Attributes, EFI_FILE_IO_TOKEN *Token) +{ + return ventoy_wrapper_fs_open(This, New, Name, Mode, Attributes); +} + +STATIC EFI_STATUS EFIAPI +ventoy_wrapper_file_delete(EFI_FILE_HANDLE This) +{ + (VOID)This; + return EFI_SUCCESS; +} + +STATIC EFI_STATUS EFIAPI +ventoy_wrapper_file_set_info(EFI_FILE_HANDLE This, EFI_GUID *Type, UINTN Len, VOID *Data) +{ + return EFI_SUCCESS; +} + +STATIC EFI_STATUS EFIAPI +ventoy_wrapper_file_flush(EFI_FILE_HANDLE This) +{ + (VOID)This; + return EFI_SUCCESS; +} + +/* Ex version */ +STATIC EFI_STATUS EFIAPI +ventoy_wrapper_file_flush_ex(EFI_FILE_HANDLE This, EFI_FILE_IO_TOKEN *Token) +{ + (VOID)This; + (VOID)Token; + return EFI_SUCCESS; +} + + +STATIC EFI_STATUS EFIAPI +ventoy_wrapper_file_write(EFI_FILE_HANDLE This, UINTN *Len, VOID *Data) +{ + (VOID)This; + (VOID)Len; + (VOID)Data; + + return EFI_WRITE_PROTECTED; +} + +STATIC EFI_STATUS EFIAPI +ventoy_wrapper_file_write_ex(IN EFI_FILE_PROTOCOL *This, IN OUT EFI_FILE_IO_TOKEN *Token) +{ + return ventoy_wrapper_file_write(This, &(Token->BufferSize), Token->Buffer); +} + + +STATIC EFI_STATUS EFIAPI +ventoy_wrapper_file_close(EFI_FILE_HANDLE This) +{ + (VOID)This; + return EFI_SUCCESS; +} + + +STATIC EFI_STATUS EFIAPI +ventoy_wrapper_file_set_pos(EFI_FILE_HANDLE This, UINT64 Position) +{ + (VOID)This; + + g_efi_file_replace.CurPos = Position; + return EFI_SUCCESS; +} + +STATIC EFI_STATUS EFIAPI +ventoy_wrapper_file_get_pos(EFI_FILE_HANDLE This, UINT64 *Position) +{ + (VOID)This; + + *Position = g_efi_file_replace.CurPos; + + return EFI_SUCCESS; +} + + +STATIC EFI_STATUS EFIAPI +ventoy_wrapper_file_get_info(EFI_FILE_HANDLE This, EFI_GUID *Type, UINTN *Len, VOID *Data) +{ + EFI_FILE_INFO *Info = (EFI_FILE_INFO *) Data; + + debug("ventoy_wrapper_file_get_info ... %u", *Len); + + if (!CompareGuid(Type, &gEfiFileInfoGuid)) + { + return EFI_INVALID_PARAMETER; + } + + if (*Len == 0) + { + *Len = 384; + return EFI_BUFFER_TOO_SMALL; + } + + ZeroMem(Data, sizeof(EFI_FILE_INFO)); + + Info->Size = sizeof(EFI_FILE_INFO); + Info->FileSize = g_efi_file_replace.FileSizeBytes; + Info->PhysicalSize = g_efi_file_replace.FileSizeBytes; + Info->Attribute = EFI_FILE_READ_ONLY; + //Info->FileName = EFI_FILE_READ_ONLY; + + *Len = Info->Size; + + return EFI_SUCCESS; +} + +STATIC EFI_STATUS EFIAPI +ventoy_wrapper_file_read(EFI_FILE_HANDLE This, UINTN *Len, VOID *Data) +{ + EFI_LBA Lba; + UINTN ReadLen = *Len; + + (VOID)This; + + debug("ventoy_wrapper_file_read ... %u", *Len); + + if (g_efi_file_replace.CurPos + ReadLen > g_efi_file_replace.FileSizeBytes) + { + ReadLen = g_efi_file_replace.FileSizeBytes - g_efi_file_replace.CurPos; + } + + Lba = g_efi_file_replace.CurPos / 2048 + g_efi_file_replace.BlockIoSectorStart; + + ventoy_block_io_read(NULL, 0, Lba, ReadLen, Data); + + *Len = ReadLen; + + g_efi_file_replace.CurPos += ReadLen; + + return EFI_SUCCESS; +} + +STATIC EFI_STATUS EFIAPI +ventoy_wrapper_file_read_ex(IN EFI_FILE_PROTOCOL *This, IN OUT EFI_FILE_IO_TOKEN *Token) +{ + return ventoy_wrapper_file_read(This, &(Token->BufferSize), Token->Buffer); +} + +STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_procotol(EFI_FILE_PROTOCOL *File) +{ + File->Revision = EFI_FILE_PROTOCOL_REVISION2; + File->Open = ventoy_wrapper_fs_open; + File->Close = ventoy_wrapper_file_close; + File->Delete = ventoy_wrapper_file_delete; + File->Read = ventoy_wrapper_file_read; + File->Write = ventoy_wrapper_file_write; + File->GetPosition = ventoy_wrapper_file_get_pos; + File->SetPosition = ventoy_wrapper_file_set_pos; + File->GetInfo = ventoy_wrapper_file_get_info; + File->SetInfo = ventoy_wrapper_file_set_info; + File->Flush = ventoy_wrapper_file_flush; + File->OpenEx = ventoy_wrapper_file_open_ex; + File->ReadEx = ventoy_wrapper_file_read_ex; + File->WriteEx = ventoy_wrapper_file_write_ex; + File->FlushEx = ventoy_wrapper_file_flush_ex; + + return EFI_SUCCESS; +} + +STATIC EFI_STATUS EFIAPI ventoy_wrapper_file_open ( EFI_FILE_HANDLE This, EFI_FILE_HANDLE *New, @@ -629,3 +837,82 @@ EFI_STATUS EFIAPI ventoy_wrapper_push_openvolume(IN EFI_SIMPLE_FILE_SYSTEM_PROTO return EFI_SUCCESS; } +#if 0 +/* For auto skip Windows 'Press any key to boot from CD or DVD ...' */ +#endif + +STATIC EFI_STATUS EFIAPI ventoy_wrapper_read_key_ex +( + IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, + OUT EFI_KEY_DATA *KeyData +) +{ + /* only hook once before BCD file read */ + if (g_keyboard_hook_count == 0 && g_blockio_bcd_read_done == FALSE) + { + g_keyboard_hook_count++; + + KeyData->Key.ScanCode = SCAN_DELETE; + KeyData->Key.UnicodeChar = 0; + KeyData->KeyState.KeyShiftState = 0; + KeyData->KeyState.KeyToggleState = 0; + + return EFI_SUCCESS; + } + + return g_org_read_key_ex(This, KeyData); +} + +EFI_STATUS EFIAPI ventoy_wrapper_read_key +( + IN EFI_SIMPLE_TEXT_INPUT_PROTOCOL *This, + OUT EFI_INPUT_KEY *Key +) +{ + /* only hook once before BCD file read */ + if (g_keyboard_hook_count == 0 && g_blockio_bcd_read_done == FALSE) + { + g_keyboard_hook_count++; + + Key->ScanCode = SCAN_DELETE; + Key->UnicodeChar = 0; + return EFI_SUCCESS; + } + + return g_org_read_key(This, Key); +} + +EFI_STATUS ventoy_hook_keyboard_start(VOID) +{ + g_blockio_start_record_bcd = TRUE; + g_blockio_bcd_read_done = FALSE; + g_keyboard_hook_count = 0; + + if (g_con_simple_input_ex) + { + g_org_read_key_ex = g_con_simple_input_ex->ReadKeyStrokeEx; + g_con_simple_input_ex->ReadKeyStrokeEx = ventoy_wrapper_read_key_ex; + } + + g_org_read_key = gST->ConIn->ReadKeyStroke; + gST->ConIn->ReadKeyStroke = ventoy_wrapper_read_key; + + return EFI_SUCCESS; +} + +EFI_STATUS ventoy_hook_keyboard_stop(VOID) +{ + g_blockio_start_record_bcd = FALSE; + g_blockio_bcd_read_done = FALSE; + g_keyboard_hook_count = 0; + + if (g_con_simple_input_ex) + { + g_con_simple_input_ex->ReadKeyStrokeEx = g_org_read_key_ex; + } + + gST->ConIn->ReadKeyStroke = g_org_read_key; + + return EFI_SUCCESS; +} +